当前位置: 首页 > 知识库问答 >
问题:

Sustainsys.Saml2-Saml2/Acsendpoint在处理SSO时返回错误500

习高格
2023-03-14

我创建了一个C#ASP.NETCore6.0应用程序,并尝试使用Sustainsys使用Azure AD实现SSO。Saml2,特别是Sustainsys.Saml2.AspNetCore2软件包。在使用localhost在我的开发机器上测试了该实现之后,我可以看到它按预期工作,并对用户进行身份验证,填充身份模型,并重定向到正确的URL。

然而,当使用停靠版本部署到测试环境中时,行为会发生变化。触发SSO时,用户在Azure中成功通过身份验证,但当返回应用程序时,它在Saml2/Acsendpoint返回错误500。查看日志不会显示任何错误,而是报告用户的身份验证成功。

Program.cs配置:

 builder.Services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = "Saml2";
    })
    .AddSaml2(options =>
    {
        var logger = new LoggerFactory();
        options.SPOptions.Logger = new AspNetCoreLoggerAdapter(logger.CreateLogger<Saml2Handler>());

        options.SPOptions.EntityId = new EntityId(AppConfig.Saml_EntityID);
        options.IdentityProviders.Add(
            new IdentityProvider(new EntityId(AppConfig.Saml_AzureID), options.SPOptions)
            {
                Binding = Saml2BindingType.HttpRedirect,
                LoadMetadata = true,
                MetadataLocation = AppConfig.Saml_Metadata,
                DisableOutboundLogoutRequests = false,
                AllowUnsolicitedAuthnResponse = true                
            });
    
        options.SPOptions.PublicOrigin = new Uri(AppConfig.BaseUrl);
        options.SPOptions.ReturnUrl = new Uri(AppConfig.BaseUrl);

        options.SPOptions.WantAssertionsSigned = true;
        options.SPOptions.AuthenticateRequestSigningBehavior = SigningBehavior.Always;
        options.SPOptions.ServiceCertificates.Add(new X509Certificate2(AppConfig.Saml_Cert_Path));
    })
    .AddCookie();

在对问题进行故障排除时,我偶然发现了一些令人困惑的行为,这些行为可能表明也可能不表明问题所在。如果我按照以下步骤操作,我最终可能会达到用户经过身份验证并可以使用应用程序的位置:

    < li >单击"登录"以触发Saml认证。 < li >在Saml2/Acs中显示错误500。 < li >单击“刷新”,然后单击“继续”重新提交请求。 < li >然后浏览器继续访问指定的URL,但显示“连接被拒绝” < li >使用浏览器的后退按钮返回到应用程序主页,并刷新页面...维奥拉。登录了!

此外,当检查Saml2/Acsendpoint上的请求头时,我可以看到返回了一个Saml响应,我可以从base64手动解码并读取正确的信息!

如上所述,日志没有提到任何错误,只是:

Initiating login to https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/

Successfully processed SAML response _ba082bb8-7d2c-4aa4-a7dc-b1520312d084 and authenticated a*******@********.com

任何帮助或对解决方案的指导将不胜感激!

共有1个答案

魏雅惠
2023-03-14

也许这与。Net Core,但是对于。net framework 4.8存在以下问题:

>

  • 服务提供商的返回URL错误:http://locahost/mysite/saml2/acs而不是正确的http://locahost/mysite/(带尾随斜杠)。因此,有一个不确定的循环http://locahost/mysite/saml2/acs`.

    SPOptions SPOptions=new SPOptions(){EntityId=new EntityId(spMetadataUrl),ReturnUrl=new Uri(hostUrl/),DiscoveryServiceUrl=new Uri(hostUrl@/DiscoveryService),Organization=Organization,AuthenticateRequestSigningBehavior=SigningBevior。从不,RequestedAuthnContext=RequestedAuthnContext,Logger=Logger,PublicOrigin=hostUri}

    请勿使用 UseExternalSignInCookie mehod,否则不会为当前线程设置 ClaimPrincipal(Cookie 将被解析为 claims,尽管后者不会被设置,但这可以通过下面的代码进行检查):

    < code > SAML 2 authenticationoptions options = createsaml 2 options(配置,证书);选项。sp options . SAML 2 psecuritytokenhandler = new mysaml 2 psecuritytokenhandler();

         public class MySaml2PSecurityTokenHandler : Sustainsys.Saml2.Saml2P.Saml2PSecurityTokenHandler
            {
                protected override ClaimsIdentity CreateClaimsIdentity(Saml2SecurityToken samlToken, string issuer, TokenValidationParameters validationParameters)
                {
                    ClaimsIdentity identity = base.CreateClaimsIdentity(samlToken, issuer, validationParameters);
                    Claim claim = new Claim("Name", "jon.doe");
                    Claim[] claims = new Claim[] { claim };
                    identity.AddClaims(claims);
        
                    return identity;
                }
        }
    

    此外,仅对于Net Framework 4.8,由于owin vs System.Web cookies错误,应使用CookieManager。法典:

    var cookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebCookieManager();    
    
                Saml2AuthenticationOptions options = CreateSaml2Options(configuration, certificate);
    
                CookieAuthenticationOptions cookieAuthentication = new CookieAuthenticationOptions()
                {
                    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                    LoginPath = new PathString(configuration.ServiceProviderSignOnUrl),
                    CookieManager = сookieManager,
                    ReturnUrlParameter = GetBase() + "/",
    
                    Provider = new CookieAuthenticationProvider()
                    {
                        // Enables the application to validate the security stamp when the user logs in.
                        // This is a security feature which is used when you change a password or add an external login to your account.
    
                        OnValidateIdentity = (context) =>
                            {
                                var newIdentity = new ClaimsIdentity(context.Identity);
                                int newcount = 1;
                                newIdentity.AddClaim(new Claim("SIMPLECOUNT", newcount.ToString()));
                                context.ReplaceIdentity(newIdentity);
    
                                return Task.FromResult<object>(null);
                            }
                    }
                };
    
                app.UseCookieAuthentication(cookieAuthentication);
                app.SetDefaultSignInAsAuthenticationType(cookieAuthentication.AuthenticationType);
    
                //app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
                app.UseSaml2Authentication(options);
    

  •  类似资料:
    • 问题内容: 我正在解析json数据。我的解析没有问题,我正在使用模块。但是某些api请求返回空值。这是我的示例: 这是我解析json对象的代码段: 正如我提到的一些请求,我得到以下错误: 处理此错误的最佳方法是什么? 问题答案: Python编程中有一条规则叫做“求宽容比求许可要容易”(简而言之:EAFP)。这意味着您应该捕获异常,而不是检查值的有效性。 因此,请尝试以下操作: 编辑 :由于实际上

    • 1.API 返回结构 返回结果(response)分为:状态码(status code)、头部(headers)、消息体(body)。其中算法的结果会以 JSON 格式放在消息体中。 如何从 HTTP 返回中分别获取这三部分信息,请参见所用 HTTP 库的文档。 解析 JSON 格式需要寻找所用语言的 JSON 库,参见 http://www.json.org/ 2.正常结果 状态码为 2xx的为

    • 基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par

    • 主要内容:本节引言:,1.页面错误,加载自定义网页:,2.页面错误,显示相应的View,3.示例代码下载:,本节小结:本节引言: 嘿嘿,假如你们公司是做HTML5端的移动APP的,就是通过WebView来显示网页的,假如你访问的网页 不存在,或者其他错误,报404,401,403,30X等错误的状态码,如果直接弹出WebView默认的错误 提示页面,可能显得不那么友好,我们可以重写WebViewClient的onReceivedError()方法来实现我们 想要的效果,一般的做法有两种,一种是:

    • 我在Spring Boot服务中有一个rest控制器,如下所示: 我可以让服务生成八位元组流和application/Json,但我的困惑在于出现错误时字节数组的返回类型,在这种情况下,我希望生成Json而不是字节数组 请给我出主意如何解决这个问题

    • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp