JWT sur .NET Core 2.0
J'ai été toute une aventure pour obtenir JWT de travail sur DotNet core 2.0 (pour atteindre aujourd'hui sortie de la version finale d'aujourd'hui). Il y a un tonne de la documentation, mais tous les exemples de code semble être l'utilisation d'Api obsolète et à venir dans les frais de Base, Il est positivement le vertige à comprendre exactement comment il est censé être mis en œuvre. J'ai essayé d'utiliser Jose, mais app. UseJwtBearerAuthentication a été abandonné, et il n'y a pas de documentation sur ce qu'il faut faire ensuite.
Quelqu'un projet open source qui utilise dotnet core 2.0 qui peut tout simplement analyser un JWT de l'autorisation d'en-tête et me permettre d'autoriser des demandes pour un HS256 codé JWT jeton?
La classe ci-dessous ne jette pas des exceptions, mais pas de demandes sont autorisées, et je n'ai pas d'indication pourquoi ils ne sont pas autorisés. Les réponses sont vides 401, il m'indique qu'il n'a pas fait exception, mais que le secret n'est pas de correspondance.
Une chose étrange, c'est que mes jetons sont chiffrés avec la HS256 algorithme, mais je ne vois pas d'indicateur de lui dire de le forcer à utiliser cet algorithme n'importe où.
Ici est la classe I ont jusqu'à présent:
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using Newtonsoft.Json.Linq;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace Site.Authorization
{
public static class SiteAuthorizationExtensions
{
public static IServiceCollection AddSiteAuthorization(this IServiceCollection services)
{
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("SECRET_KEY"));
var tokenValidationParameters = new TokenValidationParameters
{
//The signing key must match!
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
IssuerSigningKeys = new List<SecurityKey>{ signingKey },
//Validate the token expiry
ValidateLifetime = true,
};
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
o.IncludeErrorDetails = true;
o.TokenValidationParameters = tokenValidationParameters;
o.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = c =>
{
c.NoResult();
c.Response.StatusCode = 401;
c.Response.ContentType = "text/plain";
return c.Response.WriteAsync(c.Exception.ToString());
}
};
});
return services;
}
}
}
- J'ai éteint la signature de la validation sans modification, toutes les demandes à l'aide de [Autoriser] 401
- Pourriez-vous poster le code complet ? ou un projet de démo j'aimerais voir comment vous avez obtenu ce à travail...
- github.com/mikepc/jwt-dotnet-core-2.0 🙂
- J'ai besoin de code pour l'émission de jeton de contrôleur
- Il y a un autre post tha peut vous aider. stackoverflow.com/a/48295906/8417618
Vous devez vous connecter pour publier un commentaire.
Ici est un travail complet minimal de l'échantillon avec un contrôleur. J'espère que vous pouvez vérifier à l'aide de Facteur ou appel JavaScript.
appsettings.json, appsettings.Développement.json. Ajouter une section. Remarque, la Clé doit être assez long et l'Émetteur est une adresse de service:
!!! En projet réel, ne laissez pas les Clés dans appsettings.fichier json. Il doit être conservé dans la variable d'Environnement et de prendre les choses comme ceci:
Mise à JOUR: Voir comment .net les paramètres de base de travail, vous n'avez pas besoin de le prendre exactement à partir de l'Environnement. Vous pouvez utiliser le réglage. Cependant,au lieu de cela nous pouvons écrire cette variable les variables d'environnement de production, puis de notre code préfèrent les variables d'environnement au lieu de la configuration.
AuthRequest.cs : Dto garder les valeurs pour le passage de login et mot de passe:
De démarrage.cs dans la méthode Configure() AVANT l'application.UseMvc() :
De démarrage.cs dans ConfigureServices() :
Ajouter un contrôleur:
C'est tout! Cheers!
Mise à JOUR: les Gens demandent comment obtenir de l'Utilisateur Actuel. Todo:
En Démarrage.cs dans ConfigureServices() ajouter
Dans un contrôleur ajouter constructeur:
Ajouter quelque part une extension et à utiliser dans votre Contrôleur (à l'aide de ....)
Mon
tokenValidationParameters
œuvres lorsqu'elles ressembler à ceci:et
En outre, ajouter des options.RequireHttpsMetadata = false comme ceci:
MODIFIER:
N'oubliez pas d'appeler
en Démarrage.cs -> Configurer la méthode avant app.UseMvc();
app.UseAuthentication();
note a été appelé avantapp.UseMvc();
si vous n'en avez pas, vous obtiendrez 401 de même lorsque le jeton est autorisé avec succès - j'ai passé environ 2 jours de travail que l'on sort!"No IAuthenticationSignInHandler is configured to handle sign in for the scheme: Bearer"
. quelqu'un sait où je suis censé pour configurer cela?Voici une solution pour vous.
Dans votre démarrage.cs, tout d'abord, config comme services:
deuxième, appel de services présent dans config
maintenant, vous pouvez l'utiliser dans votre contrôleur en ajouter un attribut
Pour plus de détails, le code source que l'utilisation angulaires Frond-end voir ici
services.AddAuthorization
la fonction de démarrage.Asp.net Core 2.0 JWT Porteur du Jeton d'Authentification mise en Œuvre avec l'Api Web Démo
Ajouter Le Package "Microsoft.AspNetCore.L'authentification.JwtBearer"
De démarrage.cs ConfigureServices()
De démarrage.cs Configurer()
De l'utilisateur.cs //C'est un modèle de la classe, juste pour l'exemple. Il peut être n'importe quoi.
UserContext.cs //C'est juste le contexte de la classe. Il peut être n'importe quoi.
AccountController.cs
UserController.cs
Test sur le Facteur:
Passer TokenType et AccessToken dans l'en-Tête dans d'autres services web.
Bonne Chance! Je suis juste Débutant. J'ai seulement passé une semaine pour commencer à apprendre asp.net de base.
Voici ma réalisation, pour .Net Core 2.0 de l'API:
appsettings.json:
Le code ci-dessus permet auth sur tous les contrôleurs. Pour autoriser l'accès anonyme, vous pouvez décorer l'ensemble de la commande:
ou tout simplement décorer une méthode pour permettre à un seul point de terminaison:
Notes:
Audience
doit correspondre à la ID de Ressource demandé par le client. Dans notre cas, notre client (Angulaire web app) a été enregistré séparément dans Azure AD, et il a utilisé son Identifiant Client, ce qui nous inscrit dans le Public dans l'APIClientId
est appelé ID de l'Application dans le Portail Azure (pourquoi??), l'ID de l'Application de l'application d'enregistrement pour l'API.TenantId
est appelé Répertoire ID dans le Portail Azure (pourquoi??), trouvé sous Azure Active Directory > PropriétésSi le déploiement de l'API, comme un Azure Web hébergé Application, assurez-vous de définir les Paramètres de l'Application:
par exemple. AzureAD:Public /xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Juste de mettre à jour sur l'excellente réponse par @alerya j'ai dû modifier la classe d'assistance pour ressembler à ceci;
Ensuite, j'ai pu obtenir le nom d'utilisateur dans ma couche de service. Je sais que c'est facile dans le contrôleur, mais un défi plus bas.