如何在.NET Core微服务中从ADFS获取SAML令牌
.NET Core中获取ADFS SAML令牌的适配方案
你的.NET Core微服务需要调用依赖SAML令牌的外部服务,现有.NET Standard的实现逻辑需要适配.NET Core环境,以下是具体方案:
原代码的适配说明
原代码依赖的WSTrustChannelFactory属于WSTrust协议实现,在.NET Core中需要通过NuGet引入相关组件,且部分API引用路径有调整,以下是修正后的可运行代码:
1. 安装必要NuGet包
需要安装两个核心包:
Microsoft.IdentityModel.Protocols.WSTrust:提供WSTrust协议相关的类型System.ServiceModel.Primitives:提供EndpointAddress等WCF基础类型
2. 适配后的代码实现
using Microsoft.IdentityModel.Protocols.WSTrust; using System.IdentityModel.Tokens; using System.ServiceModel; using System.ServiceModel.Security; var stsEndpoint = "https://MyAdfsServer/adfs/services/trust/13/UsernameMixed"; var reliantPartyUri = "https://MyDomain/AppRoot/"; // 创建WSTrustChannelFactory,适配.NET Core var factory = new WSTrustChannelFactory( new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(stsEndpoint)); factory.TrustVersion = TrustVersion.WSTrust13; // 设置认证凭据 factory.Credentials.UserName.UserName = @"Domain\UserName"; factory.Credentials.UserName.Password = "Password"; // 可选:验证ADFS服务器证书(根据需求配置) factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.ChainTrust; // 如果需要指定证书指纹,可替换为以下配置 // factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom; // factory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new FingerprintCertificateValidator("你的证书指纹"); var rst = new RequestSecurityToken { RequestType = RequestTypes.Issue, AppliesTo = new EndpointAddress(reliantPartyUri), KeyType = KeyTypes.Bearer, }; using var channel = factory.CreateChannel(); var token = channel.Issue(rst) as GenericXmlSecurityToken; var samlTokenXml = token?.TokenXml.OuterXml;
关键注意事项
- 确认ADFS端点
UsernameMixed是正确的,该端点支持用户名密码方式的WSTrust请求 KeyTypes.Bearer指定返回无密钥的承载令牌,符合大多数服务的调用需求- 证书验证部分:如果对方提供了证书指纹,可自定义证书验证器来强制验证ADFS服务器的证书指纹,避免中间人攻击
内容的提问来源于stack exchange,提问作者user3444377
相关产品推荐
相关产品推荐

