Avec Core 1.1, suivez les conseils de @ blowdart et implémentez un middleware personnalisé:
https://stackoverflow.com/a/31465227/29821
Cela a fonctionné comme ceci:
- L'intergiciel a fonctionné. Ramassé un jeton dans les en-têtes de la demande.
- Vérifié le jeton et s'il est valide, construit une identité (ClaimsIdentity) qui contenait plusieurs revendications qu'il a ensuite ajoutées via HttpContext.User.AddIdentity ();
- Dans ConfigureServices using services.AddAuthorization, j'ai ajouté une stratégie pour exiger la revendication fournie par le middleware.
- Dans les contrôleurs / actions, j'utiliserais alors [Authorize (Roles = "some role that the middleware added")]
Cela fonctionne quelque peu avec la version 2.0, sauf que si le jeton n'est pas valide (étape 2 ci-dessus) et que la revendication n'est jamais ajoutée, j'obtiens "Aucun authenticationScheme n'a été spécifié et aucun DefaultChallengeScheme n'a été trouvé."
Alors maintenant, je lis que l'authentification a changé en 2.0:
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
Quel est le bon chemin pour moi pour faire la même chose dans ASP.NET Core 2.0? Je ne vois pas d'exemple pour faire une authentification vraiment personnalisée.
Réponses:
Ainsi, après une longue journée à essayer de résoudre ce problème, j'ai enfin compris comment Microsoft veut que nous créions des gestionnaires d'authentification personnalisés pour leur nouvelle configuration de middleware unique dans le noyau 2.0.
Après avoir parcouru 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é une base de code entière avec les schémas d'authentification existants situés à https://github.com/aspnet/Security
À l'intérieur de l'un d'entre eux, il montre comment Microsoft implémente le schéma d'authentification JwtBearer. ( 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é tout ce qui s'y rapporte
JwtBearer
.Dans la
JwtBearerHandler
classe (qui s'étendAuthenticationHandler<>
), il y a un remplacement pourTask<AuthenticateResult> HandleAuthenticateAsync()
J'ai ajouté notre ancien middleware pour la configuration des revendications via un serveur de jetons personnalisé, et je rencontrais toujours des problèmes avec les autorisations, crachant simplement un
200 OK
au lieu d'un401 Unauthorized
lorsqu'un jeton était invalide et qu'aucune revendication n'était configurée.J'ai réalisé que j'avais remplacé
Task HandleChallengeAsync(AuthenticationProperties properties)
ce qui, pour une raison quelconque, est utilisé pour définir les autorisations via[Authorize(Roles="")]
un contrôleur.Après avoir supprimé ce remplacement, le code avait fonctionné et avait réussi à lancer un
401
lorsque les autorisations ne correspondaient pas.Le principal à retenir est que vous ne pouvez plus utiliser d'intergiciel personnalisé, vous devez l'implémenter via
AuthenticationHandler<>
et vous devez définir leDefaultAuthenticateScheme
etDefaultChallengeScheme
lors de l'utilisationservices.AddAuthentication(...)
.Voici un exemple de ce à quoi tout cela devrait ressembler:
Dans Startup.cs / ConfigureServices (), ajoutez:
Dans Startup.cs / Configure (), ajoutez:
Créer un nouveau fichier CustomAuthExtensions.cs
Créer un nouveau fichier CustomAuthOptions.cs
Créer un nouveau fichier CustomAuthHandler.cs
la source
DefaultAuthenticateScheme
etDefaultChallengeScheme
? Je ne comprends pas pourquoi ils sont tous les deux utilisés? et quelles sont les différences entre eux.AuthExtension
être à l'intérieur de l'Microsoft.Extensions.DependencyInjection
espace de noms. Voir cet exemple: github.com/aspnet/Security/blob/rel/2.0.0/src/…Il y a des changements considérables dans l'identité de Core 1.x à Core 2.0 comme le souligne l'article que vous référencez. Le changement majeur consiste à s'éloigner de l'approche middleware et à utiliser l'injection de dépendances pour configurer des services personnalisés. Cela offre beaucoup plus de flexibilité dans la personnalisation de l'identité pour des implémentations plus complexes. Vous souhaitez donc vous éloigner de l'approche middleware que vous avez mentionnée ci-dessus et vous diriger vers les services. Suivez les étapes de migration de l'article référencé pour atteindre cet objectif. Commencez par remplacer app.UseIdentity par app.UseAuthentication . UseIdentity est déprécié et ne sera plus pris en charge dans les versions futures. Pour un exemple complet de la façon d'insérer une transformation de revendication personnalisée et d'exécuter une autorisation sur la revendicationvoir ce billet de blog .
la source