Blazor Server重启IIS后访问路由未跳转登录页,报401错误
咱们来拆解你遇到的问题:重启IIS后直接访问Blazor路由时,没自动跳转到登录页反而触发401错误,这背后主要有两个核心问题:
1. Razor Pages全局授权导致循环重定向
你用了endpoints.MapRazorPages().RequireAuthorization();,这会给所有Razor Pages(包括登录页/Auth/Login)强制加授权要求。这就形成了死循环:未登录用户需要跳转到登录页,但登录页本身又要求认证,最终授权中间件无法正常触发重定向,反而让Blazor的SignalR协商请求直接返回401。
2. Blazor Hub请求的授权时机问题
MapBlazorHub().RequireAuthorization();要求访问SignalR Hub必须认证,但用户直接访问Blazor路由时,浏览器会先加载_Host页面,同时自动发起Hub连接请求。如果_Host页面的授权检查没提前拦截未登录用户,Hub请求就会先触发401,干扰正常的登录跳转流程。
具体修复步骤
步骤1:调整Razor Pages授权规则,允许匿名访问登录/登出页
把全局的MapRazorPages().RequireAuthorization();替换为精细的页面授权配置,确保登录页能被匿名访问:
在ConfigureServices中添加Razor Pages授权约定:
services.AddRazorPages(options => { // 给根目录下所有页面添加授权要求 options.Conventions.AuthorizeFolder("/"); // 允许匿名访问登录和登出页 options.Conventions.AllowAnonymousToPage("/Auth/Login"); options.Conventions.AllowAnonymousToPage("/Auth/Logout"); });
然后在Configure的端点配置中,把原来的endpoints.MapRazorPages().RequireAuthorization();改为:
endpoints.MapRazorPages();
步骤2:给_Host.cshtml添加强制认证属性
在_Host.cshtml顶部添加[Authorize]属性,确保访问Blazor路由时,加载_Host页面的请求会被提前拦截,直接跳转到登录页,避免Hub请求提前触发401:
@page "/" @namespace YourAppNamespace.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @using Microsoft.AspNetCore.Authorization @attribute [Authorize] <!DOCTYPE html> <html lang="en"> <!-- 页面剩余内容 --> </html>
步骤3:保留Blazor Hub的授权要求(推荐)
继续保留endpoints.MapBlazorHub().RequireAuthorization();,确保只有已认证用户能建立SignalR连接,保障Blazor应用的安全性。
额外说明
修复后,重启IIS再直接访问Blazor路由时,授权中间件会先拦截_Host页面的请求,自动跳转到登录页,不会再出现SignalR协商的401错误。之前需要强制刷新的情况,也是全局授权导致的缓存异常,修复后这个问题也会消失。
内容的提问来源于stack exchange,提问作者Liero

