Gau*_*rav 5 owin azure-active-directory adal openid-connect
我们正在开发一个多租户 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);
},
Run Code Online (Sandbox Code Playgroud)
一般来说,您不能使用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 仅用于引导应用程序会话,然后该会话将独立存在。
| 归档时间: |
|
| 查看次数: |
3291 次 |
| 最近记录: |