迁移到 .NET 8 期间 Blazor 中的授权出现问题

问题描述 投票:0回答:1

我正在将 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。

感谢您的帮助和建议!

blazor migration authorization blazor-server-side .net-8.0
1个回答
0
投票

根据我的经验,

@attribute [Authorize(Roles = "Admin")]
有2种不同的工作模式。

  1. HttpContext
    存在时(例如SSR,刷新页面),
    [Authorize]
    将使用与“MVC”相同的机制,您需要设置身份验证方案(“service.AddAuthentication()”)。相比之下,
    <AuthrizedView>
    不需要任何方案,其机制完全取决于
    AuthenticationProvider

  2. HttpContext
    不存在时(例如从主页导航时,使用websocket),
    [Authorize]
    可以与
    <AuthorizedRouteView>
    一起使用并生效。

所以我的建议是根本不要使用

[Authorize]
。如果您想在用户未通过授权时重定向到其他页面。您可以在页面中添加以下代码。

<AuthorizeView>
    <NotAuthorized>
        @{
            _navigationManager.NavigateTo("/401page");
        }
    </NotAuthorized>
</AuthorizeView>
© www.soinside.com 2019 - 2024. All rights reserved.