You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC5集成Azure AD SSO获IdToken后IsAuthenticated为false且Claims为空

问题原因
  • web.config未显式指定认证模式:ASP.NET MVC默认会启用自带的认证模块,和OWIN的认证中间件逻辑冲突,导致OWIN写入的认证Cookie无法被正确识别。
  • 错误清空了响应模式配置:你在RedirectToIdentityProvider事件中将context.ProtocolMessage.ResponseMode设为null,使得Azure AD回传IDToken时使用了查询字符串模式,而OpenIdConnect中间件默认只会从POST表单中读取IDToken做解析,因此无法完成身份签发逻辑,也就不会生成有效的认证Cookie。
  • 可选:Nuget包版本不兼容:你当前使用的Microsoft.IdentityModel.*系列包版本为5.3.0,和4.2.0版本的OWIN相关包存在已知的适配问题,可能导致Token解析后身份信息无法正确写入上下文。
解决方案
  1. 修正web.config配置
    在system.web节点下添加如下配置,禁用ASP.NET默认认证逻辑,完全交由OWIN处理:
<authentication mode="None" />
  1. 移除错误的ResponseMode配置
    删除RedirectToIdentityProvider事件中的context.ProtocolMessage.ResponseMode = null;代码,或者显式设置为form_post:
RedirectToIdentityProvider = context =>
{
    Debug.WriteLine("Redirecting to identity provider for sign in..");
    context.ProtocolMessage.EnableTelemetryParameters = false;
    // 删掉原有的清空ResponseMode代码,或者显式指定为form_post
    // context.ProtocolMessage.ResponseMode = null;
    context.ProtocolMessage.ResponseMode = "form_post";
    return Task.FromResult(0);
},
  1. 手动确认身份签发有效性(可选)
    在SecurityTokenValidated事件中手动指定身份的认证类型,确保ClaimsIdentity的IsAuthenticated属性为true:
SecurityTokenValidated = context =>
{
    Debug.WriteLine("Token validated..");
    var claimsIdentity = new ClaimsIdentity(
        context.AuthenticationTicket.Identity.Claims,
        CookieAuthenticationDefaults.AuthenticationType);
    context.AuthenticationTicket = new AuthenticationTicket(claimsIdentity, context.AuthenticationTicket.Properties);
    return Task.FromResult(0);
},
  1. 统一Nuget包版本(可选)
    将所有Microsoft.IdentityModel.*系列包升级到6.15.0以上的稳定版本,和4.2.0版本的OWIN包适配,避免版本兼容问题。

内容的提问来源于stack exchange,提问作者Mahajan344

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:12:02