代码之家  ›  专栏  ›  技术社区  ›  jimplode

c#.net核心SustainSys Saml2证书问题

  •  0
  • jimplode  · 技术社区  · 4 年前

    我在尝试向身份验证服务添加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);
                       });
    

    我得到的例外是: 系统。配置。ConfigurationErrorsException:“Idp上缺少签名证书配置”

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

    从元数据

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

    我正在寻找一个正确的方向,因为我没有找到。

    如果我尝试添加证书(如上所述),则没有提供私钥的异常。

    为什么?

    0 回复  |  直到 3 年前
        1
  •  2
  •   user14067465 user14067465    4 年前

    这个问题似乎是一个“鸡和蛋”的问题,其中为 LoadMetadata 在构建新的实例时执行不是“安全”的操作 IdentityProvider .

    这个 set 属性方法 身份提供者 也打电话 Validate() 反对你新建的 身份提供者 例子在这种情况下,你可以在这里看到 验证() 正在调用的方法: https://github.com/Sustainsys/Saml2/blob/develop/Sustainsys.Saml2/IdentityProvider.cs#L123 不要太担心,因为私人支持领域, loadMetadata ,已经 false (默认值)。

    这里的问题是,您还没有被赋予添加IdP签名证书的能力( idp.SigningKeys.Add(...) )之前 验证() 被称为。

    您需要:

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

    这应该能解决这个错误,让你走上正轨。

    顺便说一句,您的签名证书需要有私钥。我建议生成类似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);