请求ADFS服务器令牌时触发ID3037错误:求解决方案
解决ADFS请求对称令牌时的ID3037错误
嘿,咱们来解决你请求ADFS对称令牌时遇到的ID3037错误。我之前处理过一模一样的问题,给你梳理清楚关键点和步骤:
首先,这个错误的核心原因你猜的方向对,但有个细节容易混淆:ADFS的全局签名证书是用来签发令牌的,但当请求Symmetric类型的令牌时,ADFS还需要给对应的信赖方配置加密证书——因为生成的对称密钥需要用这个证书加密后传给客户端,只有信赖方持有私钥才能解密。所以只配置全局证书是不够的,必须给目标信赖方显式分配加密证书。
针对ADFS 2.0,具体配置步骤如下:
- 先准备好信赖方的加密证书:一般是你客户端应用对应的证书公钥(格式为PFX或CER都可以),确保证书已经导入到ADFS服务器的证书存储中(或者后续直接导入)
- 打开ADFS 2.0管理控制台:
- 展开左侧的信任关系 → 信赖方信任
- 找到你要配置的目标信赖方,右键点击选择属性
- 在弹出的属性窗口中切换到加密标签页:
- 点击添加按钮,选择你的加密证书(如果已经在服务器存储里就直接选,否则导入本地的证书文件)
- 勾选使用此证书加密令牌的选项,确认配置
- 最后建议重启ADFS服务,确保配置生效
另外,也检查下你的代码里的小细节:
- 确认
AppliesTo的EndpointReference和ADFS中信赖方的标识符完全匹配(大小写、格式都不能错) - 原代码里有个小语法问题:
"domain\username"需要改成"domain\\username"(转义反斜杠),而且末尾漏了分号,我帮你格式化了代码:
WS2007HttpBinding binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential); binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; binding.Security.Message.EstablishSecurityContext = false; binding.BypassProxyOnLocal = true; binding.UseDefaultWebProxy = true; System.ServiceModel.Security.WSTrustChannelFactory factory = new System.ServiceModel.Security.WSTrustChannelFactory( binding, new EndpointAddress(userNameMixedRequest.GetUserNameMixedUrl)); factory.TrustVersion = TrustVersion.WSTrust13; factory.Credentials.SupportInteractive = false; factory.Credentials.UserName.UserName = "domain\\username"; factory.Credentials.UserName.Password = "password"; System.IdentityModel.Protocols.WSTrust.RequestSecurityToken request = new System.IdentityModel.Protocols.WSTrust.RequestSecurityToken { RequestType = RequestTypes.Issue, AppliesTo = new EndpointReference(userNameMixedRequest.ClientUri), KeyType = KeyTypes.Symmetric }; System.ServiceModel.Security.IWSTrustChannelContract channel = factory.CreateChannel(); channel.Issue(request);
补充一句:ADFS 2.0里,全局签名证书是通用的,但每个信赖方的加密证书是独立配置的,这是请求对称令牌的硬性要求——毕竟对称密钥是敏感信息,必须加密传输才行。
内容的提问来源于stack exchange,提问作者ANewGuyInTown
相关产品推荐
相关产品推荐

