如果未在服务集合中配置 .pfx 文件,Sustainsys.Saml2 注销不起作用

Sustainsys.Saml2 logout not working if .pfx file not configured in service collection

在我的一个项目中,我将 Sustainsys.Saml2 库与使用 identityserver4 的 asp.net 核心应用程序一起使用,我找不到合适的配置文档,因此将启动配置如下:

.AddSaml2(option =>
             {
                 option.Notifications.SelectIdentityProvider =
                  (id, data) => GetProvider(option, tenant); // here we are passing dynamic provider  
                 option.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                 option.SignOutScheme = IdentityServerConstants.DefaultCookieAuthenticationScheme;
                 option.SPOptions.EntityId = new Sustainsys.Saml2.Metadata.EntityId(samlEntityId);
             });

private static IdentityProvider GetProvider(IOptions options, Web.Application.Service.ITenantHandler tenant)
        {

            TenantDetail tenantDetail = tenant.GetTenantDetail();
            var entityId = tenantDetail.SSOSettings.ADFSRelyingPartyUrl;
            var idp =
                 new IdentityProvider(new EntityId(entityId), options.SPOptions)
                 {
                     LoadMetadata = true,
                     MetadataLocation = $"{tenantDetail.SSOSettings.ADFSMetaDataUrl}",
                     WantAuthnRequestsSigned = false,
                     DisableOutboundLogoutRequests = false,
                     AllowUnsolicitedAuthnResponse = false,
                     Binding = Sustainsys.Saml2.WebSso.Saml2BindingType.HttpRedirect,
                 };
            idp.SigningKeys.AddConfiguredKey(new X509Certificate2(tenantDetail.SSOSettings.SigningCertificate));
            var existingEntityProvider = options.IdentityProviders.KnownIdentityProviders.FirstOrDefault(x => x.EntityId.Id == entityId);
            if (existingEntityProvider != null)
                options.IdentityProviders.Remove(existingEntityProvider.EntityId);
            options.IdentityProviders.Add(idp);

            options.SPOptions.ServiceCertificates.Add(new ServiceCertificate
            {

                Certificate = new X509Certificate2(tenantDetail.SSOSettings.SigningCertificate, tenantDetail.SSOSettings.SigningPassword),
                Use = CertificateUse.Signing,
                Status = CertificateStatus.Current,
            });
           
            return idp;
        }

此配置适用于以下情况

我的问题是

要启用注销功能,需要具有私钥的证书才能签署出站注销请求。所以你需要一个.pfx.

但是您在这里混淆了两个不同的证书。您从 IdentityProvider 获得的 .cer 文件是代表其签名密钥的文件。他们永远不应该把那个私钥(.pfx 文件)给你。

ServiceCertificate 是代表您的应用程序的证书。这是您可以自己生成的东西。它不需要是购买的证书,您可以创建一个自签名的。然后与 IdentityProvider 共享库生成的元数据(可在 /Saml2 访问)——他们需要在他们的配置中注册。您还可以共享证书的 .cer 文件。永远不要共享 .pfx。