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

Sustainsys.Saml2集成Azure IDP时Saml2/Acs路由返回404问题

解决Sustainsys.Saml2与自定义Acs路由冲突导致的404问题

问题根源

Sustainsys.Saml2库会自动注册/Saml2/Acs作为SAML回调端点,这个端点由库的中间件负责处理,而且仅接受符合SAML规范的POST请求(携带SAMLResponse参数)。你手动用GET访问或者Postman发非SAML格式的请求时,库的中间件不会处理,直接返回404;同时你自己写的同名控制器路由会被库的中间件覆盖,根本不会生效。

解决办法

方案1:改用库原生Acs端点,在登录成功后转发到Vue客户端

这是最省心的方案,不用自己处理复杂的SAML响应验证逻辑:

  1. 删掉自定义控制器中/Saml2/Acs的路由,保留登录发起的逻辑即可。
  2. 配置库的Saml2Events,在认证完成后将用户信息或令牌传递给Vue客户端:
services.AddSaml2(options =>
{
    // 保留你的Azure IDP配置、SP EntityId等原有配置
    options.SPOptions.AssertionConsumerServices.Add(
        new ServiceLocation("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", 
        new Uri("https://sp.example.com/Saml2/Acs")));
})
.AddSaml2Events(events =>
{
    events.OnAuthenticated = async context =>
    {
        // 从context中获取SAML响应或用户身份信息
        var userPrincipal = context.Principal;

        // 生成Vue客户端需要的令牌(比如JWT)或组装参数
        var clientToken = GenerateYourClientToken(userPrincipal);

        // 重定向到Vue的回调页面,携带参数
        context.Response.Redirect($"https://your-vue-domain.com/auth-callback?token={clientToken}");
        await Task.CompletedTask;
    };
});
  1. 测试时不要手动GET访问/Saml2/Acs,正常走登录流程:Vue跳转到SP的登录发起路由,SP重定向到Azure IDP,登录完成后Azure会自动POST到/Saml2/Acs,库处理后会跳转到你的Vue页面。

方案2:修改库的端点前缀,释放自定义路由

如果必须用自己的Acs控制器处理回调:

  1. 修改Sustainsys.Saml2的模块路径,让库的端点前缀和你的自定义路由不冲突:
services.AddSaml2(options =>
{
    // 将库的端点前缀改为/Saml2Library,这样库的Acs路径变为/Saml2Library/Acs
    options.SPOptions.ModulePath = "/Saml2Library";
    // 同步更新配置中的AssertionConsumerServiceUrl为新的库端点地址
    options.SPOptions.AssertionConsumerServices.Add(
        new ServiceLocation("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", 
        new Uri("https://sp.example.com/Saml2Library/Acs")));
})
  1. 保留你自定义的Saml2Controller中的/Saml2/Acs路由,此时这个路由不会被库占用,手动访问或Postman请求就能走到你的控制器逻辑。
  2. 注意:自定义Acs控制器需要自行实现SAML响应的验证(签名、断言解析等),这部分逻辑复杂,建议优先用方案1。

方案3:调整自定义控制器的路由

直接把自定义Acs的路由改成其他名称,比如/Saml2/CustomAcs,然后更新配置文件中的AssertionConsumerServiceUrl为https://sp.example.com/Saml2/CustomAcs,这样库不会占用这个新路由,你的控制器可以正常处理回调。同样需要自行处理SAML响应验证。

关键注意点

  • Sustainsys.Saml2的原生/Saml2/Acs只接受POST请求且必须携带合法的SAMLResponse参数,手动GET访问必然返回404,这是正常行为,不是BUG。
  • 路由冲突的核心是库的中间件优先级高于MVC控制器,会先匹配并处理/Saml2/Acs路径的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:10:33