Blazor Server Cookie认证本地IIS正常,服务器IIS失败排查求助
问题背景
开发的Blazor Server网站采用Cookie认证,本地IIS(版本10.0.19041.1)环境下身份认证正常,部署到远程IIS(版本7.5.7600.16385)后出现异常:
- 本地IIS日志:显示
AuthenticationScheme: Cookies signed in.及AuthenticationScheme: Cookies was successfully authenticated. - 远程IIS日志:仅显示
AuthenticationScheme: Cookies signed in.,后续提示AuthenticationScheme: Cookies was not authenticated.
已确认两地IIS会话状态设置一致,登录功能通过Razor Pages实现,核心代码如下:
var claims = new List<Claim>{new Claim(ClaimTypes.Name, "test")}; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var principal = new ClaimsPrincipal(claimsIdentity); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
1. 需要排查的IIS设置
- 应用程序池配置
- 核对应用程序池的.NET CLR版本是否与项目目标框架匹配,IIS7.5需要安装对应版本的.NET Hosting Bundle才能支持Blazor Server依赖的.NET版本(如.NET 5及以上)
- 检查应用程序池身份的权限:确保身份有网站目录的读写权限,且开启了「加载用户配置文件」选项(未开启可能导致Cookie加密密钥无法正常存储)
- Cookie相关配置
- 查看IIS的HTTP响应头设置,确认
SameSite、Secure、HttpOnly属性是否合理:如果远程服务器用HTTPS而本地是HTTP,需确保Cookie设置了Secure属性;SameSite设置过严可能导致跨请求无法携带Cookie - 检查URL重写规则:确认是否有规则修改了请求路径,导致Cookie的路径匹配失败
- 查看IIS的HTTP响应头设置,确认
- 机器密钥配置
- Blazor Server的Cookie认证依赖加密密钥,远程IIS若未配置统一的机器密钥,应用池回收或多实例环境下会出现密钥不一致,导致Cookie解密失败。可在Web.config中添加
<machineKey>节点,确保加密、解密密钥与本地一致,或在远程IIS服务器层面配置统一机器密钥
- Blazor Server的Cookie认证依赖加密密钥,远程IIS若未配置统一的机器密钥,应用池回收或多实例环境下会出现密钥不一致,导致Cookie解密失败。可在Web.config中添加
- Cookie存储限制
- 检查IIS的Cookie大小限制,若远程服务器设置的上限更小,可能导致认证Cookie被截断
- 确认是否启用了输出缓存:若缓存了未认证页面,会导致后续请求无法读取最新的认证Cookie
2. 日志重点关注项
- 认证失败的具体原因
- 重点查看远程日志中
AuthenticationScheme: Cookies was not authenticated.的后续错误详情,比如是否有Unprotect ticket failed(Cookie解密失败)、Invalid cookie(Cookie无效)等提示,这是定位问题的核心
- 重点查看远程日志中
- Cookie传递细节
- 对比本地和远程日志中Cookie的名称、路径、域、过期时间是否一致;检查IIS请求日志中后续请求的
Cookie请求头,确认认证Cookie是否被正确携带
- 对比本地和远程日志中Cookie的名称、路径、域、过期时间是否一致;检查IIS请求日志中后续请求的
- SignalR连接日志
- Blazor Server依赖SignalR,需查看远程日志中SignalR连接请求的认证情况:如果SignalR请求未携带认证Cookie,会导致后续交互时认证失败
- 加密/解密异常
- 查找日志中的
CryptographicException等加密相关异常,这类异常通常和机器密钥不匹配、应用池权限不足有关
- 查找日志中的
- 请求状态码
- 检查远程IIS请求日志中的状态码,是否存在302重定向导致Cookie丢失,或401未授权请求的详细触发场景
内容的提问来源于stack exchange,提问作者lazy_traveller
相关产品推荐
相关产品推荐

