web-dev-qa-db-fra.com

Authentification Windows et anonyme dans .Net Core 2.0

J'essaie de mélanger les authentifications Windows et Anonymous dans une application Web vide .Net Core 2.0. Je voudrais éviter l'attribut [Authorize], car je ne souhaite pas utiliser MVC ni les contrôleurs.

Ma configuration est la suivante:

  1. J'ai créé une application Web .Net Core 2.0 vide

  2. Je suis allé dans les propriétés du projet -> Débogage -> Coché "Activer l'authentification Windows" et désactivé "Activer l'authentification anonyme" . Maintenant "windowsAuthentication": true et "anonymousAuthentication": false sont apparus dans le fichier launchSettings.json sous "IIS".

  3. Dans Startup.cs, dans ConfigureServices, j'ai ajouté services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme); comme indiqué dans https://docs.Microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x#windows- authentication-httpsys - iisintegration

  4. J'ai ajouté un simple Console.WriteLine(context.User.Identity.Name); pour voir que cela fonctionne dans app.Run et ... Tout fonctionne!

Cependant ... dès que je règle "anonymousAuthentication" sur true dans launchSettings.json, cela cesse de fonctionner et je ne peux pas comprendre ce que je peux faire pour que l'authentification Windows fonctionne avec elle. Context.User.Identity.IsAuthenticated est toujours faux . Comme vous pouvez le voir, ma configuration est très simple et j'en ai besoin pour rester ainsi. Je souhaite activer/désactiver l'authentification Windows sur certaines routes dynamiques. Par conséquent, l'utilisation de contrôleurs dotés de l'attribut [Autoriser] n'est pas une option.

Ce que j'essaie de réaliser est une application simple où l'URL "/ authentifié" répondra avec la valeur context.User.Identity.Name et l'URL "/ public" répondra avec quelque chose comme: "Ceci est une page publique!" . Quelque chose de similaire à Authentification NTLM sur une route spécifique dans ASP.NET Core mais sans l'attribut [Autoriser] et les contrôleurs . Les ressources sont très rares ... Quelqu'un a-t-il une idée de ce que je pourrais manquer? Merci!

10
Ted Chirvasiu

Anonymous a la priorité. Vous devez appeler httpContext.ChallengeAsync () lorsque vous recevez une demande anonyme pour une partie restreinte de votre application. Cela obligera le client à envoyer des informations d'identification lors de la prochaine demande. Voici un test qui fait cela .

8
Tratcher

La réponse de Tratcher m'a sauvé après une perte de temps sur ce sujet. Pour un scénario très simple (contrôleur anonyme + authentification Windows restreinte dans le reste), voici un démarrage rapide (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");
    }

}

Je viens de le brancher au début de la méthode Startup.Configure:

app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();
0
Alexei