如果未在服务集合中配置 .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 文件
options.SPOptions.ServiceCertificates.Add();这里.cer文件不是
接受,因为它也需要私钥。
- 如果我不配置这一行options.SPOptions.ServiceCertificates.Add();意味着没有证书然后注销在检查时不起作用
使用 IDP 初始化注销前的 serviceCertificate。
我的问题是
- 是否可以仅根据我们的客户配置 .cer 文件
出于安全原因不共享 pfx 文件?
- 如果 .cer 文件可行,那么我需要在哪里进行更改?
请推荐
要启用注销功能,需要具有私钥的证书才能签署出站注销请求。所以你需要一个.pfx.
但是您在这里混淆了两个不同的证书。您从 IdentityProvider 获得的 .cer 文件是代表其签名密钥的文件。他们永远不应该把那个私钥(.pfx 文件)给你。
ServiceCertificate 是代表您的应用程序的证书。这是您可以自己生成的东西。它不需要是购买的证书,您可以创建一个自签名的。然后与 IdentityProvider 共享库生成的元数据(可在 /Saml2 访问)——他们需要在他们的配置中注册。您还可以共享证书的 .cer 文件。永远不要共享 .pfx。
在我的一个项目中,我将 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 文件 options.SPOptions.ServiceCertificates.Add();这里.cer文件不是 接受,因为它也需要私钥。
- 如果我不配置这一行options.SPOptions.ServiceCertificates.Add();意味着没有证书然后注销在检查时不起作用 使用 IDP 初始化注销前的 serviceCertificate。
我的问题是
- 是否可以仅根据我们的客户配置 .cer 文件 出于安全原因不共享 pfx 文件?
- 如果 .cer 文件可行,那么我需要在哪里进行更改? 请推荐
要启用注销功能,需要具有私钥的证书才能签署出站注销请求。所以你需要一个.pfx.
但是您在这里混淆了两个不同的证书。您从 IdentityProvider 获得的 .cer 文件是代表其签名密钥的文件。他们永远不应该把那个私钥(.pfx 文件)给你。
ServiceCertificate 是代表您的应用程序的证书。这是您可以自己生成的东西。它不需要是购买的证书,您可以创建一个自签名的。然后与 IdentityProvider 共享库生成的元数据(可在 /Saml2 访问)——他们需要在他们的配置中注册。您还可以共享证书的 .cer 文件。永远不要共享 .pfx。