2015-06-27 18 views
8

Sto utilizzando Identità ASP.Net per implementare account di accesso esterni. Dopo che l'utente ha effettuato l'accesso con Google, ottengo il token di accesso esterno di Google. Quindi effettuo una seconda chiamata API a ObtainLocalAccessToken() che scambia il token di accesso esterno per una nuova local.Verifica token di accesso - Identità Asp.Net

ObtainLocalAccessToken() chiamate VerifyExternalAccessToken() che verifica il token di accesso esterno con il provider effettuando manualmente le chiamate http e analizzando l'id_utente.

Come posso sfruttare l'identità di ASP.NET per rimuovere l'intero metodo VerifyExternalAccessToken()?

Credo che sia quello che lo è [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] no? Voglio decorare l'endpoint ObtainLocalAccessToken() con quell'attributo e inviare il external_access_token nell'intestazione ({'Authorization' : 'Bearer xxx' }) e dovrebbe compilare User.Identity senza la necessità di verificare manualmente il token di accesso esterno? Credo che sia lo scopo, ma non riesco a farlo funzionare. Mando un token di accesso esterna valida da parte di Google e viene rifiutato con un 401.

ho questa linea in Startup.Auth btw:

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

In alternativa, è possibile usare "/ Token" endpoint scambiare un token di accesso esterno per uno locale? Quale approccio è corretto?

+0

Farò una congettura selvaggia qui.Ma tutti i servizi che uso da google sono attraverso https. È possibile che non sia possibile utilizzare AllowInsecureHttp = true? Dal momento che il tuo errore è un 401, sono abbastanza sicuro che significa che una chiamata a http non è consentita. – GELR

+1

Beh, non posso ancora usare ssl, quindi ho bisogno che funzioni con http, come fa con la mia applicazione web (ma non con il cellulare). Ma ho ragione a capire che [HostAuthentication (DefaultAuthenticationTypes.ExternalBearer)] dovrebbe popolare il principio quando si invia un token di accesso esterno? In tal caso, come farebbe a sapere da quale provider proviene il token di accesso? – parliament

+1

E oltre a 401 = Non autorizzato. "L'autorizzazione è stata negata per questa richiesta." – parliament

risposta

5

Studiando l'attuazione da Taiseer Joudeh

il /ExternalLogin endpoint sostituisce il OWIN autenticazione sfida.

I AngularJSLoginController fa una chiamata al authService.obtainAccessToken quando un utente autenticato esternamente non è stato trovato in Identity Provider:

 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'); 

Esso utilizza il VerifyExternalAccessToken per eseguire una ricerca inversa contro Google e Facebook API per ottenere informazioni sui reclami per il token al portatore.

 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; 
     } 

Se non viene trovata token, restituisce un nuovo ASP.NET portatore di token

 var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName); 

     return Ok(accessTokenResponse); 

Con [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] il OWIN Middleware utilizza il portatore esterna Token a accedere al cookie della terza parte e registrare un nuovo account (oppure trovare esistente).

OWIN Middleware non può essere configurato per accettare portatore esterno pegno invece di gettoni autorità locali. I token al portatore esterno vengono utilizzati solo per l'autenticazione e la registrazione.

+1

Ciao Dave, ci sono altre soluzioni o metodi incorporati nel middleware OWIN o altrimenti che potrebbero essere chiamati per verificare il token del provider esterno? La logica personalizzata di 'VerifyExternalAccessToken()' si sente/re-inventare la ruota come il metodo richiederebbe l'aggiornamento ogni volta che mi piacerebbe aggiungere un nuovo provider esterno. Per esempio. Twitter. Grazie! – GFoley83

+0

Infatti, @ GFoley83, 'VerifyExternalAccessToken()' è un hack. E OWIN ha messo a punto metodi per consumare i cookie OAuth. Ma nessuno per consumare i token di autenticazione *. Per ottenere l'ID dietro un token bearer OAuth, sei in balia del fornitore. –

Problemi correlati