我正在将 Blazor Server 项目从 .NET 7 迁移到 .NET 8。我遇到了以下问题:站点从主页正常启动,我登录并转到需要授权的页面 - 一切正常。但是如果我点击浏览器中的“刷新”按钮,就会出现错误:
InvalidOperationException:未指定authenticationScheme,并且未找到DefaultChallengeScheme。可以使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(Action configureOptions) 设置默认方案。
设置立即从安全页面打开站点时,也会发生同样的错误。主页上的某些元素仅供授权用户使用。它们装饰有以下标签:
<AuthorizeView Roles="Admin">
<Authorized Context="adminContext">
...
</AuthorizeView>
</Authorized>
发生错误的页面上有一个标签:
@attribute [Authorize(Roles = "Admin")]
如果我删除此标签并将整个页面内容放入 AuthorizeView 中,那么一切都会开始正常工作。 我在 Program.cs 中使用以下结构:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddAuthenticationCore();
builder.Services.AddAuthentication();
builder.Services.AddAuthorization();
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<AuthenticationStateProvider, MyAuthenticationStateProvider>();
builder.Services.AddServerSideBlazor().AddCircuitOptions(options => { options.DetailedErrors = true; });
var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run();
我也尝试过更换
.AddAuthentication();
与
.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
在这种情况下,刷新页面时,网站会尝试将我重定向到我的项目中不存在的地址 https://localhost:7174/Account/Login。
感谢您的帮助和建议!
根据我的经验,
@attribute [Authorize(Roles = "Admin")]
有2种不同的工作模式。当
HttpContext
存在时(例如SSR,刷新页面),[Authorize]
将使用与“MVC”相同的机制,您需要设置身份验证方案(“service.AddAuthentication()”)。相比之下,<AuthrizedView>
不需要任何方案,其机制完全取决于AuthenticationProvider
。当
HttpContext
不存在时(例如从主页导航时,使用websocket),[Authorize]
可以与<AuthorizedRouteView>
一起使用并生效。所以我的建议是根本不要使用
[Authorize]
。如果您想在用户未通过授权时重定向到其他页面。您可以在页面中添加以下代码。
<AuthorizeView>
<NotAuthorized>
@{
_navigationManager.NavigateTo("/401page");
}
</NotAuthorized>
</AuthorizeView>