【问题标题】:Certificate issues when adding an IDP to an authentication service将 IDP 添加到身份验证服务时出现证书问题
【发布时间】:2020-05-06 10:39:31
【问题描述】:

我在尝试将 idp 添加到身份验证服务时遇到问题。

我的客户正在使用 forgerock 登录,并希望我们将 SSO 与 SAML 一起使用。

我在一个旧项目中使用 Jitbit 的简单 SAML 2.0 组件,用于 ASP.NET https://github.com/jitbit/AspNetSaml/

但我正在使用 identityserver4 在 .net 核心中重新设计我的应用程序,并希望利用带有额外花里胡哨的 Sustainsys 实现。

SSO 登录的类型是带有 ACS 回调的简单重定向。

我掌握的信息: SamlEndpoint - 要重定向到的 URL EntityId - 我的实体 ID AcsUrl - 要返回的 URL 证书(字符串)(取自元数据,不公开)

我已尝试执行以下操作:

services.AddAuthentication()
            .AddSaml2(Saml2Defaults.Scheme,
                   options =>
                   {
                       options.SPOptions.EntityId = new EntityId("{MyEntityId}");
                       options.SPOptions.ReturnUrl = new Uri($"ACS URL");
                       options.SPOptions.AuthenticateRequestSigningBehavior = Sustainsys.Saml2.Configuration.SigningBehavior.Never;
                       //options.SPOptions.ServiceCertificates.Add(new ServiceCertificate { 
                       //    Use = CertificateUse.Signing, 
                       //    Certificate = new X509Certificate2(bytes), 
                       //    Status = CertificateStatus.Current 
                       //});
                       var idp =
                           new IdentityProvider(new EntityId("IDP ID"), options.SPOptions)
                           {                                   
                               Binding = Sustainsys.Saml2.WebSso.Saml2BindingType.HttpRedirect,
                               LoadMetadata = false,
                               AllowUnsolicitedAuthnResponse = true, 
                               SingleSignOnServiceUrl = new Uri("Redirect URL") 
                           };
                       options.IdentityProviders.Add(idp);
                   });

我得到的例外是: System.Configuration.ConfigurationErrorsException: '缺少 Idp 上的签名证书配置

但是我看不到如何添加我的证书?因为它没有私钥/公钥:

来自元数据

<ds:X509Data>                    
    <ds:X509Certificate>
        MIIDYTCCAk..........7tOxUus=                    
    </ds:X509Certificate>                
</ds:X509Data>

寻找正确的方向,因为我无法解决问题。

如果我尝试添加证书(上面已注释掉),那么我没有提供任何私钥异常。

为什么?

【问题讨论】:

    标签: c# .net-core identityserver4 sustainsys-saml2


    【解决方案1】:

    这个问题似乎是一个“鸡和蛋”问题,在构造IdentityProvider 的新实例时,为LoadMetadata 分配值不是一个“安全”的操作。

    IdentityProviderset 属性方法还针对您新构建的 IdentityProvider 实例调用 Validate()。在这种情况下,您可以在此处看到正在调用的 Validate() 方法: https://github.com/Sustainsys/Saml2/blob/develop/Sustainsys.Saml2/IdentityProvider.cs#L123。不用太担心,因为私有支持字段 loadMetadata 已经是 false(默认值)。

    这里的问题是,在调用 Validate() 之前,您还不能添加 IdP 签名证书 (idp.SigningKeys.Add(...))。

    你需要:

    1. 创建您的idp,尚未设置LoadMetadata
    2. 添加您的签名密钥或进行您需要的任何其他配置设置
    3. 如果需要,您可以显式设置LoadMetadata(在您的情况下是可选的,因为它已经是false

    这应该可以解决此错误并让您上路。

    顺便说一句,您的签名证书需要有一个私钥。我建议生成类似 PFX(PKCS#12、PKCS#8 等)的东西,您可以将该文件直接导入到 X509Certificate2 并设置密码,请务必使用 MachineKeySet | Exportable 设置选项,以便您的私人密钥可访问:例如

    byte[] pfx = null; // TODO: Get your actual certificate, read from file, DB, memory, etc.
    var signingCert = new X509Certificate2(
        pfx,
        "password",
        X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-01
      • 2021-06-21
      • 2014-12-25
      • 2011-03-17
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2012-02-28
      相关资源
      最近更新 更多