有一个 WinForms
桌面应用程序,它试图连接到 SSRS
服务。报告服务器配置为接受活动目录凭据登录以及特定用户的凭据进行报告目的。在以下代码部分中,我们使用一个 WinForms
ReportViewer
:
reportViewer.ServerReport.ReportServerUrl = new Uri(_dboardServices.ReportingServicesUrl);
reportViewer.ServerReport.ReportServerCredentials.NetworkCredentials = CredentialCache.DefaultCredentials;
这在我和大多数客户的机器上都正常运行。但是有些客户遇到了401错误:
System.Net.WebException: The request failed with HTTP status 401: Unauthorized
,这是由SoapHttpClient系统引起的。有趣的是,我可以在我的机器上复现这个问题。通过使用 Fiddler
查看交通情况,发现开始进行一个 NTLM
认证,然后将“UserName”(实际上!)作为用户名发送,而不是我的真实用户名。显然这失败了。如果我用正确的用户名、密码和域构建凭据 (
reportViewer.ServerReport.ReportServerCredentials.NetworkCredentials = new NetworkCredential(goodUserName, goodPassword, domain);
),我的请求就会成功。就好像我导航到SSRS
asmx
链接并输入我的凭据一样。但是CredentialCache.DefaultCredentials
(默认情况下应该是我的AD凭据)从哪里获取了这个“UserName”。我已经在我们的源代码和网络上搜寻了很久,但没有找到答案。