web-dev-qa-db-fra.com

mise en œuvre correcte de l'authentification "Windows" dans l'API Web?

J'ai créé une application Web Api 2 qui ne sera utilisée que sur le réseau d'entreprise. J'ai lu sur l'authentification Windows dans l'API Web, donc cela semble possible. Mais je dois trouver la bonne mise en œuvre pour cela. J'ai inclus le xml suivant dans mon Web.config:

<system.web>
  <authentication mode="Windows" />   
</system.web>

Il me semble que je me souviens d'un type de crochet d'événement dans une ancienne application de formulaires Web. Quelque chose comme BeginRequest () où un contrôle de sécurité pourrait être effectué avant le rendu d'une page. J'ai inclus la ligne de code suivante comme première ligne dans l'une de mes méthodes de contrôleur, mais la valeur retournée semble être simplement un objet vide sans aucune information significative:

var identity = HttpContext.Current.User.Identity as WindowsIdentity;

L'API Web 2 prend-elle en charge l'authentification Windows? Suis-je en train de manquer une étape? L'authentification Windows doit-elle fonctionner si je soumets une demande générale de Postman pour les tests? J'ai également essayé ce code mais j'ai obtenu un objet vide similaire:

var x = RequestContext.Principal;

Je me souviens vaguement d'un paramètre IIS comme "Activer la sécurité intégrée". Pouvez-vous s'il vous plaît spécifier le paramètre exact? Et serais-je en mesure de le faire si j'exécute l'application sur IIS Express?

MISE À JOUR

J'ai suivi les étapes pour IIS Express mentionné dans l'une des réponses ci-dessous, mais les exemples de code que j'ai fournis dans mon article d'origine n'ont toujours pas obtenu d'objet utilisateur rempli. J'ai également mis à jour applicationhost.config fichier pour désactiver l'authentification anonyme:

<anonymousAuthentication enabled="false" userName="" />

Après avoir fait cette mise à jour, j'ai soumis à nouveau ma demande de test via Postman mais j'obtiens l'erreur suivante:

    <h3>HTTP Error 401.2 - Unauthorized</h3>
    <h4>You are not authorized to view this page due to invalid authentication headers.</h4>
</div>
<div class="content-container">
    <fieldset>
        <h4>Most likely causes:</h4>
        <ul>
            <li>No authentication protocol (including anonymous) is selected in IIS.</li>
            <li>Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.</li>
            <li>Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.</li>
            <li>The Web server is not configured for anonymous access and a required authorization header was not received.</li>
            <li>The "configuration/system.webServer/authorization" configuration section may be explicitly denying the user access.</li>
        </ul>
    </fieldset>
</div>
<div class="content-container">
    <fieldset>
        <h4>Things you can try:</h4>
        <ul>
            <li>Verify the authentication setting for the resource and then try requesting the resource using that authentication method.</li>
            <li>Verify that the client browser supports Integrated authentication.</li>
            <li>Verify that the request is not going through a proxy when Integrated authentication is used.</li>
            <li>Verify that the user is not explicitly denied access in the "configuration/system.webServer/authorization" configuration section.</li>
            <li>Check the failed request tracing logs for additional information about this error. For more information, click 
                <a href="http://go.Microsoft.com/fwlink/?LinkID=66439">here</a>.
            </li>
        </ul>
    </fieldset>
</div>

Dois-je configurer ma demande Postman avec un certain type d'en-tête spécial pour que cela fonctionne?

7
user9393635

Si vous utilisez IIS Express , vous devez mettre à jour applicationhost.config fichier.

Il s'agit de la version de fichier de l'outil de configuration IIS où vous pouvez configurer le serveur Web lui-même. Vous pouvez trouver ce fichier dans le répertoire suivant:

%userprofile%\documents\iisexpress\config\applicationhost.config

ou

%userprofile%\my documents\iisexpress\config\applicationhost.config

Lorsque vous le trouvez, mettez-le à jour en tant que:

<windowsAuthentication enabled="true">
    <providers>
        <add value="Negotiate" />
        <add value="NTLM" />
    </providers>
</windowsAuthentication>

Pour IIS:

  1. Sélectionnez votre application
  2. Double clic - 'Authentification'
  3. Activer l'authentification Windows
  4. Redémarrez IIS Server

Vérifiez ceci pour plus détails

5
Hussein Salman

En plus des réponses précédentes, nous devons également passer informations d'identification dans les demandes multi-origines.

Côté serveur (API Web):

Définissez la propriété SupportsCredentials sur true sur le [EnableCors] attribut:

[EnableCors(origins: "http://exampleclient.com", headers: "*", 
methods: "*", SupportsCredentials = true)]

Côté client (UI):

Définissez XMLHttpRequest.withCredentials sur true.

jQuery:

$.ajax({
  type: 'get',
  url: 'http://www.example.com/api/auth',
  xhrFields: {
    withCredentials: true
  }

Angulaire:

this.http.get('http://www.example.com/api/auth', { withCredentials: true }).subscribe((resp: any) => {
  console.log(resp)
}

XMLHttpRequest:

var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/auth');
xhr.withCredentials = true;
4
Adrita Sharma

Authentification Windows qui utilise l'utilisateur du domaine local et qui est destinée aux sites intranet.

Exemple :

J'ai implémenté une méthode/action TestAuthentication avec un chemin d'accès fixe. Pour la démo, je n'inclus pas encore les attributs Autoriser. Le code vérifie la propriété User de ApiController. Il contient les mêmes données que Thread.CurrentPrincipal ou HttpContext.Current.User. Assurez-vous que l'authentification anonyme dans IIS est désactivée sinon le Identity.Name sera vide.

public class WinAuthController : ApiController
{
    [HttpGet]
    [Route("api/testauthentication")]
    public IHttpActionResult TestAutentication()
    {
        Debug.Write("AuthenticationType:" + User.Identity.AuthenticationType);
        Debug.Write("IsAuthenticated:" + User.Identity.IsAuthenticated);
        Debug.Write("Name:" + User.Identity.Name);

        if (User.Identity.IsAuthenticated)
        {
            return Ok("Authenticated: " + User.Identity.Name);
        }
        else
        {
            return BadRequest("Not authenticated");
        }
    }
}

Dans le fichier Web.config:

<system.web>
   <authentication mode="Windows" />
 </system.web> 

Dans IE vous pouvez vérifier le paramètre avec Outils> Options Internet> Avancé et rechercher un paramètre Activer l'authentification intégrée de Windows. Lorsque vous allez dans l'onglet Sécurité, puis Intranet et Niveau personnalisé, alors vous recherchez un paramètre en bas pour spécifier si IE doit se connecter automatiquement ou Demander le nom d'utilisateur et le mot de passe.

enter image description here

Veuillez visiter le lien ci-dessous, il contient les étapes appropriées à suivre pour l'authentification Windows de l'API WEP:

http://www.scip.be/index.php?Page=ArticlesNET38&Lang=EN

3
Mrunalini

Vous trouverez ci-dessous les étapes de configuration de l'authentification Windows dans l'API Web pour le serveur local et le serveur (IIS).

1) pour les locaux:

a) Pour créer un projet d'API Web en mode d'authentification Windows, suivez les étapes ci-dessous:

Après avoir choisi Application Web ASP.Net, sélectionnez modèle d'API Web et sur le côté droit, cliquez sur le bouton Modifier l'authentification et sélectionnez Authentification Windows.

b) Pour un projet d'API Web existant, ajoutez simplement les lignes suivantes dans votre applicationhost.config fichier.

<location path="YourProjectName">
        <system.webServer>
            <security>
                <authentication>
                    <anonymousAuthentication enabled="false" />
                    <windowsAuthentication enabled="true" />
                </authentication>
            </security>
        </system.webServer>
    </location>

2) Pour le serveur (IIS)

Pour exécuter l'authentification Windows après avoir hébergé l'application dans IIS ajoutez simplement les lignes suivantes dans votre web.config fichier à l'intérieur du nœud:

<authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="?" />
      <deny users="?" />
    </authorization>

Dans les deux cas, utilisez simplement les lignes suivantes dans votre code pour que l'authentification Windows fonctionne correctement:

if(User.Identity.IsAuthenticated)
{
    //do work
}
2
SUBHAJIT GANGULI