2015-09-09 11 views
6

Sto seguendo il seguente esempio GitHub per implementare il meccanismo di autenticazione su WebApp e WebApi.Come funziona UseWindowsAzureActiveDirectoryBearerAuthentication nella convalida del token?

https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet

Sto usando una sola registrazione App sia per WebApp e WebAPI, ottenere un token di accesso per "https://abc.onmicrosoft.com/App" e passarlo a WebAPI. Allego il token alle intestazioni HTTPS con il nome "Bearer". Ho il seguente nella classe Startup OA WebApi per convalidare il token per il pubblico e il titolare, ma in realtà non convalida il token per questi come previsto.

Un paio di domande: 1. Che cosa fa scattare l'handler di sotto per convalidare il token per l'inquilino e il pubblico? È l'attributo [Autorizza] nella classe Controller? 2. Come fa dove trovare il token per eseguire il gestore? 3. L'impostazione di SaveSigninToken su true salva il token. Come posso recuperare il token e acquisire anche il token di accesso per Graph API da questo token?

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
       new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
       { 
        Tenant = "abc.onmicrosoft.com", 

        TokenValidationParameters = new TokenValidationParameters 
        { 
         ValidAudience = "https://abc.onmicrosoft.com/App", 
         SaveSigninToken = true, 
        } 
       }); 

Si prega di avvisare. Grazie in anticipo!

risposta

0

La decorazione [Autorizza] nel controller o qualsiasi metodo specificato attiva il gestore di sicurezza Owin per convalidare il token e generare le attestazioni.

+0

Si connette ad azzurro ogni volta per convalidare il token? – Jaanus

+1

Ho la stessa domanda di Jaanus –

+0

@Jaanus Il token contiene le informazioni necessarie per convalidarlo. – Alexander

1

Che cosa fa scattare l'handler di sotto per convalidare il token per l'inquilino e il pubblico?

Il middleware viene eseguito in Active modalità di default, quindi tenterà di trovare un segno in ogni mia richiesta. Se ne trova uno, tenterà di convalidarlo. Se rileva che è valido, viene creato uno ClaimsPrincipal accessibile in ulteriori middleware OWIN e componenti dell'API Web.

Inoltre, scarica le chiavi pubbliche con cui controlla la firma del token all'avvio dell'app da Azure AD. Puoi vederlo se usi uno strumento come Fiddler.

Come si fa a trovare il token per eseguire l'handler?

Non sono sicuro di aver compreso questa domanda, spero che la mia risposta sopra abbia chiarito il processo.

Impostazione di SaveSigninToken su true salva il token. Come posso recuperare il token e acquisire anche il token di accesso per Graph API da questo token?

Quello che stai cercando di fare è chiamare un'API utilizzando il flusso on-behalf-of. Puoi trovare un'app di esempio qui: https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof. Più precisamente questa parte dovrebbe interessarti: https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/master/TodoListService/Controllers/TodoListController.cs#L133.

 ClientCredential clientCred = new ClientCredential(clientId, appKey); 
     var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 
     string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value; 
     string userAccessToken = bootstrapContext.Token; 
     UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName); 

     string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); 
     string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
     AuthenticationContext authContext = new AuthenticationContext(authority, new DbTokenCache(userId)); 

     // In the case of a transient error, retry once after 1 second, then abandon. 
     // Retrying is optional. It may be better, for your application, to return an error immediately to the user and have the user initiate the retry. 
     bool retry = false; 
     int retryCount = 0; 

     do 
     { 
      retry = false; 
      try 
      { 
       result = await authContext.AcquireTokenAsync(graphResourceId, clientCred, userAssertion); 
       accessToken = result.AccessToken; 
      } 
      catch (AdalException ex) 
      { 
       if (ex.ErrorCode == "temporarily_unavailable") 
       { 
        // Transient error, OK to retry. 
        retry = true; 
        retryCount++; 
        Thread.Sleep(1000); 
       } 
      } 
     } while ((retry == true) && (retryCount < 1)); 
Problemi correlati