使用OnAuthorizationCodeReceived检索Azure GraphAPI AccessToken

时间:2017-04-26 21:15:50

标签: c# asp.net-core-mvc azure-active-directory openid-connect

我目前正在使用管道中的代码来缓存使用Azure AD的Graph API的承载令牌。此代码是从一个正在运行的ASP.NET 4应用程序移植而来的,但感觉Core中的新OpenIdConnectOptions应该可以使这更容易。是否有更直接的调用我可以在OnAuthorizationCodeReceived事件中使用,该事件将在收到代码后使用AuthenticationContext来缓存令牌?这是我目前的代码:

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

上面的代码工作正常,但感觉就像我复制了大量代码只是为了提交已经包含在AuthorizationCodeReceivedContext中的内容。

是否有一种更容易忽视的方式?

1 个答案:

答案 0 :(得分:1)

查看Microsoft.AspNetCore.Authentication.OpenIdConnect的代码后,我意识到此库与AuthenticationContext中的令牌缓存机制断开连接。如果我尝试简化代码,它将不会触发缓存机制,这意味着需要在每个请求上检索Bearer令牌。

因为我计划使用TokenCache来减少对API的调用并最终利用我的Redis缓存,所以我需要将该代码保留在OnAuthorizationCodeReceived方法中。