Blazor WebApp-Server&AuthenticationSchemes报错
目录
背景描述
集成到现有系统中,系统使用了Cookie作为鉴权方式,已有一个scheme正常业务使用。为接入开发工具,隔离现有scheme,另起一个DevTools Scheme,独立使用。集成Blazor为Blazor WebApp Server模式。
项目设置
- 在鉴权服务扩展,在已有scheme基础上扩展新scheme并简单设定其配置。
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
//...
})
.AddCookie("DevTools",options =>
{
options.Cookie.Name = "DevTools";
options.Cookie.MaxAge = TimeSpan.FromMinutes(30);
options.LoginPath = "/login";
options.AccessDeniedPath = "/access-denied";
})
- Blazor页面设置Authorize特性,按照Blazor页面授权检查,在Blazor Page上标记Authorize。
@page "/counter"
@attribute [Authorize]
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
- 从Authorize设定方式来讲,常规Asp.Net Core WebApi的用法应该也能够用于Blazor,因此设定如下方式。
@page "/counter"
@attribute [Authorize(AuthenticationSchemes = "DevTools")]
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
调试该页面,未登录下能够按照Schemes要求正常跳转到登录页。
然而,当进入到该页面时,提示报错:
The authorization data specifies an authentication scheme with value 'DevTools'. Authentication schemes cannot be specified for components.
根据堆栈内容找到其源码位于如下链接,从其错误来看,无法在组件上标记特定schema。 https://source.dot.net/#Microsoft.AspNetCore.Components.Authorization/AuthorizeViewCore.cs,116
解决方案
依据源码设定,无法在组件层面标记Scheme。从Github找到方案,替换成全局设定Scheme。
https://github.com/dotnet/aspnetcore/issues/14916#issuecomment-541162620
所有原有加了Authorize[AuthenticationSchemes = “DevTools”]都可以去掉了,默认Blazor所有页面都受控制,如果想要特定页面(比如登录页)可以匿名访问,加上特性。
@attribute [AllowAnonymous]
参考文档
2025-10-15,望技术有成后能回来看见自己的脚步。