5

我们正在开发一个多租户 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);
},
4

2 回答 2

5

通常,您不能使用 refresh_token 来更新 id_token,因为 id_token 代表用户身份验证,即在没有用户在场的情况下无法刷新的信息。OpenID Connect ( http://openid.net/specs/openid-connect-session-1_0.html )的会话管理草案中描述了刷新 id_token 的方法,即将用户(代理)发送到授权端点如果您不希望用户交互但只需向 OP 检查现有的 SSO 会话,则再次使用可能包含“prompt=none”的身份验证请求。

Azure AD 支持草案规范中描述的会话管理功能。如果您想将 OP 会话与您的应用程序会话同步,那就是要走的路。OTOH,您可以选择拥有一个独立于 OP 会话的应用程序会话,使用它自己的会话超时和持续时间,在这种情况下,没有理由刷新 id_token。然后 id_token 仅用于引导应用程序会话,然后它自己存在。

于 2014-12-04T08:06:39.590 回答
3

此外:AcquireTokenByRefreshToken 实际上是手动回退,以防 ADAL 的自动缓存管理中存在您不想执行的内容。一般来说,每次调用 AcquireToken*(AcquireTokenByRefreshToken 除外)都会在需要时自动使用刷新令牌,并且缓存中有一个有效令牌。除非您真的处于特殊情况,否则我建议您不要使用 AcquireTokenByRefreshToken

于 2014-12-04T09:15:28.080 回答