.NET Core 3.1集成SAML2实现Web SSO接收断言返回400错误求助
根本原因
该400错误由ASP.NET Core框架层的默认安全拦截规则触发,请求未到达你的SAML断言处理业务代码,和SAML证书配置、断言内容正确性无关。
解决方案
按优先级排查修改:
- 关闭回调接口的防伪令牌校验
ASP.NET Core默认对所有POST请求校验站点生成的防伪令牌,Okta回调的SAML POST请求不会携带该令牌,会直接触发校验失败返回400。给/Identity/Account/saml对应的Action方法添加[IgnoreAntiforgeryToken]特性即可。 - 配置回调接口允许匿名访问
如果你使用了ASP.NET Core Identity的默认认证规则,未登录状态下的请求会被拦截。给回调Action添加[AllowAnonymous]特性,允许未登录用户访问该接口。 - 调大请求内容长度限制
如果SAML断言携带较多自定义属性,XML体积超过默认请求大小限制也会返回400,可在Startup.cs/Program.cs中添加全局配置:
services.Configure<FormOptions>(options => { options.ValueLengthLimit = int.MaxValue; options.MultipartBodyLengthLimit = int.MaxValue; });
如果是IIS托管,还需要在web.config中添加配置:
<system.web> <httpRuntime maxRequestLength="1048576" /> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.web>
- 关闭XSS内容校验
ASP.NET Core默认会拦截包含XML/HTML标记的请求内容,SAML断言的XML格式会触发该规则,给回调Action添加[ValidateInput(false)]特性即可。
所有配置修改完成后,请求即可正常进入你的业务代码,后续再进行SAML断言的解析、证书校验等逻辑即可。
内容的提问来源于stack exchange,提问作者Lars Siden
相关产品推荐
相关产品推荐

