2016-07-23 15 views
5

ASP.NET Core 5 mit ASP.NET Identity 3.0, verwende ich beide Webseiten und Apis. Ich benutze OpenIddict, um ein JWT-Token auszugeben und zu authentifizieren. Mein Code sieht aus, als solche:Autorisieren über JWT Token

X509Certificate2 c = new X509Certificate2(@"tokensign.p12", "MyCertificatePassword"); 

    services.AddOpenIddict<WebUser, IdentityRole<int>, WebDbContext, int>() 
     .EnableTokenEndpoint("/api/customauth/login") 
     .AllowPasswordFlow() 
     .UseJsonWebTokens() 
     .AddSigningCertificate(c); 

Wenn ich UseJsonWebTokens() zu deaktivieren, ich einen Token generieren und erfolgreich autorisieren. Ich bin jedoch nicht sicher, ob mein Zertifikat die zurückgegebenen Token validiert.

Und wenn ich UseJsonWebTokens aktivieren, kann ich ein JWT-Token an diesem Endpunkt ausgeben. Ich kann jedoch keine Anfrage authentifizieren!

Ich verwende den folgenden Code in der App-Konfiguration:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true, 
     RequireHttpsMetadata = false, 
     Authority = "http://localhost:60000/", 
     Audience = "http://localhost:60000/", 
    }); 
    app.UseOAuthValidation(); 
    app.UseIdentity(); 
    app.UseOpenIddict(); 
    app.UseMvcWithDefaultRoute(); 
  • Wie kann ich die Anfrage erzwingen mit meinem Zertifikat validiert werden Token um sicherzustellen, dass die JWT ist nicht manipuliert.
  • Was sind die korrekten Einstellungen, die Validierung und Autorisierung meines JWT-Tokens erlauben, wenn ich JWT nicht verwende, werde ich erfolgreich autorisiert.
+0

Bitte Titel nicht in Frage stellen! http://StackOverflow.com/Help/Tagging – Tseng

Antwort

5

Wenn ich UseJsonWebTokens() zu deaktivieren, kann ich einen Token generieren und erfolgreich autorisieren. Ich bin jedoch nicht sicher, ob mein Zertifikat die zurückgegebenen Token validiert.

In ASOS (der OpenID Connect Server-Framework hinter OpenIddict) gibt es 2 verschiedene eingebaute in Serialisierungsmechanismen Token zu erstellen und schützen:

  • Eines, das verwendet IdentityModel (eine Bibliothek entwickelt von Microsoft) und produziert Standardtoken nachprüfbar durch dritte:

Identitätstoken (JWT per Definition) verwenden thi immer erstellt s Prozess und Sie können UseJsonWebTokens() aufrufen, um OpenIddict zu erzwingen, um Zugriffstoken auszugeben, die denselben Serialisierungsprozess verwenden.

Das Zertifikat, das Sie beim Aufrufen von AddSigningCertificate() angeben, wird immer zum Signieren dieser Tokens verwendet.

  • Einer, der die ASP.NET-Core Data Protection-Stack verwendet (auch von Microsoft entwickelt wurde):

Dieser Stapel produziert ausschließlich "proprietär" Token, die nicht gelesen werden sollen oder verifiziert von einem Drittanbieter, da das Token-Format nicht Standard ist und notwendigerweise auf symmetrische Signierung und Verschlüsselung beruht.

Dies ist der Mechanismus, den wir für Autorisierungscodes und Aktualisierungstoken verwenden, die nur von OpenIddict selbst verwendet werden sollen. Es wird auch für Zugriffstoken verwendet, wenn Sie das Standardtokenformat verwenden.

In diesem Fall wird das Zertifikat, das Sie beim Aufrufen von AddSigningCertificate() angeben, nicht verwendet.

Stattdessen werden diese Tokens immer vom Data Protection-Stack mit einem Authenticated Encryption-Algorithmus (standardmäßig AES-256-CBC mit HMACSHA256) verschlüsselt, der Authentizität, Integrität und Vertraulichkeit bietet. Dazu werden 2 Schlüssel (einer für die Verschlüsselung, einer für die Validierung) vom Data Protection-Stack von einem der im Schlüsselring gespeicherten Master-Schlüssel abgeleitet.

Wie kann ich die Anforderung, die mit meinem Zertifikat überprüft werden soll, erzwingen, um sicherzustellen, dass das JWT-Token nicht manipuliert wird? Was sind die richtigen Einstellungen, die Validierung und Autorisierung meines JWT-Tokens erlauben, wenn ich JWT nicht verwende, werde ich erfolgreich autorisiert.

Um diese Fragen zu beantworten, wäre es hilfreich, wenn Sie die Protokollierung aktiviert und Ihre Traces freigegeben haben.

+1

Was ist der Signaturschlüssel, der von diesem Standard-IdentityModel verwendet wird? Falls ich eine Webfarm benutzen wollte. – Adam

+1

Der Signaturschlüssel ist das von Ihnen verwendete X.509-Zertifikat (genauer gesagt, der darin enthaltene RSA-Schlüssel) – Pinpoint

+1

Was ist der Schlüsselring? Wie speichern wir einen Hauptschlüssel? Benötigt dies einen Aufruf von 'AddSigningKey()' während des Startvorgangs? –