2017-11-30 4 views
0

Ich muss meine. Net Core API (. Net Framework) konfigurieren, ADFS 3.0 (2012) zu verwenden, um die Bearer-Token von unseren mobilen Clients zu validieren..net Core Api Authentifizierung mit ADFS 2012

Ich bin in der Lage, das access_token vom ADFS-Server zu erzeugen, und ich gebe es in der Authorization-Header.

Mein Problem ist in der API: Wie konfiguriere ich es, um den Benutzer zu validieren und zu autorisieren?

Ich suchte an vielen Orten und ich konnte keine definitive Methode finden, es zu tun.

Was habe ich versucht, so weit:

Gebrauchte IdentityServer4 (fehlgeschlagen, weil es JWT und ADFS verwendet bietet keine OpenID Versuchte UseOpenIdConnectAuthentication (gefunden Beispiel bei IdentityServer4) eine eigene Middleware ich eine andere Methode nicht verwenden können, ., ich OAuth2 unterstützen muß

Also, wie kann ich tun, es

Hier ist mein letzter Versuch:

var connectOptions = new OpenIdConnectOptions 
    { 
     AuthenticationScheme = "adfs", 
     SignInScheme = "idsrv.external", //IdentityServerConstants.ExternalCookieAuthenticationScheme, 
     SignOutScheme = "idsrv", //IdentityServerConstants.SignoutScheme, 
     AutomaticChallenge = false, 
     DisplayName = "ADFS", 
     Authority = $"https://{options.AdfsHostName}/adfs/oauth2", 
     ClientId = options.ClientID, 
     ResponseType = "id_token", 
     Scope = { "openid profile" }, 
     CallbackPath = new PathString("/signin-adfs"), 
     SignedOutCallbackPath = new PathString("/signout-callback-adfs"), 
     RemoteSignOutPath = new PathString("/signout-adfs"), 
     ClaimsIssuer = $"https://{options.AdfsHostName}/adfs/services/trust", 
     //TokenValidationParameters = new TokenValidationParameters 
     //{ 
     // ValidateIssuer = true, 
     // ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust" 
     //}, 

    }; 

    app.UseOpenIdConnectAuthentication(connectOptions); 

Ich bekomme eine sehr schnelle 401 auf jeden Anruf, mit einem gültigen Token. In der Tat, während ich die Verbindung im Konsolenfenster sehe, sehe ich kein anderes Protokoll im Roslyn Konsolenfenster bezüglich der Sicherheitsvalidierung.

Ich benutze derzeit ASP.Net Core 1.1.X, und wenn ich kann, würde ich vermeiden, zu .Net Core 2.0 zu verschieben, da wir zu spät im Projekt sind und es viele brechende Änderungen enthält ...

Fühlen Sie sich frei, nach mehr Informationen zu fragen, und ich werde alle guten Ratschläge zu schätzen wissen!

Antwort

1

Wie sich herausstellt, können wir die JwtBearerAuthentication mit ADFS 3.0 verwenden.

Mein anfängliches Problem mit ihm war, dass es die Metadaten in /.well-known/openid-configuration, holen ging ADFS aber 3.0 nicht OpenID unterstützen und diese gibt ein 404.

ich in einem anderen Beitrag lesen (Ich werde es aktualisieren, wenn ich es finde), dass, wenn mit der richtigen Konfiguration, es nicht die Config abholen muss. Aber welche Konfiguration?

Nun, ich fand tief im (MS) Code, dass, wenn man ein OpenIdConnectConfiguration-Objekt an die Configuration-Eigenschaft der JwtBearerOptions übergeben, nicht die Metadaten abrufen.

So, hier ist mein Code jetzt:

var rawCertData = Convert.FromBase64String(options.X509SigninCertificate); 

X509Certificate2 cert = new X509Certificate2(rawCertData); 

SecurityKey signingKey = new X509SecurityKey(cert); 

Die X509 cert Daten an dieser URL aus dem unterstützten adfs Metadaten kommen

https://Your.ADFS.Site/FederationMetadata/2007-06/FederationMetadata.xml 

Es enthält diese:

<KeyDescriptor use="signing"> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <X509Data> 
      <X509Certificate>SOMEUUENCDODEDSTRING=</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</KeyDescriptor> 

I Kopieren Sie einfach die UUEncoded-Zeichenfolge in die X509SigninCertificate -Eigenschaft meiner Einstellungen.

var tokenValidationParameters = new TokenValidationParameters 
     { 
      // The signing key must match! 
      ValidateIssuerSigningKey = true, 
      IssuerSigningKey = signingKey, 

      // Validate the JWT Issuer (iss) claim 
      ValidateIssuer = true, 
      ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust", 

      // Validate the JWT Audience (aud) claim 
      ValidateAudience = true, 
      ValidAudience = options.ClientUri, //"https://YOUR-AUDIENCE/", 

      // Validate the token expiry 
      ValidateLifetime = true, 


      // If you want to allow a certain amount of clock drift, set that here: 
      ClockSkew = TimeSpan.Zero 
     }; 

     var connectOptions = new OpenIdConnectConfiguration 
     { 
      Issuer = $"https://{options.AdfsHostName}/adfs/services/trust", 
     }; 

     app.UseJwtBearerAuthentication(new JwtBearerOptions 
     { 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      TokenValidationParameters = tokenValidationParameters, 
      Configuration = connectOptions     
     }); 

Die wichtige Linie ist hier

Configuration = connectOptions 

dies Dadurch, sagen Sie den Validator nicht die Metadaten abzurufen. So einfach ist das.

Ich konnte meine Token (AUD, ISS und SIGN) validieren und ich kann ADFS in meinem Projekt verwenden.

0

Nur ADFS 2016 unterstützt OpenID Connect. Wenn Sie den OAuth-Endpunkt 2012 verwenden möchten, müssen Sie einen eigenen Authorization-Handler schreiben. Ein Beispiel zum Aufbau wäre ASP.NET Core's own Twitter implementation. Beachten Sie, dass diese Handler in ASP.NET Core 1. * vs. 2.0+ anders implementiert werden müssen.