0

Ich verwende derzeit Code in meiner Pipeline, um das Bearer-Token für die Graph-API mit Azure AD zwischenzuspeichern. Dieser Code wurde von einer funktionierenden ASP.NET 4-Anwendung portiert, aber es scheint, als ob die neuen OpenIdConnectOptions in Core dies erleichtern sollten. Gibt es einen direkteren Aufruf, den ich in dem OnAuthorizationCodeReceived-Ereignis verwenden kann, das das AuthenticationContext zu dem Zwischenspeichern des Tokens verwendet, sobald der Code empfangen wird? Hier ist mein aktueller Code:Verwenden von OnAuthorizationCodeReceived zum Abrufen von Azure GraphAPI AccessToken

var azureSettings = app.ApplicationServices.GetService<IOptions<AzureSettings>>().Value; 
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    ClientId = azureSettings.ClientId, 
    ClientSecret = azureSettings.AppKey, 
    Authority = string.Format(azureSettings.AadInstance, azureSettings.TenantId), 
    Resource = azureSettings.GraphResourceUri, 
    ResponseType = OpenIdConnectResponseType.CodeIdToken, 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     RoleClaimType = "roles" 
    }, 
    Events = new OpenIdConnectEvents() 
    { 
     OnAuthorizationCodeReceived = (context) => 
     { 
      string resourceUri = azureSettings.GraphResourceUri; 
      var authContext = new AuthenticationContext(context.Options.Authority); 
      var credential = new ClientCredential(context.TokenEndpointRequest.ClientId, context.TokenEndpointRequest.ClientSecret); 
      var result = authContext.AcquireTokenByAuthorizationCodeAsync(context.TokenEndpointRequest.Code, new Uri(context.TokenEndpointRequest.RedirectUri), credential, resourceUri); 

      context.HandleCodeRedemption(result.AccessToken, result.IdToken); 
     } 
    } 
}); 

Der obige Code funktioniert gut, aber es fühlt sich an wie ich eine Menge Code bin Duplizierung nur vorlegen, was vor allem innerhalb der AuthorizationCodeReceivedContext bereits enthalten ist.

Gibt es einen einfacheren Weg, den ich einfach übersehe?

+0

Ich habe ein paar Änderungen an syntaktischem Zucker gemacht, aber das primäre Konzept bleibt gleich. Das eine Stück, das scheinbar manuell ist, setzt den Resource Uri. Wenn ich jedoch Token für mehrere Ressourcen anfordern müsste, könnte es am besten so bleiben, wie es ist, und nur eine statische Methode eines AccountService oder etwas ähnliches aufrufen. –

Antwort

0

Nachdem ich den Code für Microsoft.AspNetCore.Authentication.OpenIdConnect durchgesehen habe, erkannte ich, dass diese Bibliothek vom Token Caching-Mechanismus innerhalb des AuthenticationContext getrennt ist. Wenn ich versuche, den Code zu straffen, wird der Caching-Mechanismus nicht ausgelöst, was bedeutet, dass das Bearer-Token bei jeder Anfrage abgerufen werden muss.

Da ich den TokenCache verwenden möchte, um die Aufrufe an die API zu reduzieren und meinen Redis-Cache zu nutzen, muss ich diesen Code in der OnAuthorizationCodeReceived-Methode belassen.

Verwandte Themen