91 votes

Middleware d'authentification ASP.NET Core 2.0

Avec Core 1.1 suivi @blowdart les conseils et la mise en œuvre d'une coutume middleware:

https://stackoverflow.com/a/31465227/29821

Il a travaillé comme ceci:

  1. Middleware couru. Ramassé un jeton de la demande des en-têtes.
  2. Vérifié le jeton et si valide construit une identité (ClaimsIdentity), qui contenait plusieurs des revendications qui, ensuite, il a ajouté via HttpContext.De l'utilisateur.AddIdentity();
  3. Dans ConfigureServices l'utilisation des services.AddAuthorization j'ai ajouté une politique exigeant la demande qui est fourni par le middleware.
  4. Dans les contrôleurs/actions que je ne puis utilisez [Autoriser(Rôles = "un rôle que le middleware ajouté")]

Un peu cela fonctionne avec la 2.0, sauf si le jeton n'est pas valide (étape 2 ci-dessus) et de la réclamation n'est jamais ajouté-je obtenir "Pas de authenticationScheme a été spécifié, et il n'y avait pas DefaultChallengeScheme trouvé."

Alors maintenant, je suis en train de lire que auth changé dans la version 2.0:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Quel est le bon chemin pour moi de faire la même chose dans ASP.NET Core 2.0? Je ne vois pas un exemple à ne vraiment d'authentification personnalisée.

201voto

Zac Points 1743

Alors, après une longue journée à essayer de résoudre ce problème, j'ai enfin compris comment Microsoft veut nous faire de la coutume de l'authentification des gestionnaires pour leur nouveau single-middleware d'installation dans le noyau 2.0.

Après en regardant à travers une partie de la documentation sur MSDN, j'ai trouvé une classe appelée AuthenticationHandler<TOption> qui implémente l' IAuthenticationHandler interface.

À partir de là, j'ai trouvé l'ensemble d'une base de code existante schémas d'authentification situé à https://github.com/aspnet/Security

À l'intérieur de l'un de ces, il montre comment Microsoft implémente les JwtBearer schéma d'authentification. (https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer)

J'ai copié la plupart de ce code dans un nouveau dossier, et effacé toutes les choses ayant à voir avec JwtBearer.

Dans l' JwtBearerHandler de la classe (qui s'étend AuthenticationHandler<>), il y a un remplacement pour Task<AuthenticateResult> HandleAuthenticateAsync()

J'ai ajouté dans notre ancien middleware pour la mise en place des réclamations par le biais d'un token personnalisé serveur, et était toujours face à quelques problèmes avec les autorisations, tout en crachant un 200 OK au lieu de 401 Unauthorized lorsqu'un jeton n'était pas valide et aucune réclamation ont été mis en place.

J'ai réalisé que j'avais remplacé Task HandleChallengeAsync(AuthenticationProperties properties) qui, pour quelque raison que ce soit est utilisé pour définir des autorisations via [Authorize(Roles="")] dans un contrôleur.

Après la suppression de cette substitution, le code a fonctionné, et avait réussi à jeter un 401 lorsque les autorisations ne correspondent pas.

Le principal à retenir de cela, c'est que maintenant vous ne pouvez pas utiliser un middleware, vous avez à mettre en œuvre par AuthenticationHandler<> et vous devez régler l' DefaultAuthenticateScheme et DefaultChallengeScheme lors de l'utilisation d' services.AddAuthentication(...).

Voici un exemple de ce à quoi cela ressemble:

En Démarrage.cs / ConfigureServices (), ajoutez:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

En Démarrage.cs / Configure (), ajoutez:

app.UseAuthentication();

Créer un nouveau fichier CustomAuthExtensions.cs

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

Créer un nouveau fichier CustomAuthOptions.cs

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

Créer un nouveau fichier CustomAuthHandler.cs

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

4voto

Kevin Junghans Points 10012

Il y a énormément de changements dans l'Identité du Noyau 1.x Core 2.0 comme l'article que vous avez des points de référence de sortir. Le changement majeur est de vous éloigner de l'intergiciel en approche et à l'aide de l'injection de dépendance pour configurer des services personnalisés. Cette offre beaucoup plus de flexibilité dans la personnalisation de l'Identité pour plus d'implémentations complexes. Si vous voulez vous éloigner de la middleware approche que vous mentionnez ci-dessus et d'aller vers des services. Suivez les étapes de migration dans l'article référencé d'atteindre cet objectif. Commencer par le remplacement de l' application.UseIdentity avec application.UseAuthentication. UseIdentity est déprécié et ne sera pas pris en charge dans les versions futures. Pour un exemple complet de comment insérer un personnalisé demandes de transformation et de procéder à l'autorisation sur la demande vue sur ce blog.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X