Ich war auf einem ziemlichen Abenteuer, um JWT an DotNet Core 2.0 zum Laufen zu bringen (das heute die endgültige Version erreicht). Es gibt eine Menge Dokumentation, aber der gesamte Beispielcode scheint veraltete APIs zu verwenden und kommt neu in Core. Es ist schwindelerregend herauszufinden, wie genau er implementiert werden soll. Ich habe versucht, Jose zu verwenden, aber App. UseJwtBearerAuthentication ist veraltet und es gibt keine Dokumentation darüber, was als nächstes zu tun ist.
Hat jemand ein Open Source-Projekt, das Dotnet Core 2.0 verwendet, das einfach eine JWT aus dem Autorisierungsheader analysieren und mir erlauben kann, Anforderungen für ein HS256-codiertes JWT-Token zu autorisieren?
Die folgende Klasse wirft keine Ausnahmen aus, aber es sind keine Anfragen autorisiert, und ich erhalte keinen Hinweis darauf, warum sie nicht autorisiert sind. Die Antworten sind leere 401, was für mich bedeutet, dass es keine Ausnahme gab, aber dass das Geheimnis nicht übereinstimmt.
Eine seltsame Sache ist, dass meine Token mit dem HS256-Algorithmus verschlüsselt sind, aber ich sehe keinen Indikator, der ihn anweist, ihn zu zwingen, diesen Algorithmus irgendwo zu verwenden.
Hier ist die Klasse, die ich bisher habe:
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;
}
}
}
Antworten:
Hier ist ein voll funktionsfähiges Minimalbeispiel mit einem Controller. Ich hoffe, Sie können es mit Postman oder JavaScript-Aufruf überprüfen.
appsettings.json, appsettings.Development.json. Fügen Sie einen Abschnitt hinzu. Hinweis: Der Schlüssel sollte ziemlich lang sein und der Aussteller ist eine Adresse des Dienstes:
!!! Behalten Sie in einem realen Projekt den Schlüssel nicht in der Datei appsettings.json. Es sollte in der Umgebungsvariablen gehalten werden und so aussehen:
UPDATE : Um zu sehen, wie die .net-Kerneinstellungen funktionieren, müssen Sie sie nicht genau aus der Umgebung übernehmen. Sie können die Einstellung verwenden. Stattdessen schreiben wir diese Variable möglicherweise in Umgebungsvariablen in der Produktion. Dann bevorzugt unser Code Umgebungsvariablen anstelle der Konfiguration.
AuthRequest.cs: Um Werte für die Übergabe von Login und Passwort beizubehalten:
Startup.cs in der Configure () -Methode VOR app.UseMvc ():
Startup.cs in ConfigureServices ():
Fügen Sie einen Controller hinzu:
Das war's Leute! Prost!
UPDATE: Die Leute fragen, wie sie den aktuellen Benutzer bekommen. Machen:
In Startup.cs in ConfigureServices () hinzufügen
In einem Controller zum Konstruktor hinzufügen:
Fügen Sie irgendwo eine Erweiterung hinzu und verwenden Sie sie in Ihrem Controller (mit ....)
quelle
Meine
tokenValidationParameters
Arbeiten, wenn sie so aussehen:und
Fügen Sie außerdem options.RequireHttpsMetadata = false wie folgt hinzu:
EDIT :
Vergessen Sie nicht anzurufen
in Startup.cs -> Methode vor app.UseMvc () konfigurieren ;
quelle
app.UseAuthentication();
Notiz, die vorher aufgerufen wurde,app.UseMvc();
wenn Sie dies nicht tun, erhalten Sie 401, auch wenn der Token erfolgreich autorisiert wurde - ich habe ungefähr 2 Tage damit verbracht, diesen zu erarbeiten!Hier ist eine Lösung für Sie.
Konfigurieren Sie es in Ihrer startup.cs zunächst als Dienste:
Zweitens rufen Sie diese Dienste in config auf
Jetzt können Sie es in Ihrem Controller verwenden, indem Sie ein Attribut hinzufügen
Ausführliche Informationen zum Quellcode, der Angular als Frond-End verwendet, finden Sie hier
quelle
services.AddAuthorization
Funktion beim Start festlegen .Implementierung der Asp.net Core 2.0 JWT Bearer Token-Authentifizierung mit Web Api Demo
Paket hinzufügen " Microsoft.AspNetCore.Authentication.JwtBearer "
Startup.cs ConfigureServices ()
Startup.cs Configure ()
User.cs // Es ist nur eine Modellklasse, zum Beispiel. Es kann alles sein.
UserContext.cs // Es ist nur eine Kontextklasse . Es kann alles sein.
AccountController.cs
UserController.cs
Test auf PostMan:
Übergeben Sie TokenType und AccessToken im Header in anderen Webservices.
Viel Glück! Ich bin nur Anfänger. Ich habe nur eine Woche damit verbracht, asp.net core zu lernen.
quelle
Hier ist meine Implementierung für eine .Net Core 2.0-API:
appsettings.json:
Der obige Code aktiviert die Authentifizierung auf allen Controllern. Um anonymen Zugriff zu ermöglichen, können Sie einen gesamten Controller dekorieren:
oder dekorieren Sie einfach eine Methode, um einen einzelnen Endpunkt zuzulassen:
Anmerkungen:
Dies ist mein erster Versuch mit AD-Authentifizierung - wenn etwas nicht stimmt, lassen Sie es mich bitte wissen!
Audience
muss mit der vom Client angeforderten Ressourcen-ID übereinstimmen . In unserem Fall wurde unser Client (eine Angular-Webanwendung) separat in Azure AD registriert und verwendete seine Client-ID, die wir als Zielgruppe in der API registriert habenClientId
wird im Azure-Portal als Anwendungs-ID bezeichnet (warum?), die Anwendungs-ID der App-Registrierung für die API.TenantId
wird im Azure-Portal als Verzeichnis-ID bezeichnet (warum ??) und befindet sich unter Azure Active Directory> EigenschaftenStellen Sie beim Bereitstellen der API als von Azure gehostete Webanwendung sicher, dass Sie die Anwendungseinstellungen festlegen:
z.B. AzureAD: Zielgruppe / xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
quelle
Um die hervorragende Antwort von @alerya zu aktualisieren, musste ich die Hilfsklasse so ändern, dass sie so aussieht.
Dann könnte ich die Benutzer-ID in meiner Service-Schicht erhalten. Ich weiß, dass es im Controller einfach ist, aber eine Herausforderung weiter unten.
quelle