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
which 将缓存它并在内部正确处理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
非常快。