.NET框架/.NET Core生成SAP应用签名SAML断言及项目查询
在.NET环境生成SAP用的签名SAML断言
核心结论
完全可以在.NET Framework和.NET Core环境中生成符合SAP要求的SAML断言,并使用私钥完成签名。
可用工具与库
Sustainsys.Saml2
你提到的Stub IDP项目大概率是Sustainsys.Saml2早期的示例项目,现在该项目的核心功能已整合到官方主库中,无需单独寻找Stub IDP仓库,直接使用主库即可实现断言生成与签名:
- .NET Framework:通过NuGet包
Sustainsys.Saml2引用 - .NET Core/.NET 5+:使用
Sustainsys.Saml2.AspNetCore2(适配ASP.NET Core)或Sustainsys.Saml2核心包
其他可选库
ITfoxtec.Identity.Saml2:成熟的SAML 2.0库,对.NET全平台支持友好,可轻松生成签名断言
实现步骤(以Sustainsys.Saml2为例)
安装依赖包
- .NET Framework:
Install-Package Sustainsys.Saml2 - .NET Core:
Install-Package Sustainsys.Saml2.AspNetCore2
- .NET Framework:
生成并签名SAML断言
以下是简化代码示例,需根据SAP的具体配置调整断言属性:using Sustainsys.Saml2; using Sustainsys.Saml2.Configuration; using Sustainsys.Saml2.Saml2P; using System.Security.Cryptography.X509Certificates; // 加载用于签名的私钥证书(可从文件或密钥库读取) var signingCert = new X509Certificate2("path-to-private-key.pfx", "cert-password"); // 配置IDP元数据(需匹配SAP SP的要求) var idpConfig = new IdentityProvider(new EntityId("your-idp-entity-id")) { SigningKeys = { new X509Certificate2SecurityKey(signingCert) } }; // 创建断言 var assertion = new Saml2Assertion(new EntityId("your-idp-entity-id")) { Subject = new Saml2Subject(new Saml2NameIdentifier("user-id", NameIdentifierFormats.Unspecified)), Conditions = new Saml2Conditions { NotBefore = DateTime.UtcNow.AddMinutes(-5), NotOnOrAfter = DateTime.UtcNow.AddMinutes(10), AudienceRestrictions = { new Saml2AudienceRestriction(new EntityId("sap-sp-entity-id")) } }, // 添加SAP要求的属性(比如用户姓名、邮箱等) AttributeStatements = { new Saml2AttributeStatement { Attributes = { new Saml2Attribute("FirstName", "John"), new Saml2Attribute("LastName", "Doe") } } } }; // 对断言进行签名 assertion.Sign(idpConfig.SigningKeys.First()); // 将断言序列化为XML字符串,用于发送给SAP var xml = assertion.ToXml();
SAP适配注意事项
- 确认SAP Service Provider的实体ID、断言消费者服务(ACS)地址等元数据信息,确保断言中的受众、目标地址匹配
- SAP通常要求NameID格式为
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress或特定格式,需根据SAP配置调整 - 签名算法需与SAP要求一致(通常为
http://www.w3.org/2001/04/xmldsig-more#rsa-sha256)
关于Sustainsys Stub IDP
早期的Stub IDP是Sustainsys.Saml2的测试用示例IDP项目,现在该示例已整合到Sustainsys.Saml2的官方仓库示例中,你可以直接基于主库的核心API自行实现类似Stub IDP的功能,或参考官方示例项目中的IDP实现代码。
内容的提问来源于stack exchange,提问作者TheWebGuy
相关产品推荐
相关产品推荐

