如何认证报表服务器Web服务?SSRS2017本地调用SOAP服务遇权限异常
解决SSRS 2017 SOAP客户端NTLM认证失败问题
这个异常的根源很清晰——你的VS2015自动生成的SOAP客户端默认采用了匿名认证,但SSRS 2017的Web服务要求的是NTLM认证(Windows域环境下SSRS的标准认证方式),两边的认证方案不匹配,自然就触发了授权失败。下面给你两种直接可行的解决办法:
方法一:修改配置文件(app.config/web.config)
找到项目里的配置文件,定位到<system.serviceModel>节点,调整客户端绑定的认证设置,把客户端凭据类型改成NTLM,同时匹配对应的安全模式:
<system.serviceModel> <bindings> <basicHttpBinding> <!-- 这里的name要和客户端endpoint的bindingConfiguration对应 --> <binding name="ReportingService2010Soap"> <!-- 如果用HTTP就选TransportCredentialOnly,HTTPS选Transport --> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://你的SSRS服务器地址/ReportServer/ReportingService2010.asmx" binding="basicHttpBinding" bindingConfiguration="ReportingService2010Soap" contract="你的服务引用命名空间.ReportingService2010Soap" /> </client> </system.serviceModel>
记得把上面的地址、命名空间替换成你实际的SSRS服务地址和VS生成的服务引用契约名。
方法二:代码中手动指定认证凭据
如果不想改动配置文件,也可以在实例化客户端后,直接通过代码设置认证信息:
using (var rsClient = new ReportingService2010SoapClient()) { // 使用当前登录用户的凭据访问SSRS rsClient.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; // 允许服务器模拟当前用户 rsClient.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; // 调用你的报表服务方法,比如列出报表目录 var reportItems = rsClient.ListChildren("/", true); }
如果需要用特定账户访问(而非当前登录用户),可以替换成指定的网络凭据:
rsClient.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("用户名", "密码", "域名");
额外检查项
- 确认SSRS配置管理器中,Web服务URL的身份验证设置里已经勾选了NTLM;
- 确保你用来访问的用户账户,在SSRS报表管理器中被分配了相应的角色权限(比如“报表浏览者”或“内容管理员”)。
内容的提问来源于stack exchange,提问作者astef
相关产品推荐
相关产品推荐

