有一个 WinForms
桌面应用程序试图连接到 SSRS
服务。报告服务器配置为接受 Active Directory 凭据登录以及特定用户的凭据以用于报告目的。在下面的代码部分,我们使用 WinForms
ReportViewer
:
reportViewer.ServerReport.ReportServerUrl = new Uri(_dboardServices.ReportingServicesUrl);
reportViewer.ServerReport.ReportServerCredentials.NetworkCredentials = CredentialCache.DefaultCredentials;
这在我的开发伙伴的机器上以及我们的大多数客户都运行良好。但是一些客户端遇到 401:System.Net.WebException:请求失败,HTTP 状态为 401:未经授权
,来自 SoapHttpClient 系统。
有趣的是,我可以在我的机器上重现这个问题。使用 Fiddler
查看流量,NTLM
身份验证开始,然后“UserName”(字面意思!)作为用户名而不是我的真实用户名发送。显然那是失败的。
如果我使用正确的用户名、密码和域构建凭证 (reportViewer.ServerReport.ReportServerCredentials.NetworkCredentials = new NetworkCredential(goodUserName, goodPassword, domain);
),我的请求就会成功。就像我导航到 SSRS
asmx
链接并输入我的凭据一样。但是 CredentialCache.DefaultCredentials
(应该默认为我的 AD 凭据)从某处提取此“用户名”。系统从哪里得到它?到目前为止,我搜索了我们的源代码和网络,但一无所获。
最佳答案
这可能是存储凭据的问题。通过在命令行运行 control keymgr.dll
查看您存储了哪些凭据。看这个article .
关于c# - DefaultCredentials 在哪里拉出 "UserName"作为 web 请求的用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731347/