BenV 已经回答了这个问题,但还有更多需要考虑。
class partial Startup
{
public void ConfigureAuth(IAppBuilder app)
{
// ...
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
Notifications = new OpenIdConnectAuthenticationNotifications() {
AuthorizationCodeReceived = (context) => {
string authorizationCode = context.Code;
// (tricky) the authorizationCode is available here to use, but...
return Task.FromResult(0);
}
}
}
}
}
两个问题:
- 首先,
authorizationCode 会很快过期。存储它没有任何意义。
- 第二个问题是
AuthorizationCodeReceived 事件不会因为任何页面重新加载而被触发,只要 authenticationCode 未过期并存储在会话中。
你需要做的是调用AcquireTokenByAuthorizationCodeAsync,它将缓存它并在TokenCache.DefaultShare中正确处理:
AuthorizationCodeReceived = (context) => {
string authorizationCode = context.Code;
AuthenticationResult tokenResult = await context.AcquireTokenByAuthorizationCodeAsync(authorizationCode, new Uri(redirectUri), credential);
return Task.FromResult(0);
}
现在,在 每次 调用资源之前,调用 AcquireTokenSilentAsync 以获取 accessToken(它将使用 TokenCache 或静默使用 refreshToken )。如果令牌过期,会引发AdalSilentTokenAcquisitionException 异常(调用访问码更新程序)。
// currentUser for ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")
AuthenticationResult authResult = await context.AcquireTokenSilentAsync(resourceUri, credential, currentUser);
如果令牌被缓存,调用AcquireTokenSilentAsync 非常快。