我们正在开发一个多租户Web应用程序。我们的租户将使用Windows Azure Active Directory进行身份验证。我们使用OWIN OpenIdConnect中间件来验证用户身份。我们在身份验证过程后收到的响应有id_token和授权码。
我们还希望获得刷新令牌,以便我们可以在id_token到期后获取新令牌。因此,在AuthorizationCodeReceived处理程序中,我们使用ADAL库中的AcquireTokenByAuthorizationCode方法来获取刷新令牌。响应包含id_token,access_token和refresh_token。
然后我们使用referh_token来获取新的id_token但是响应仅包含续订的access_token但不包含更新的id_token。是否可以刷新id_token或者我们只能刷新access_token?剪切授权代码接收处理程序的代码如下所示。
AuthorizationCodeReceived = (context) =>
{
string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + "/";
var code = context.Code;
string clientSecret = ConfigurationManager.AppSettings["ida:Password"];
ClientCredential credential = new ClientCredential(clientId, clientSecret);
string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
MAuthenticationContext authContext = new MAuthenticationContext(string.Format("https://login.windows.net/{0}", tenantID), null);
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
code, new Uri(appBaseUrl), credential, "https://graph.windows.net");
AuthenticationResult refreshTokenResult = authContext.AcquireTokenByRefreshToken(result.RefreshToken, credential);
return Task.FromResult(0);
},
答案 0 :(得分:2)
通常,您不能使用refresh_token来更新id_token,因为id_token表示用户身份验证,这是在没有用户在场的情况下无法刷新的信息。刷新id_token的方法在OpenID Connect(http://openid.net/specs/openid-connect-session-1_0.html)的会话管理草案中进行了描述,即通过使用可能包含" prompt =的身份验证请求再次将用户(代理)发送到授权端点。无"如果您不想进行用户交互,只需检查OP是否有现有的SSO会话。
Azure AD支持规范草案中描述的会话管理功能。如果要将OP会话与应用程序会话同步,那么就是这样。 OTOH您可以选择使用独立于OP会话的应用程序会话,使用它自己的会话超时和持续时间,在这种情况下,没有理由刷新id_token。然后id_token仅用于引导应用程序会话,然后该应用程序会自动生成它。
答案 1 :(得分:2)
另外:如果ADAL的自动缓存管理中存在您不想执行的内容,则AcquireTokenByRefreshToken实际上是一个手动回退。通常,每次调用AcquireToken *(除了AcquireTokenByRefreshToken)将在需要时自动使用刷新令牌,并在缓存中使用有效的刷新令牌。除非你真的遇到特殊情况,否则我建议不要使用AcquireTokenByRefreshToken