BizTalk 2020调用跨机内部Web服务遇Negotiate认证未授权问题
BizTalk 2020跨机器调用Web服务Negotiate身份验证失败解决方案
问题分析
报错System.Net.WebException: The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate'表明Negotiate身份验证流程未完成。BizTalk 2016到2020的升级涉及.NET框架(4.7.2)和底层安全机制的调整,Kerberos配置、自定义Behavior干扰、域信任问题是核心排查方向。
排查与解决步骤
1. 校验Kerberos SPN与委派配置
- 检查Web服务所在机器的SPN注册情况:执行
setspn -L <Web服务运行账号>,确认存在HTTP/<Web服务器FQDN>、HTTP/<Web服务器NetBIOS名>;若服务使用自定义端口,需额外注册HTTP/<Web服务器FQDN>:<端口号>。 - 配置BizTalk主机实例账号的约束委派:在AD用户属性的「委派」标签,选择「仅信任此用户委派到指定服务」,添加Web服务对应的HTTP SPN,确保账号有权限向Web服务委派身份。
2. 调整发送端口配置
- 确认WCF绑定安全设置:发送端口使用WCF-BasicHttp/WCF-WSHttp绑定时,安全模式设为
Transport或TransportWithMessageCredential,客户端凭据类型选择Windows。 - 临时移除自定义Behavior:先禁用
bizTalkAddHttpheadersBehavior测试调用,排除自定义代码篡改请求头导致Negotiate流程异常的可能。 - 检查模拟设置:若发送端口启用模拟,确认模拟账号具备Web服务访问权限,且该账号的SPN/委派配置无误。
3. .NET框架与系统安全配置
- 修改BizTalk主机配置文件(
BTSNTSvc.exe.config/BTSNTSvc64.exe.config),添加Kerberos与TLS 1.2相关配置:<configuration> <system.net> <settings> <servicePointManager securityProtocol="Tls12" /> </settings> </system.net> <system.serviceModel> <bindings> <basicHttpBinding> <binding> <security mode="Transport"> <transport clientCredentialType="Windows" /> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior> <clientCredentials> <windows allowedImpersonationLevel="Impersonation" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration> - 确保BizTalk服务器和Web服务服务器均启用TLS 1.2,禁用SSL 3.0、TLS 1.0/1.1等旧协议。
- 确认两台机器处于同一域或双向信任域,避免Kerberos协商失败后NTLM fallback受阻。
4. 调试身份验证流程
- 用Fiddler抓取请求,查看Negotiate头的交互:检查是否发送有效Kerberos票据,是否出现多次401挑战。
- 在Web服务服务器开启Kerberos日志(事件查看器→应用程序和服务日志→Microsoft→Windows→Kerberos-Key-Distribution-Center),通过事件ID(如7、10)定位票据请求失败原因。
- 用
ktpass工具验证Web服务账号的密钥与SPN关联是否正确。
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

