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;
return Task.FromResult(0);
}
}
}
}
}
有两个问题:
- 首先,
authorizationCode
很快就会过期,将其存储没有任何意义。
- 第二个问题是,在授权码没有过期且存储在会话中时,
AuthorizationCodeReceived
事件将不会在任何页面重新加载时触发。
你需要做的 是调用 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)。如果token过期,它将引发AdalSilentTokenAcquisitionException
异常(调用访问代码更新过程)。
// currentUser for ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")
AuthenticationResult authResult = await context.AcquireTokenSilentAsync(resourceUri, credential, currentUser);
如果令牌已缓存,调用AcquireTokenSilentAsync
非常快。