Blazor Server身份验证疑问:无Auth中间件却生效等问题
背景说明
我希望理清Blazor Server(SSB)身份验证与授权的几个问题。据我了解,Blazor并不运行在.NET Core管道上下文中:应用启动初期遵循常规管道规则,但Blazor应用启动后,通过SignalR连接与客户端交互。
我使用Azure AD对Blazor应用进行用户身份验证,以下是启用Microsoft Identity Platform作为身份验证提供程序时生成的默认项目代码:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")); builder.Services.AddControllersWithViews() .AddMicrosoftIdentityUI(); builder.Services.AddAuthorization(options => { // By default, all incoming requests will be authorized according to the default policy options.FallbackPolicy = options.DefaultPolicy; }); builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor() .AddMicrosoftIdentityConsentHandler(); builder.Services.AddSingleton<WeatherForecastService>(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapControllers(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run(); }
大部分配置与默认MVC身份验证类似,AddMicrosoftIdentityWebApp将身份验证机制设为OIDC,AddControllersWithViews().AddMicrosoftIdentityUI()用于处理登录/登出方法。
问题1:既然AddMicrosoftIdentityUI可附加到AddRazorPages,为何还需要AddControllersWithViews?
这是模板的兼容性设计。早期的Microsoft Identity UI基于MVC控制器实现,后续才适配了Razor Pages。模板保留AddControllersWithViews()是为了兼容旧版UI逻辑,同时也支持开发者后续添加MVC视图/控制器的场景。
你测试中将UI附加到Razor Pages后功能正常,是因为新版AddMicrosoftIdentityUI已同时支持MVC和Razor Pages两种宿主。如果项目不需要MVC相关功能,完全可以移除AddControllersWithViews(),改用AddRazorPages().AddMicrosoftIdentityUI(),功能上无差异。
问题2:管道中未配置UseAuthentication()和UseAuthorization()中间件,为何身份验证仍能生效?
在.NET 6+的最小API模型中,MapBlazorHub()、MapControllers()、MapRazorPages()这些端点映射方法会自动启用对应的身份验证和授权中间件逻辑,无需显式调用UseAuthentication()和UseAuthorization()。
Blazor Server的SignalR连接(MapBlazorHub)会自动继承管道中的身份验证上下文,而回退页/_Host是Razor Page,它的授权检查会触发身份验证流程。另外,你设置的FallbackPolicy对所有端点生效,当访问/_Host时,Razor Pages的授权系统会自动触发身份验证重定向,这就是应用启动时跳转登录页的原因。
常规MVC/Razor Pages模板显式配置中间件,是因为它们的端点映射更分散,而Blazor Server模板依赖自动启用的中间件逻辑,所以无需显式添加。
问题3:为何Blazor Server需要单独配置AddMicrosoftIdentityConsentHandler?
Blazor Server通过SignalR进行双向通信,用户在Blazor组件中发起的API调用(比如调用需权限的后端接口),若需动态请求用户同意额外权限范围,常规MVC/Razor Pages的consent处理流程无法直接适配Blazor的组件上下文。
AddMicrosoftIdentityConsentHandler是专门为Blazor场景设计的:它会拦截组件中因权限不足触发的consent请求,将用户重定向到Azure AD的consent页面,完成授权后返回Blazor应用的原组件上下文,确保整个流程在SignalR连接中正常工作。而常规Web应用是单次HTTP请求,不需要专门处理这种持久连接下的consent跳转逻辑。
内容的提问来源于stack exchange,提问作者Help123

