Je travaille avec l'application ASP.NET Core. J'essaye d'implémenter l'authentification basée sur les jetons mais je ne peux pas comprendre comment utiliser le nouveau système de sécurité pour mon cas. J'ai parcouru des exemples mais ils ne m'ont pas beaucoup aidé, ils utilisent soit l'authentification par cookie, soit l'authentification externe (GitHub, Microsoft, Twitter).
Quel est mon scénario: l'application angularjs devrait demander l' /token
URL en passant le nom d'utilisateur et le mot de passe. WebApi doit autoriser l'utilisateur et renvoyer access_token
ce qui sera utilisé par l'application angularjs dans les demandes suivantes.
J'ai trouvé un excellent article sur la mise en œuvre exactement de ce dont j'ai besoin dans la version actuelle d'ASP.NET - Authentification basée sur les jetons à l'aide de l'API Web ASP.NET 2, Owin et Identity . Mais il n'est pas évident pour moi de faire la même chose dans ASP.NET Core.
Ma question est la suivante: comment configurer l'application ASP.NET Core WebApi pour qu'elle fonctionne avec l'authentification basée sur les jetons?
la source
Réponses:
Mise à jour pour .Net Core 3.1:
David Fowler (architecte de l'équipe ASP .NET Core) a mis en place un ensemble incroyablement simple d'applications de tâches, y compris une application simple démontrant JWT . J'incorporerai bientôt ses mises à jour et son style simpliste à cet article.
Mis à jour pour .Net Core 2:
Les versions précédentes de cette réponse utilisaient RSA; ce n'est vraiment pas nécessaire si votre même code qui génère les jetons vérifie également les jetons. Cependant, si vous répartissez la responsabilité, vous souhaiterez probablement toujours le faire en utilisant une instance de
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Créez quelques constantes que nous utiliserons plus tard; voici ce que j'ai fait:
Ajoutez ceci à votre Startup.cs
ConfigureServices
. Nous utiliserons l'injection de dépendances plus tard pour accéder à ces paramètres. Je suppose que votreauthenticationConfiguration
est un objetConfigurationSection
ouConfiguration
tel que vous pouvez avoir une configuration différente pour le débogage et la production. Assurez-vous de conserver votre clé en toute sécurité! Cela peut être n'importe quelle chaîne.J'ai vu d'autres réponses modifier d'autres paramètres, tels que
ClockSkew
; les valeurs par défaut sont définies de telle sorte que cela devrait fonctionner pour les environnements distribués dont les horloges ne sont pas exactement synchronisées. Ce sont les seuls paramètres que vous devez modifier.Configurez l'authentification. Vous devriez avoir cette ligne avant tout middleware nécessitant vos
User
informations, tel queapp.UseMvc()
.Notez que cela n'entraînera pas l'émission de votre token avec le
SignInManager
ou quoi que ce soit d'autre. Vous devrez fournir votre propre mécanisme de sortie de votre JWT - voir ci-dessous.Vous souhaiterez peut-être spécifier un fichier
AuthorizationPolicy
. Cela vous permettra de spécifier des contrôleurs et des actions qui n'autorisent que les jetons Bearer comme authentification à l'aide de[Authorize("Bearer")]
.Voici la partie délicate: la construction du jeton.
Ensuite, dans votre contrôleur où vous voulez votre jeton, quelque chose comme ce qui suit:
Ici, je suppose que vous avez déjà un directeur. Si vous utilisez Identity, vous pouvez utiliser
IUserClaimsPrincipalFactory<>
pour transformer votreUser
en unClaimsPrincipal
.Pour tester : Obtenir un jeton, mettre en forme à jwt.io . Les instructions que j'ai fournies ci-dessus vous permettent également d'utiliser le secret de votre config pour valider la signature!
Si vous l'avez rendu dans une vue partielle sur votre page HTML en combinaison avec l'authentification au porteur uniquement dans .Net 4.5, vous pouvez maintenant utiliser a
ViewComponent
pour faire de même. C'est essentiellement le même que le code d'action du contrôleur ci-dessus.la source
IOptions<OAuthBearerAuthenticationOptions>
pour utiliser les options; l'utilisation directe d'un objet Options n'est pas prise en charge en raison de la configuration nommée prise en charge par l'infrastructure du modèle d'options.À partir de la fabuleuse réponse de Matt Dekrey , j'ai créé un exemple pleinement fonctionnel d'authentification basée sur des jetons, fonctionnant avec ASP.NET Core (1.0.1). Vous pouvez trouver le code complet dans ce référentiel sur GitHub (branches alternatives pour 1.0.0-rc1 , beta8 , beta7 ), mais en bref, les étapes importantes sont:
Générez une clé pour votre application
Dans mon exemple, je génère une clé aléatoire à chaque fois que l'application démarre, vous devrez en générer une et la stocker quelque part et la fournir à votre application. Consultez ce fichier pour savoir comment je génère une clé aléatoire et comment vous pouvez l'importer à partir d'un fichier .json . Comme suggéré dans les commentaires de @kspearrin, l' API de protection des données semble être un candidat idéal pour gérer les clés "correctement", mais je n'ai pas encore déterminé si c'est possible. Veuillez soumettre une demande d'extraction si vous y parvenez!
Startup.cs - ConfigureServices
Ici, nous devons charger une clé privée avec laquelle nos jetons doivent être signés, que nous utiliserons également pour vérifier les jetons tels qu'ils sont présentés. Nous stockons la clé dans une variable de niveau classe
key
que nous réutiliserons dans la méthode Configure ci-dessous. TokenAuthOptions est une classe simple qui contient l'identité de signature, l'audience et l'émetteur dont nous aurons besoin dans le TokenController pour créer nos clés.Nous avons également mis en place une politique d'autorisation pour nous permettre d'utiliser
[Authorize("Bearer")]
sur les points de terminaison et les classes que nous souhaitons protéger.Startup.cs - Configurer
Ici, nous devons configurer le JwtBearerAuthentication:
TokenController
Dans le contrôleur de jetons, vous devez disposer d'une méthode pour générer des clés signées à l'aide de la clé chargée dans Startup.cs. Nous avons enregistré une instance TokenAuthOptions dans Startup, nous devons donc l'injecter dans le constructeur de TokenController:
Ensuite, vous devrez générer le jeton dans votre gestionnaire pour le point de terminaison de connexion, dans mon exemple, je prends un nom d'utilisateur et un mot de passe et je valide ceux à l'aide d'une instruction if, mais la chose clé que vous devez faire est de créer ou de charger une revendication -based identité et générer le jeton pour cela:
Et ça devrait être ça. Ajoutez simplement
[Authorize("Bearer")]
à n'importe quelle méthode ou classe que vous souhaitez protéger, et vous devriez obtenir une erreur si vous essayez d'y accéder sans jeton présent. Si vous souhaitez renvoyer une erreur 401 au lieu d'une erreur 500, vous devrez enregistrer un gestionnaire d'exceptions personnalisé comme je l'ai dans mon exemple ici .la source
Vous pouvez consulter les exemples de connexion OpenId qui illustrent comment gérer différents mécanismes d'authentification, y compris les jetons JWT:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Si vous regardez le projet Cordova Backend, la configuration de l'API est la suivante:
La logique dans /Providers/AuthorizationProvider.cs et le RessourceController de ce projet valent également la peine d'être examinés;).
Vous pouvez également utiliser le code suivant pour valider les jetons (il existe également un extrait de code pour le faire fonctionner avec signalR):
Pour émettre un jeton, vous pouvez utiliser les packages de serveur openId Connect comme suit:
EDIT: J'ai implémenté une application d'une seule page avec une implémentation d'authentification basée sur des jetons à l'aide du framework frontal Aurelia et du noyau ASP.NET. Il existe également un signal R de connexion persistante. Cependant, je n'ai fait aucune implémentation DB. Le code peut être vu ici: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
J'espère que cela t'aides,
Meilleur,
Alex
la source
Jetez un œil à OpenIddict - c'est un nouveau projet (au moment de la rédaction) qui facilite la configuration de la création de jetons JWT et l'actualisation des jetons dans ASP.NET 5. La validation des jetons est gérée par d'autres logiciels.
En supposant que vous utilisez
Identity
avecEntity Framework
, la dernière ligne est ce que vous ajouteriez à votreConfigureServices
méthode:Dans
Configure
, vous configurez OpenIddict pour servir les jetons JWT:Vous configurez également la validation des jetons dans
Configure
:Il y a une ou deux autres choses mineures, telles que votre DbContext doit dériver d'OpenIddictContext.
Vous pouvez voir une explication complète sur ce billet de blog: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Une démo fonctionnelle est disponible sur: https://github.com/capesean/openiddict-test
la source