通过Saml2PostBinding启动SingleSignOn

通过Saml2PostBinding启动SingleSignOn,post,saml-2.0,asp.net-core-3.0,itfoxtec-identity-saml2,Post,Saml 2.0,Asp.net Core 3.0,Itfoxtec Identity Saml2,我在使用ITfoxtec for ASP.NET Core 3.0时遇到问题 作为上下文,我试图在Web应用程序和第三方登录服务之间建立连接。为了事先封装一些可能性,第三方可以访问我们的元数据url,并为我们的Web应用程序配置他们的服务 所需的用户工作流: 用户进入webapplication 用户单击一个按钮,将用户重定向到登录服务 用户登录服务并重定向回给定的返回URL 之后,webapplication将根据提供的sso cookie确定权限 迄今采取的步骤: 在appsettin

我在使用ITfoxtec for ASP.NET Core 3.0时遇到问题
作为上下文,我试图在Web应用程序和第三方登录服务之间建立连接。为了事先封装一些可能性,第三方可以访问我们的元数据url,并为我们的Web应用程序配置他们的服务

所需的用户工作流:

  • 用户进入webapplication
  • 用户单击一个按钮,将用户重定向到登录服务
  • 用户登录服务并重定向回给定的返回URL
  • 之后,webapplication将根据提供的sso cookie确定权限
迄今采取的步骤:

  • 在appsettings.json中添加了Saml2部分,其中包含我们的metadata.xml和issuer。颁发者名称等于metadata.xml中提供的给定EntityID。它在给定上下文中是匿名的,如下所示:
  • 在startup.cs中添加Saml2Configuration

如果需要,将Authn请求更改为Post绑定是正确的

您的应用程序是服务提供商(也称为依赖方),需要在身份提供商处使用唯一的颁发者名称对其进行配置


我认为问题在于您配置的发卡机构名称(
“发卡机构”:“myIssuerName”
)不正确。发卡机构名称应该是您的服务提供商发卡机构名称,而不是metadata.xml中的身份提供商发卡机构名称。

使用Post绑定确实有效,但是每当我发起呼叫时,我似乎得到一个表单,而按钮被标记隐藏。有没有一种方法可以立即提交表单而不必以编程方式删除这些标记?还是我必须事先启动后期绑定?此外,服务提供商提供的元数据在我这边被误解了。我已经实现了ITfoxtec元数据控制器来导出我自己的元数据,之后我将元数据提供给我的身份提供者进行签名和验证。除非禁用JavaScript,否则后绑定表单将由JavaScript自动提交。因此,我认为JavaScript在客户端浏览器中被禁用。您可以尝试使用其他浏览器进行测试,或者您正在服务器上运行该浏览器。我怀疑它与客户端浏览器相关。如果检查我的Chrome或Mozilla浏览器选项,我可以看到它们在两种浏览器的选项中都已启用。是不是.NETCore使用SpaStaticFiles托管Angular文件,因此被视为在服务器上运行的浏览器?不管怎样,ITfoxtec.Identity.SAML如何检查是否启用了JavaScript,以便我可以防止这种情况发生?我没有听说其他人在自动提交方面有问题,恐怕我没有一个好的答案。如果禁用JavaScript,则应显示一个按钮,否则它将被标记隐藏。如果你找到了一个更好的方式做自动提交,请告诉我。但据我所知,它应该可以工作。作为一种解决方法,我在前端过早地添加了表单,并在页面加载时请求Saml2PostBinding。请求完成后,我将SAMLRequest值放入表单中,每当用户单击登录按钮时,我都会提交表单。它可以工作,幸运的是似乎没有黑客攻击,并为每次尝试提供了一个新签名。然而,这有点破坏了自动提交的目的。
"Saml2": {
    "IdPMetadata": "wwwroot/SAML/Metadata.xml",
    "Issuer": "myIssuerName",
    "SignatureAlgorithm": "http://www.w3.org/2000/09/xmldsig#rsa-sha1",
    "CertificateValidationMode": "ChainTrust",
    "RevocationMode": "NoCheck",
    "SigningCertificateFile": "\\licenses\\certificate.pfx",
    "SigningCertificatePassword": "password1"
}, 
    services
        .Configure<Saml2Configuration>(Configuration.GetSection("Saml2"))
        .Configure<Saml2Configuration>(configuration =>
        {
            configuration.SigningCertificate = CertificateUtil.Load(
                 $"{Environment.WebRootPath}{Configuration["Saml2:SigningCertificateFile"]}",
                 Configuration["Saml2:SigningCertificatePassword"]);
            configuration.AllowedAudienceUris.Add(configuration.Issuer);

            var entityDescriptor = new EntityDescriptor();
                entityDescriptor.ReadIdPSsoDescriptorFromFile(Configuration["Saml2:IdpMetadata"]);

            if (entityDescriptor.IdPSsoDescriptor == null) throw new Exception("Failed to read the metadata.");

            configuration.SignAuthnRequest = true;
            configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices
               .Where(ed => ed.Binding.ToString() == "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST")
               .First().Location;
            configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
        }); 
    public IActionResult Initiate([FromQuery(Name = "returnUrl")] string returnUrl = "")
    {
        var binding = new Saml2PostBinding();
            binding.SetRelayStateQuery(new Dictionary<string, string> { { "ReturnUrl", returnUrl } });
            binding.Bind(new Saml2AuthnRequest(_saml2configuration)
            {
                ForceAuthn = false,
                IsPassive = false,
                NameIdPolicy = new NameIdPolicy() { AllowCreate = true },
                AssertionConsumerServiceUrl = new Uri("https://localhost:44366/api/Authentication/Process"),
            });

        return binding.ToActionResult();
    } 
    :authority: myEntityDescriptorName
    :method: POST
    :path: mySsoURL
    :scheme: https
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    accept-encoding: gzip, deflate, br
    accept-language: nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7
    cache-control: no-cache
    content-length: 3582
    content-type: application/x-www-form-urlencoded
    cookie: JSESSIONID=3D5FE88D55674C2F1E3646E6D8A0FFBE
    origin: https://localhost:44366
    pragma: no-cache
    referer: https://localhost:44366/
    sec-fetch-mode: navigate
    sec-fetch-site: cross-site
    sec-fetch-user: ?1
    upgrade-insecure-requests: 1
    user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36