2015-06-27 23 views
8

Ich benutze ASP.Net Identity, um externe Logins zu implementieren. Nachdem der Nutzer sich bei Google eingeloggt hat, erhalte ich das externe Zugriffstoken von Google. Ich mache dann einen zweiten api-Anruf an ObtainLocalAccessToken(), der das externe Zugangstoken für ein neues lokales handelt.Verifiziere Access Token - Asp.Net Identity

ObtainLocalAccessToken() Anrufe VerifyExternalAccessToken() die das externe Zugriffstoken mit dem Provider überprüft, indem sie manuell http-Aufrufe durchführt und die user_id analysiert.

Wie kann ich die ASP.NET-Identität nutzen, um die gesamte Methode VerifyExternalAccessToken() zu entfernen?

Ich glaube, das ist, was [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] ist für nicht wahr? Ich möchte ObtainLocalAccessToken() Endpoint mit diesem Attribut dekorieren und das external_access_token in der Kopfzeile ({'Authorization' : 'Bearer xxx' }) senden, und es sollte User.Identity auffüllen, ohne das externe Zugriffstoken manuell zu überprüfen? Ich glaube, das ist der Zweck, aber ich kann es nicht funktionieren. Ich gültige externe Zugriffstoken von Google senden und es wird mit einem 401.

Ich habe diese Linie in Startup.Auth btw abgelehnt:

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(), 
      AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }); 

Alternativ ist es möglich „/ Token“ Endpunkt zu verwenden ein externes Zugriffs-Token für ein lokales zu handeln? Welcher Ansatz ist richtig?

+0

Ich werde hier eine wilde Vermutung machen.Aber jeder Service, den ich von Google verwende, ist über https. Es ist möglich, dass Sie AllowInsecureHttp = true nicht verwenden können? Da Ihr Fehler ein 401 ist, bin ich mir ziemlich sicher, dass ein Aufruf von http nicht erlaubt ist. – GELR

+1

Nun, ich kann ssl noch nicht verwenden, also brauche ich es mit http, wie es von meiner Webanwendung (aber nicht von Handy) funktioniert. Aber stimmt es in meinem Verständnis, dass [HostAuthentication (DefaultAuthenticationTypes.ExternalBearer)] das Prinzip beim Versenden eines externen Zugriffstokens erfüllen soll? Wenn ja, woher weiß er, von welchem ​​Anbieter das Zugriffstoken stammt? – parliament

+1

Und neben 401 = Nicht autorisiert. "Die Autorisierung wurde für diese Anfrage verweigert." – parliament

Antwort

5

Untersuchung der Umsetzung durch Taiseer Joudeh

der /ExternalLogin Endpunkt ersetzt die OWIN Authentifizierungsaufforderung.

Die AngularJSLoginController zum authService.obtainAccessToken einen Anruf tätigt, wenn ein extern authentifizierten Benutzer in Identity Provider nicht gefunden wurde:

 if (fragment.haslocalaccount == 'False') { 
      ... 
     } 

     else { 
      //Obtain access token and redirect to orders 
      var externalData = { provider: fragment.provider, 
         externalAccessToken: fragment.external_access_token }; 
      authService.obtainAccessToken(externalData).then(function (response) { 

       $location.path('/orders'); 

Es nutzt die VerifyExternalAccessToken ein Reverse-Lookup gegen Google auszuführen und Facebook APIs, um Anspruch Informationen für das Bearer-Token zu erhalten.

 if (provider == "Facebook") 
     { 
      var appToken = "xxxxxx"; 
      verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken); 
     } 
     else if (provider == "Google") 
     { 
      verifyTokenEndPoint = string.Format("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={0}", accessToken); 
     } 
     else 
     { 
      return null; 
     } 

Wenn Token gefunden wird, gibt es einen neuen ASP.NET Inhaber Token

 var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName); 

     return Ok(accessTokenResponse); 

Mit [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] die OWIN Middleware verwendet der externen Träger Token zu Greifen Sie auf den Cookie des Drittanbieters zu und registrieren Sie einen neuen Account (oder finden Sie einen bestehenden).

OWIN Middleware nicht akzeptieren externen Bearer Token anstelle von lokalen Behörde Token konfiguriert werden. Externe Bearer-Token werden nur für Authentifizierung und Registrierung verwendet.

+1

Hallo Dave, gibt es eine andere Lösung oder Methode, die in die OWIN-Middleware integriert ist oder sonstwie aufgerufen werden könnte, um das Token des externen Anbieters zu verifizieren? Die angepasste Logik von 'VerifyExternalAccessToken()' fühlt sich hackisch an und erfindet das Rad neu, da die Methode jedes Mal aktualisiert werden muss, wenn ich einen neuen externen Provider hinzufügen möchte. Z.B. Twitter. Vielen Dank! – GFoley83

+0

@ GFoley83, der 'VerifyExternalAccessToken()' ist in der Tat ein Hack. Und OWIN hat in Methoden für den Konsum von OAuth-Cookies gebacken. Aber keine, um Authentication * Token * zu konsumieren. Um die ID hinter einem OAuth-Bearer-Token zu erhalten, sind Sie dem Anbieter ausgeliefert. –