使用 ITfoxtec.Identity.Saml2 登录用户

Posted

技术标签:

【中文标题】使用 ITfoxtec.Identity.Saml2 登录用户【英文标题】:Use ITfoxtec.Identity.Saml2 to login user 【发布时间】:2021-06-09 17:43:42 【问题描述】:

我正在尝试使用 IdentityServer4 和 ITfoxtec.Identity.Saml2 库实现 SAML2.0 身份验证。

第一步是通过 LDAP 连接登录,这部分运行良好,我得到了用户声明。

下一步是使用 AD FS 集成登录

我主要遵循本教程

https://developer.okta.com/blog/2020/10/23/how-to-authenticate-with-saml-in-aspnet-core-and-csharp

下面是Saml配置代码

services.Configure<Saml2Configuration>(saml2Configuration =>

    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

    var entityDescriptor = new EntityDescriptor();
    entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(Configuration["Saml2:IdPMetadata"]));
    if (entityDescriptor.IdPSsoDescriptor != null)
    
        saml2Configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices.First().Location;
        saml2Configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
    
    else
    
        throw new Exception("IdPSsoDescriptor not loaded from metadata.");
    
);

services.AddSaml2();

在服务器重定向之后和显示 Idp 登录页面之前,我有一个错误“证书在应用程序端没有正确配置”

这是我第一次处理 SAML 协议。任何帮助表示赞赏。

编辑:错误在 AD FS 端

【问题讨论】:

【参考方案1】:

有关更多信息,请访问 ITfoxtec.Identity.Saml2 documentation 和 ASP.NET Core sample。

我不确定您在哪里看到错误。是在 IdentityServer4 应用程序中还是在 AD FS 中?

您显示的配置读取 AD FS 元数据并设置 IdP 配置。您还需要加载依赖方配置。

services.Configure<Saml2Configuration>(Configuration.GetSection("Saml2"));

并设置依赖方签名证书,例如,像这样

saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
            Configuration["Saml2:SigningCertificateFile"]), 

一起配置

services.Configure<Saml2Configuration>(Configuration.GetSection("Saml2"));
services.Configure<Saml2Configuration>(saml2Configuration =>

    saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]);
    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

var entityDescriptor = new EntityDescriptor();
    entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(Configuration["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.");
    
);
services.AddSaml2();  

备注

为了解决像您这样的情况,我创建了FoxIDs,它支持 OpenID Connect,并且可以使用 SAML 2.0 连接到 AD FS。 FoxIDs 处理 OpenID Connect 和 SAML 2.0 之间的转换。实际上,FoxID 也使用 ITfoxtec.Identity.Saml2 库。

【讨论】:

感谢您的回复。我已经测试了此更改,并且在 ITfoxtec 签名证书中不存在 RSA 私钥或缺少私钥读取凭据 上有另一条错误消息。 您尝试用于签名的证书仅包含公钥。您需要包含私钥的证书。例如,一个 .pfx 文件。

以上是关于使用 ITfoxtec.Identity.Saml2 登录用户的主要内容,如果未能解决你的问题,请参考以下文章

ITfoxtec.Identity.Saml2 无效 URI 问题

itfoxtec-identity-saml2 中的方法 ValidateRelyingParty 从哪里派生?

ITfoxtec SAML 2.0 - 单次注销

如何在 itfoxtec 中支持工件绑定?

如何读取加密的断言?

InvalidSignatureException:签名无效