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
只要授权代码未过期并存储在会话中,任何页面重新加载都不会触发该事件。
你需要做什么是打电话AcquireTokenByAuthorizationCodeAsync
这将缓存它并在内部正确处理TokenCache.DefaultShare
:
AuthorizationCodeReceived = (context) => {
string authorizationCode = context.Code;
AuthenticationResult tokenResult = await context.AcquireTokenByAuthorizationCodeAsync(authorizationCode, new Uri(redirectUri), credential);
return Task.FromResult(0);
}
现在、之前every调用资源,调用AcquireTokenSilentAsync
获取 accessToken (它将使用 TokenCache 或静默使用刷新令牌)。如果令牌过期,它将引发AdalSilentTokenAcquisitionException
异常(调用访问代码更新过程)。
// currentUser for ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")
AuthenticationResult authResult = await context.AcquireTokenSilentAsync(resourceUri, credential, currentUser);
Calling AcquireTokenSilentAsync
如果令牌被缓存的话,速度会非常快。