web-dev-qa-db-fra.com

Activer à la fois l'authentification Windows et l'authentification anonyme dans une application ASP.NET Core

Je sais que cela a été posé plusieurs fois auparavant, mais malheureusement pas sur les applications Web ASP.NET Core, juste les applications Web ASP.NET classiques. Toutes les réponses que j'ai trouvées sur Internet ne m'aident pas, car la configuration IIS des applications ASP.NET Core est tellement différente de celle d'ASP.NET classique. Par exemple, ASP.NET Core utilise le proxy Kestrel, donc la plupart des configurations pertinentes dans ASP.NET ne sont pas dans ASP.NET Core. J'ai essentiellement essayé tout ce que je pouvais trouver sur Internet mais aucune ne m'a aidé. Je souhaite que ce soit aussi simple que d'activer authentifications à la fois anonymes et Windows sur l'application en IIS et c'est tout, mais je suppose que cela fonctionnera plus que cela.

Quelle est la procédure d'activation de ces deux authentifications dans une seule application Web principale asp.net?

14
ashilon

IIS agira en tant que proxy inverse et sera responsable de la définition et de la transmission à Kestrel de l'identité Windows de l'utilisateur. Alors d'abord, configurez IIS pour autoriser à la fois Windows et l'authentification anonyme:

enter image description here

Ensuite, vous devez modifier votre web.config pour demander à IIS de transmettre l'identité de Windows (au cas où une est trouvée) à votre application ASP.NET Core comme ça: https: //stackoverflow.com/a/42163175/682724

À ce stade, si vous créez une action de contrôleur avec un attribut "[Autoriser]", HttpContext.User.Identity.Name; doit avoir la valeur de l'identité Windows utilisée par votre client. J'ai répondu à quelque chose de similaire ici: authentification NTLM sur une route spécifique dans ASP.NET Core

La bonne chose est qu'une action de contrôleur standard fonctionnera toujours si votre client ne transmet pas le jeton d'identité Windows, tandis qu'une action protégée (en utilisant la balise [Authorize]) échouera.

PS: J'aime utiliser curl.exe en mode verbeux pour voir ce qui se passe en termes de protocole d'autorisation (protocole de négociation, jetons NTLM ...)

21
Daboul

J'ai un scénario similaire pour une application ASP.NET Core 2.0 (utilisez l'authentification Windows dans toute l'application sauf un seul contrôleur) et l'explication de Daboul n'était pas suffisante.

J'ai dû mettre en place un middleware personnalisé comme indiqué ici depuis l'anonymat a priorité .

Le middleware

public class NtlmAndAnonymousSetupMiddleware
{
    private readonly RequestDelegate next;

    public NtlmAndAnonymousSetupMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated || context.Request.Path.ToString().StartsWith("/Anonymous"))
        {
            await next(context);
            return;
        }

        await context.ChallengeAsync("Windows");
    }

}

et son utilisation dans Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();

    // other code here
}

Ainsi, le middleware accepte uniquement les demandes anonymes pour AnonymousController et fournira un défi si les informations d'authentification Windows ne sont pas fournies.

Contrôleur anonyme

Étant donné que le middleware fait la différence entre ce qui est anonyme et nécessite une authentification, cela ressemblera à tout contrôleur ordinaire:

[Route("Anonymous")]
public class AnonymousController : Controller
{
    [HttpGet("Echo")]
    public string Echo(string data)
    {
        return data;
    }
}

Les tests

(tout est fait sur une machine Windows)

  1. Chrome + accéder à l'action du contrôleur non anonyme => fonctionne bien (les deux @User.Identity.Name et @Context.User.Identity.Name renvoie l'utilisateur correct

  2. Chrome + action anonyme => fonctionne directement

  3. Firefox (qui ne transfère pas directement le ticket NTLM à partir du système d'exploitation) + non anonyme => un modal demande l'utilisateur/pass => si fourni correctement, cela fonctionne bien

  4. Firefox + action anonyme => fonctionne directement

5
Alexei