您能否更具体地说明例外情况?
如果您正在构建 ASP.NET MVC .NET 4.7.2 解决方案,您应该使用 ITfoxtec.Identity.Saml2.Mvc 版本 3.0.0 包。我希望它不在 .NET Core 应用程序中。
你可以找到她的例子:https ://github.com/ITfoxtec/ITfoxtec.Identity.Saml2/tree/master/test
更新:作为依赖方的 ITfoxtec Identity Saml2 组件可以使用或不使用 IdP 元数据进行配置。
使用 IdP 元数据
IdP 信任配置只需要元数据:
<add key="Saml2:IdPMetadata" value="https://localhost:44305/metadata"/>
IdP 元数据的加载IdentityConfig.RegisterIdentity()
方式如下:
var entityDescriptor = new EntityDescriptor();
entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(ConfigurationManager.AppSettings["Saml2:IdPMetadata"]));
if (entityDescriptor.IdPSsoDescriptor != null)
{
Saml2Configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices.First().Location;
Saml2Configuration.SingleLogoutDestination = entityDescriptor.IdPSsoDescriptor.SingleLogoutServices.First().Location;
Saml2Configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
}
else
{
throw new Exception("IdPSsoDescriptor not loaded from metadata.");
}
元数据可以在线加载ReadIdPSsoDescriptorFromUrl(...)
或从文件ReadIdPSsoDescriptorFromFile(...)
或字符串加载ReadIdPSsoDescriptor(...)
配置没有元数据的 IdP
IdP 信任需要 IdP 登录和注销端点以及 IdP 签名证书:
<add key="Saml2:SingleSignOnDestination" value="https://some-idp.test.com/login/"/>
<add key="Saml2:SingleLogoutDestination" value="https://some-idp.test.com/logout/"/>
<add key="Saml2:SignatureValidationCertificate" value="~/App_Data/IdP_signing_certificate.crt"/>
IdP 配置是IdentityConfig.RegisterIdentity()
这样加载的:
Saml2Configuration.SingleSignOnDestination = new Uri(ConfigurationManager.AppSettings["Saml2:SingleSignOnDestination"]);
Saml2Configuration.SingleLogoutDestination = new Uri(ConfigurationManager.AppSettings["Saml2:SingleLogoutDestination"]);
Saml2Configuration.SignatureValidationCertificates.Add(CertificateUtil.Load(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["Saml2:SignatureValidationCertificate"])));
依赖方标识符
unik 依赖方标识符:
<add key="Saml2:Issuer" value="urn:itfoxtec:identity:saml2:testwebapp"/>
签署证书
所需的签名算法很可能是 SHA-256:
<add key="Saml2:SignatureAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
而不是从这样的文件中加载签名证书:
<add key="Saml2:SigningCertificateFile" value="~/App_Data/itfoxtec.identity.saml2.testwebapp_Certificate.pfx"/>
<add key="Saml2:SigningCertificatePassword" value="!QAZ2wsx"/>
可以通过 Windows 证书存储中的指纹或 Azure 应用服务中的 TLS 证书加载证书:
<add key="SigningCertificateThumbprint" value="XXXXX...XXXXX"/>
然后IdentityConfig.RegisterIdentity()
需要更改为通过指纹加载证书:
Saml2Configuration.SigningCertificate = CertificateUtil.Load(StoreName.My, StoreLocation.CurrentUser, X509FindType.FindByThumbprint, ConfigurationManager.AppSettings["Saml2:SigningCertificateThumbprint"]);
证书验证
如果需要,可以验证 IdP 证书链和吊销。
通常不验证证书链和吊销:
<add key="Saml2:CertificateValidationMode" value="None"/>
<add key="Saml2:RevocationMode" value="NoCheck"/>
它需要验证证书链和吊销:
<add key="Saml2:CertificateValidationMode" value="ChainTrust"/>
<add key="Saml2:RevocationMode" value="Online"/>