查看SSRS 2019订阅时出现HTTP Error 401的故障排查求助
2023-05-26 09:02:18.9728|ERROR|229|OData exception occurred: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.WebException: The request failed with HTTP status 401: Unauthorized.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
针对SQL Server 2019环境下SSRS仅订阅查看功能报401错误、其余功能正常的情况,核心问题是RS Portal调用SSRS Web Service的SOAP接口时身份验证失效,以下是具体排查步骤:
检查SSRS服务账户权限
打开服务管理器,找到SQL Server Reporting Services服务,确认其登录账户:- 该账户需加入本地
Report Server组 - 直接访问SSRS Web Service地址(默认
http://<服务器名>/ReportServer),验证是否能正常访问无授权报错
- 该账户需加入本地
核对RS Portal配置文件
定位到RSPortal.exe.config(默认路径:C:\Program Files\Microsoft SQL Server Reporting Services\SSRS\Portal),检查:ReportServerUrl配置的地址是否正确,需指向SSRS Web Service的根路径AuthenticationTypes配置需与SSRS Web Service的身份验证模式一致(如Windows身份验证对应Windows)
验证SSRS Web Service身份验证设置
打开SSRS配置管理器:- 进入「Web服务URL」,确认URL可正常访问,无端口或路径错误
- 进入「身份验证」,确认启用的验证模式未被误改,且与Portal配置匹配
排查Kerberos配置(若用Windows身份验证)
若SSRS依赖Kerberos:- 用
setspn -L <服务账户>命令检查是否注册了正确的SPN,需包含HTTP/<服务器名>和HTTP/<服务器FQDN> - 确认RS Portal运行账户(默认
NT SERVICE\ReportingServicesPortal)拥有向SSRS服务委派身份的权限 - 用
klist purge清除票据后重新测试,查看是否能生成有效Kerberos票据
- 用
检查RS Portal运行账户权限
针对默认的NT SERVICE\ReportingServicesPortal账户:- 确认其对SSRS Web Service的IIS虚拟目录有读取权限
- 验证该账户在SSRS配置数据库(ReportServer、ReportServerTempDB)中拥有
RSExecRole角色权限
直接测试SOAP接口
访问http://<服务器名>/ReportServer/ReportService2010.asmx,调用ListSubscriptions方法,传入目标报表的完整路径,若仍返回401,说明问题出在SSRS Web Service本身而非Portal的调用逻辑
内容的提问来源于stack exchange,提问作者Ed Mozley

