web-dev-qa-db-fra.com

Désactiver l'authentification Windows pour l'API Web

Je joue avec une application MVC4 et j'utilise WebAPI pour récupérer/envoyer toutes mes données. Dans un contrôleur, j'utilise une demande HttpClient pour obtenir les données et tout fonctionne bien. Le problème auquel je suis confronté est que lorsque l'authentification Windows est activée dans le projet, les appels d'API Web renvoient une erreur 401 non autorisée.

le code dans mon contrôleur qui fait l'appel est:

using (var client = new HttpClient())
{
    var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl(
        "DefaultApi",
        new { controller = "InvoiceDetails", id = id }
     );

     var result = client.GetAsync(invoiceDetailUrl).Result; 

 }

L'authentification Windows doit être activée pour le site, mais pas nécessairement les contrôleurs d'API Web. J'ai essayé d'exclure les contrôleurs API dans le web.config comme ci-dessous:

<location path="api">
        <system.web>
            <authorization>
                <allow users="*"/>
        </authorization>
    </system.web>
</location>

mais les ajouts au web.config n'ont rien fait.

Aucune suggestion?

46
ncbl

Authentification

L'API Web suppose que l'authentification a lieu dans l'hôte. IIS utilise des modules HTTP pour l'authentification. Asp.net vous permet désormais de configurer via web.config n'importe quel module d'authentification intégré à IIS ou ASP.NET ou écrivez votre propre module HTTP pour effectuer une authentification personnalisée.

enter image description here

Vous pouvez utiliser plusieurs authentifications en même temps, ce n'est pas un problème. Dans votre cas, vous avez besoin de l'authentification Windows et de l'authentification anonyme . L'authentification Windows sécurisée votre site Web, et l'authentification anonyme ouverte votre API Web.

Configurer l'authentification dans IIS

Hébergement sur IIS Express Ouvrez le volet Propriétés (via F4 et non les propriétés du projet), et appliquez ce que vous souhaitez Authentification Réglez "Authentification anonyme" sur "Désactivé". Réglez "Authentification Windows" sur "Activé".

Hébergement sur IIS 7 ou version ultérieure Dans IIS Manager, ouvrez la fonction d'authentification) dans la vue des fonctionnalités. Activer/désactiver l'authentification souhaitée. Si un système d'authentification n'est pas une option (comme Windows), vous devrez l'installer via le Gestionnaire de serveur (Ajouter des services de rôle).

Autorisation

Autorisation asp.net

Dans ASP.NET, il existe deux façons d'autoriser l'accès à une ressource donnée: autorisation de fichier et d'URL. Je ne l'expliquerai pas ici mais vous pouvez lire ceci article .

L'important est que vous puissiez autoriser/refuser des utilisateurs et/ou des groupes dans web.config.

La configuration par défaut dans l'authentification Windows est d'autoriser uniquement les utilisateurs d'authentification *****, comme ceci:

<authorization>
<deny users="?" ></deny>
</authorization>

Si vous souhaitez autoriser les utilisateurs anonymes ? sous l'emplacement d'URL "api", ajoutez ceci:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

Autorisation Web Api

asp.net Web Api Authorization se produit plus tard dans le pipeline, plus près du contrôleur. Cela vous permet de faire des choix plus précis lorsque vous accordez l'accès aux ressources.

L'API Web fournit un filtre d'autorisation intégré, AuthorizeAttribute . Il y a aussi un AllowAnonymousAttribute . Vous pouvez l'utiliser globalement, sur un contrôleur ou sur une action. Par défaut, toutes les actions sont autorisées.

Test d'Api

Via le navigateur

L'authentification Windows intégrée fonctionne avec tout navigateur prenant en charge le schéma d'authentification Negotiate. C'est le cas pour Internet Explorer et maintenant Chrome: ils fourniront automatiquement les informations d'identification Windows lors de la navigation sur un site Web avec l'authentification Windows. Firefox ne prend pas en charge ce schéma, donc je teste souvent l'authentification avec ce navigateur.

Via HttpClient Votre HttpClient doit fournir des informations d'identification lors de l'appel de l'API Web (comme les navigateurs). Cela se fait en configurant un HttpClientHandler avec les informations d'identification appropriées.

//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true
};

//use username/password credentials
HttpClient client = new HttpClient(handler);

var handler = new HttpClientHandler {
    Credentials = new NetworkCredential(username, password)
};

var httpClient = new HttpClient(handler);

J'espère que ceci vous aidera.

Une dernière chose importante dans votre cas, c'est que votre Web Api ne permet pas du tout aux utilisateurs anonymes ! Étant donné que vous utilisez Informations d'identification par défaut dans votre HttpClientHandler, cela signifie que votre service nécessite une authentification Windows. Vous n'avez pas à configurer d'informations d'identification dans un service ouvert et public.

71
Cybermaxs

Je suis tombé sur cette question en essayant de faire quelque chose de très similaire et je voulais ajouter à la réponse donnée ci-dessus. Je n'ai pas trouvé beaucoup d'informations détaillées sur la façon de procéder. Juste des morceaux partout sur le Web. J'espère donc que cela ajoutera à ce qui existe.

J'ai une application MVC4 qui a une partie WebAPI. L'application MVC doit utiliser Windows Auth, mais la partie WebAPI doit être anonyme et désactiver Windows Auth. Alors que la solution ci-dessus fonctionnait pour ncbl, elle ne fonctionnait pas pour moi car dans mon scénario, je n'utilisais pas de code pour gérer les informations d'identification. Dans mon scénario, je voulais un web.config ou une solution basée sur IIS. J'ai commencé avec la solution web.config de Cybermaxs et je l'ai ajoutée. Voici ce que j'ai fini avec.

<!-- Configure the virtual path api -->
<!-- This section is like a mini-web.config for the virtual path -->
<location path="api">
    <system.web>
        <authorization>
            <!-- All anonymous users access to the virtual path api -->
            <allow users="?" />
        </authorization>
    </system.web>
    <!-- Need to include the security overrides else it will inherit from the root of the application -->
    <system.webServer>
        <security>
            <authentication>
                <!-- Need to enable anonymous access and turn off Windows authentication for the virtual path -->
                <anonymousAuthentication enabled="true"/>
                <windowsAuthentication enabled="false"/>
            </authentication>
        </security>
    </system.webServer>
</location>

La clé pour moi était d'ajouter le <system.webServer> section au web.config afin que je puisse remplacer l'authentification pour ce chemin virtuel. J'ai essayé de le faire dans IIS, mais comme il s'agissait d'un chemin virtuel, c'est-à-dire que/api n'existe pas sur le serveur Web, cela n'a pas été possible pour moi.

Remarque: Attention, IIS peut avoir un fichier de configuration à un niveau de configuration supérieur qui verrouille le <authentication>, comme dans l'application.config ou machine.config. Un élément peut avoir l'attribut allowOverride défini sur false. J'obtenais une erreur HTTP 500.19 (HRESULT: 0x80070021) au début et j'ai dû aller dans le fichier application.config pour changer cet attribut. J'ai trouvé plus de détails sur cette erreur ici .

Une fois que j'ai eu cette section supplémentaire dans le <location> section de mon web.config je me suis assuré de décorer mon contrôleur api avec [AllowAnonymous]. Alors bam ... tout a commencé à fonctionner.

C'est ainsi que j'ai configuré l'authentification et l'autorisation pour la racine de mon application.

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <!-- Deny all anonymous users at the root of the application -->
    <deny users="?" />
  </authorization>
</system.web>
23
Notorious2tall

Voici ce que je devais faire:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>
3
jhilden