Microsoft Online Bearer Token获取一台正常另一台异常排查
问题排查:Windows服务器获取Microsoft Online Bearer Token失败
我有一个服务在某Windows服务器上已成功运行多年(目前仍正常)。客户希望扩容,将服务部署到另一台Windows服务器,但部署后失败,失败环节为从Microsoft Online获取Bearer Token。经确认,第二台服务器可通过Soap UI成功完成该操作。
报错核心信息
System.AggregateException: One or more errors occurred. ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm
失败的VB.NET函数代码
Public Async Function GenerateAccessToken(baseURL As String, authorization As String, clientID As String, clientSecret As String, resource As String) As Task(Of String) Dim responseString As String Try Dim client As HttpClient = HeadersForAccessTokenGenerate(baseURL, authorization) Dim body As String = "" Dim request As HttpRequestMessage = New HttpRequestMessage(HttpMethod.Post, client.BaseAddress) request.Content = New StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded") Dim postData As List(Of KeyValuePair(Of String, String)) = New List(Of KeyValuePair(Of String, String))() postData.Add(New KeyValuePair(Of String, String)("grant_type", "client_credentials")) postData.Add(New KeyValuePair(Of String, String)("client_id", clientID)) postData.Add(New KeyValuePair(Of String, String)("client_secret", clientSecret)) postData.Add(New KeyValuePair(Of String, String)("resource", resource)) request.Content = New FormUrlEncodedContent(postData) Dim tokenResponse As HttpResponseMessage = client.PostAsync(baseURL, New FormUrlEncodedContent(postData)).Result responseString = Await tokenResponse.Content.ReadAsStringAsync() Catch ex As HttpRequestException Throw ex End Try 'Return If(responseString.Contains("error"), responseString, token.AccessToken) Return (responseString) End Function
需检查的内容
- TLS版本支持配置:对比两台服务器的.NET Framework版本及TLS协议启用情况。Microsoft Online已弃用TLS 1.0/1.1,需确保第二台服务器的应用程序启用TLS 1.2+。可查看注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319下的SchUseStrongCrypto键值(设为1启用强加密),同时确认服务器已安装TLS 1.2相关补丁。 - 应用程序池.NET版本:确认第二台服务器上服务对应的IIS应用程序池使用的.NET Framework版本与第一台一致。不同.NET版本对TLS的默认支持不同,比如.NET 4.5及以上需手动配置才能启用TLS 1.2。
- 系统加密套件一致性:检查两台服务器的SSL/TLS加密套件顺序是否一致。第二台可能缺少Microsoft Online要求的算法(如TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),导致握手失败。可通过
gpedit.msc进入“计算机配置>管理模板>网络>SSL配置设置>SSL密码套件顺序”对比配置。 - 代理与防火墙差异:虽然Soap UI能成功,但服务进程可能使用不同的代理设置。检查服务运行账户的代理配置是否和Soap UI一致;同时确认防火墙是否允许服务进程访问
https://login.microsoftonline.com,部分防火墙会针对特定进程过滤加密协议。 - HttpClient配置细节:确认
HeadersForAccessTokenGenerate方法在两台服务器上的配置是否一致,比如是否指定了安全协议。另外,代码中使用.Result同步调用异步方法,虽不直接引发加密问题,但可能影响执行上下文,需确认与第一台环境一致。 - 系统更新补丁:第二台服务器可能缺少Windows安全更新,导致加密库不支持现代TLS协议或套件。对比两台服务器的更新记录,重点检查SSL/TLS相关补丁。
内容的提问来源于stack exchange,提问作者MarkEMarkEMark
相关产品推荐
相关产品推荐

