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解析后身份信息无法正确写入上下文。
解决方案
- 修正web.config配置
在system.web节点下添加如下配置,禁用ASP.NET默认认证逻辑,完全交由OWIN处理:
<authentication mode="None" />
- 移除错误的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); },
- 手动确认身份签发有效性(可选)
在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); },
- 统一Nuget包版本(可选)
将所有Microsoft.IdentityModel.*系列包升级到6.15.0以上的稳定版本,和4.2.0版本的OWIN包适配,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Mahajan344
相关产品推荐
相关产品推荐

