使用 .NET 8 的 Blazor Web 应用程序中的意外授权行为

Sam*_*Sam 2 c# authentication blazor .net-8.0

我在使用 .NET 8 进行 Blazor 授权时遇到了一些奇怪的行为。该示例是 Blazor Web App 模板的略微修改版本,其默认设置(无授权)。

我确实手动添加了授权,因为 Blazor 默认的授权模板不满足我们的要求。我在下面进一步解释我如何添加授权。

启用授权并且主页标有“授权”属性后,我希望网站在启动时显示“登录”文本,因为我未获得授权:

路由.razor

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <span>Login</span>
            </NotAuthorized>
        </AuthorizeRouteView>
        <FocusOnNavigate RouteData="@routeData" Selector="h1" />
    </Found>
</Router>
Run Code Online (Sandbox Code Playgroud)

家用剃须刀

@page "/"

@using Microsoft.AspNetCore.Authorization

@attribute [Authorize]

@...
Run Code Online (Sandbox Code Playgroud)

然而,预期的行为并没有发生。相反,我在第一个 Web 请求时收到 401 错误,并且没有显示任何内容。

更奇怪的是,当我从 App.razor 文件中完全删除 Routes 组件(这似乎是整个网站的某种入口点)时,即使没有路由,我仍然收到相同的 401 错误全部到 Home 组件:

应用剃刀

<!DOCTYPE html>
<html lang="en">

<!-- ... -->

<body>
    Hello App
    @* <Routes @rendermode="@InteractiveAuto" /> *@
    <script src="_framework/blazor.web.js"></script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我从 Home 组件(甚至没有引用)中删除 Authorize 属性,网站会突然正常工作并按预期显示 App.razor 文件中的“Hello App”。但是,我希望 Home 组件需要授权。

看来 Blazor 正在 Router 组件之外进行一些额外的路由,尽管这根本没有意义。

有人可以解释这种奇怪的行为,以及当我未经授权时如何让路由组件显示 NotAuthorized 片段?

为了在默认 Blazor Web 模板中启用授权,我进行了以下修改:

  • 安装 Microsoft.AspNetCore.Components.WebAssembly.Authentication NuGet 包以获取 AuthorizeRouteView 组件并修改 Routes.razor 文件,如上例所示。
  • 添加builder.Services.AddAuthorizationCore();到Client项目的Program.cs文件中。
  • 添加builder.Services.AddAuthentication(BearerTokenDefaults.AuthenticationScheme).AddBearerToken();到服务器项目中。

您可以在我的 GitHub 存储库中找到完整的示例项目:https://github.com/AntMaster7/BlazorApp3

小智 6

创建班级

public class AuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
    public Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
    {
        return next(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加处理程序

services.AddSingleton<IAuthorizationMiddlewareResultHandler, AuthorizationMiddlewareResultHandler>();
Run Code Online (Sandbox Code Playgroud)

这就是全部,这是 blazor 服务器 .Net 8 模板错误

我希望这有帮助,对我有用