Azure AD B2C存在开放重定向漏洞?OWIN+OpenID认证场景疑问
为什么Azure AD B2C没阻止我修改后的登出重定向?
嘿,这个问题我之前帮不少开发者排查过,核心原因其实和Azure AD B2C登出端点的验证逻辑以及你发起请求的方式有关:
- 合法登出请求(带
id_token_hint):如果你的应用通过正常流程发起登出(比如调用OWIN的登出方法),应该会自动带上用户登录时获取的id_token_hint参数。这时候Azure AD B2C会先验证这个ID Token的有效性,再严格检查post_logout_redirect_uri是否在你门户配置的允许列表里——这种情况下,你改参数根本绕不过验证。 - 直接修改地址栏的请求(无
id_token_hint):你直接在浏览器地址栏改参数的操作,相当于绕开了应用发起的合法流程,此时请求里没有携带有效的id_token_hint。B2C没办法确认这个请求来自你授权的应用,出于兼容性和用户体验的考虑,它会完成登出,但不会严格校验重定向URI,所以你才能跳到未授权的地址。
这算不算开放重定向漏洞?
严格来说不算。开放重定向漏洞是指应用本身有逻辑缺陷,允许攻击者构造恶意链接诱导用户跳转,而你的场景是用户主动修改浏览器地址栏的参数,属于主动发起的非法操作,并非应用或B2C的安全漏洞。
怎么解决这个问题?
你需要确保应用发起的登出请求始终携带id_token_hint。在你的OWIN配置里,可以通过OpenIdConnectAuthenticationNotifications的RedirectToIdentityProvider事件来添加这个参数:
Notifications = new OpenIdConnectAuthenticationNotifications { RedirectToIdentityProvider = context => { // 处理登出请求 if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout) { // 获取用户的ID Token var idToken = context.OwinContext.Authentication.User.FindFirst("id_token")?.Value; if (!string.IsNullOrEmpty(idToken)) { context.ProtocolMessage.IdTokenHint = idToken; } } return Task.FromResult(0); }, // 其他你的通知事件代码... }
加上这段配置后,当应用发起登出请求时,会自动带上id_token_hint,此时Azure AD B2C会严格验证重定向URI,就算用户改地址栏参数也会被阻止。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

