Jeton d'Authentification Basée en ASP.NET de Base
Je travaille avec ASP.NET application de Base. Je suis en train de mettre en œuvre Jeton d'Authentification Basée sur les, mais ne peut pas comprendre comment utiliser les nouvelles Système De Sécurité pour mon cas.
Je suis passé par exemples mais ils ne m'aide pas beaucoup, ils sont soit en utilisant l'authentification par cookie ou l'authentification externe (GitHub, Microsoft, Twitter).
Ce que mon scénario est: angularjs application doit demander /token
url passant nom d'utilisateur et mot de passe. WebApi devrait autoriser l'utilisateur et le retour access_token
qui sera utilisé par angularjs application dans la suite de demandes.
J'ai trouvé un grand article à propos de la mise en œuvre exactement ce dont j'ai besoin dans la version actuelle de ASP.NET - Base de jetons d'Authentification à l'aide de ASP.NET Web API 2, Owin, et de l'Identité. Mais il n'est pas évident pour moi comment faire la même chose dans ASP.NET de Base.
Ma question est: comment faire pour configurer ASP.NET Core WebApi application avec base de jetons d'authentification?
- - Je avoir le même problème et j'ai été rabotage sur le faisais tout moi-même, pour info il y a une autre question stackoverflow.com/questions/29055477/... mais pas de anserw pourtant, nous allons voir ce qu'il se passe
- stackoverflow.com/a/29144031/1659846
Vous devez vous connecter pour publier un commentaire.
Mis à jour pour .Net Core 2:
Les versions précédentes de cette réponse utilisé RSA; ce n'est vraiment pas nécessaire si votre même code qui génère les jetons est également la vérification de l'jetons. Toutefois, si vous distribuez des copies de la responsabilité, vous avez probablement encore envie de le faire à l'aide d'une instance de
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Créer quelques constantes que nous utiliserons plus tard; voici ce que j'ai fait:
Ajouter à votre Démarrage.cs
ConfigureServices
. Nous allons utiliser l'injection de dépendance plus tard pour accéder à ces paramètres. Je suis en supposant que votreauthenticationConfiguration
est unConfigurationSection
ouConfiguration
d'un objet, tel que vous pouvez avoir une autre config pour le débogage et la production. Assurez-vous de stocker votre clé en toute sécurité! Il peut être n'importe quelle chaîne.J'ai vu d'autres réponses changer d'autres paramètres, tels que
ClockSkew
; les valeurs par défaut sont configurés de telle sorte qu'il doit travailler pour les environnements distribués, dont les horloges ne sont pas exactement dans la synchronisation. Ce sont les seuls paramètres que vous avez besoin de changer.Mettre en place l'Authentification. Vous devriez avoir cette ligne avant tout le middleware qui nécessite votre
User
informations, telles que lesapp.UseMvc()
.Noter que ce ne sera pas la cause de votre jeton émis avec la
SignInManager
ou quoi que ce soit d'autre. Vous devrez fournir votre propre mécanisme de sortie de votre JWT - voir ci-dessous.Vous voulez spécifier une
AuthorizationPolicy
. Cela vous permettra de spécifier des contrôleurs et des actions qui ne permettent au Porteur de jetons d'authentification à l'aide de[Authorize("Bearer")]
.Voici la partie la plus délicate: la construction du jeton.
Puis, dans votre contrôleur de l'endroit où vous voulez que votre jeton, quelque chose comme ce qui suit:
Ici, je suis en supposant que vous avez déjà l'un des principaux. Si vous utilisez d'Identité, vous pouvez utiliser
IUserClaimsPrincipalFactory<>
pour transformer votreUser
dans unClaimsPrincipal
.Pour le tester: Obtenir un jeton, le mettre en forme à jwt.io. Les instructions que j'ai fournis ci-dessus vous permettent également d'utiliser le secret de votre config pour valider la signature!
Si vous avez rendu ce dans une vue partielle sur votre page HTML en combinaison avec le porteur d'authentification uniquement dans .Net 4.5, vous pouvez maintenant utiliser un
ViewComponent
à faire de même. C'est essentiellement le même que l'Action du Contrôleur de code ci-dessus.services.Configure<OAuthBearerAuthenticationOptions>
appel de méthode assez pour vous inscrire avec le construit en DI? MerciIOptions<OAuthBearerAuthenticationOptions>
pour utiliser les Options; l'utilisation d'un objet d'Options directement n'est pas pris en charge en raison de la configuration avec un nom qui est pris en charge par les Options de Modèle de cadre.bearerOptions.SecurityTokenValidators
liste? (C'est nul à l'intérieur de mon code. Suis-je la supervision de quelque chose?)bearerOptions.Options
dans le constructeur plutôt que de préserver une référence à l'ensemble de laIOptions<>
, mais c'est le style. Le jeton comme dans l'exemple de n'expire pas, mais lehandler.CreateToken
prend des paramètres supplémentaires, soit après la date de jeton ou de définir une date d'expiration:... DateTime? notBefore = default(DateTime?), DateTime? expires = default(DateTime?), ...
OAuthBearer
avecJwtBearer
; je vais mettre à jour ma réponse une fois beta8 est entièrement libéré. (Bientôt!) @BurakTamurk - je ne suis plus l'obtention de cette exception; c'était peut-être une version spécifique du cadre?/Token
action est si important - pour obtenir un nouveau jeton alors que l'utilisateur est toujours sur votre site!De travail de Matt Dekrey fabuleux répondre, j'ai créé un travail entièrement exemple de base de jeton d'authentification, de travail contre ASP.NET de Base (1.0.1). Vous trouverez le code complet dans ce repository sur GitHub (les branches alternatives pour 1.0.0-rc1, beta8, beta7), mais en bref, les étapes importantes sont:
Générer une clé pour votre application
Dans mon exemple, je vais générer une clé aléatoire à chaque fois que l'application démarre, vous aurez besoin pour générer et stocker dans un endroit et de les fournir à votre demande. Voir ce fichier, pour la façon dont je suis la génération d'une clé aléatoire et comment vous pouvez l'importer à partir d'un .fichier json. Comme suggéré dans les commentaires de @kspearrin, le API de Protection des données semble comme un candidat idéal pour la gestion des clés "correctement", mais je n'ai pas travaillé si c'est encore possible. Veuillez soumettre une demande d'extraction si vous en sortir!
De démarrage.cs - ConfigureServices
Ici, nous avons besoin de charger une clé privée pour nos jetons d'être signé, ce qui nous permettra également de l'utiliser pour vérifier les jetons qu'ils sont présentés. Nous sommes de stockage de la clé dans une classe de niveau variable
key
que nous allons ré-utiliser dans la configuration de la méthode ci-dessous. TokenAuthOptions est une simple classe qui détient la signature de l'identité, de l'audience et de l'émetteur dont nous aurons besoin dans la TokenController pour créer nos clés.Nous avons également mis en place une politique d'autorisation afin de nous permettre d'utiliser
[Authorize("Bearer")]
sur les systèmes d'extrémité et les classes que nous souhaitons protéger.De démarrage.cs - Configurer
Ici, nous avons besoin de configurer le JwtBearerAuthentication:
TokenController
Dans le jeton contrôleur, vous devez avoir une méthode pour générer des clés signées à l'aide de la touche qui a été chargé au Démarrage.cs. Nous avons enregistré un TokenAuthOptions exemple au Démarrage, donc nous avons besoin d'injecter que dans le constructeur de TokenController:
Alors vous aurez besoin pour générer le jeton dans votre gestionnaire pour la connexion d'extrémité, dans mon exemple je vais prendre un nom d'utilisateur et le mot de passe et de valider à l'aide d'une instruction if, mais la principale chose que vous devez faire est de créer ou charger une identité basée sur les revendications et de générer le jeton pour que:
Et cela devrait suffire. Juste ajouter
[Authorize("Bearer")]
à toute méthode ou classe que vous souhaitez protéger, et vous devriez obtenir un message d'erreur si vous essayez d'y accéder sans jeton présent. Si vous voulez retourner un 401 au lieu d'une erreur 500, vous aurez besoin d'enregistrer une exception personnalisée gestionnaire comme je l'ai dans mon exemple ici.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Warning: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. Microsoft.AspNetCore.Mvc.ChallengeResult: Information: Executing ChallengeResult with authentication schemes (Bearer). Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware: Information: AuthenticationScheme: Bearer was challenged.
Peut-être que certains on fait face à un tel problème lors de migrer dans RC2Vous pouvez avoir un coup d'oeil à l'OpenId connect des exemples qui illustrent la façon de traiter avec différents mécanismes d'authentification, y compris JWT des Jetons:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Si vous regardez les Cordova Backend projet, la configuration de l'API est comme suit:
La logique dans /Fournisseurs/AuthorizationProvider.cs et le RessourceController de ce projet sont aussi mérite un coup d'œil ;).
Sinon, vous pouvez également utiliser le code suivant pour valider les jetons (il y a aussi un extrait de code pour le faire fonctionner avec signalR):
Pour l'émission de jeton, vous pouvez utiliser le openId Connect server paquets comme suit:
EDIT: j'ai mis en place une page unique application avec un jeton d'authentification basée sur la mise en œuvre à l'aide de l'Aurelia, avant la fin de cadre et ASP.NET de base. Il est également un signal R des connexions persistantes. Cependant je n'ai pas fait toute DB de mise en œuvre.
Le Code peut être vu ici:
https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Espère que cette aide,
Mieux,
Alex
Ont un coup d'oeil à OpenIddict - c'est un nouveau projet (au moment de l'écriture) qui le rend facile à configurer la création de JWT des jetons et de l'actualisation des jetons dans les ASP.NET 5. La validation des jetons sont gérées par d'autres logiciels.
En supposant que vous utilisez
Identity
avecEntity Framework
, la dernière ligne est ce que vous souhaitez ajouter à votreConfigureServices
méthode:Dans
Configure
, vous avez défini OpenIddict pour servir JWT des jetons:Vous également configurer la validation de jetons dans
Configure
:Il y a un ou deux autres choses mineures, telles que votre DbContext doit dériver de OpenIddictContext.
Vous pouvez voir une pleine longueur explication sur ce blog: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Un fonctionnement de démonstration est disponible à: https://github.com/capesean/openiddict-test