SignalR协商阶段出现HTTP 403 Forbidden错误如何解决
SignalR 协商阶段403错误排查方案
该错误为SignalR发起/signalr/negotiate协商请求时被服务端直接拒绝,可按以下步骤逐层排查:
报错截图:
1. 检查IIS站点身份验证配置
- 打开Windows Server 2016的IIS管理器,定位到部署的目标站点,进入「身份验证」功能页
- 启用项目实际使用的认证方式:不需要登录的场景要开启匿名身份验证,用集成登录的场景开启Windows身份验证,无用的认证方式建议全部禁用避免规则冲突
- 检查匿名身份验证的运行标识,确认是应用程序池对应账号,或者该账号对站点目录有读取权限
2. 检查CORS跨域配置
如果前端站点和SignalR服务端不在同一个域名/端口下,必须显式配置跨域规则:
- 确认Startup.cs中的SignalR配置已经添加CORS规则,参考示例:
public void Configuration(IAppBuilder app) { app.Map("/signalr", map => { // 生产环境请替换AllowAll为实际允许的前端域名,避免安全风险 map.UseCors(CorsOptions.AllowAll); var hubConfig = new HubConfiguration { EnableJSONP = true // 老旧浏览器跨域场景可开启 }; map.RunSignalR(hubConfig); }); }
- 检查IIS站点是否单独安装了CORS模块,避免站点级别的CORS规则覆盖代码中的配置
3. 检查目录与应用权限
- 右键站点根目录,进入「安全」选项卡,确认应用程序池运行账号(默认格式为
IIS AppPool\你的应用池名称)拥有以下权限:读取、读取和执行、列出文件夹内容 - 检查站点bin目录是否已经包含所有SignalR相关的dll,不存在的话重新发布项目时选择「删除目标位置的现有文件」后再发布
- 确认IIS的应用程序池.NET Framework版本和本地开发环境一致,且托管管道模式设置为「集成」
4. 检查请求拦截与Web.config配置
- 进入IIS站点的「请求过滤」功能页,查看是否有规则拦截了
/signalr/negotiate路径,或者拦截了OPTIONS、POST等SignalR必须用到的请求方法 - 如果站点配置了全局授权拦截未登录用户,需要单独放开SignalR路径的访问权限,在Web.config中添加以下配置:
<!-- 放开SignalR路径的访问权限,不需要认证的场景可配置 --> <location path="signalr"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
- 确认Web.config中已经正确注册OWIN处理程序:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="RoleManager" /> </modules> <handlers> <add name="Owin" verb="" path="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb"/> </handlers> </system.webServer>
5. 进阶定位根因
- 在Web.config中开启详细错误日志,查看403的具体子状态码,不同子状态码对应不同问题:403.14为目录浏览禁用、403.7为要求客户端证书、403.503为IP限制拦截等
<system.webServer> <httpErrors errorMode="Detailed" /> </system.webServer> <system.web> <customErrors mode="Off" /> </system.web>
- 通过浏览器网络面板或者Fiddler抓包,查看协商请求的请求头、响应头具体内容,确认是否有认证字段缺失、或者WAF等安全设备拦截了请求
内容的提问来源于stack exchange,提问作者Genki Smurf
相关产品推荐
相关产品推荐


