Blazor 未使用我的组件来重定向未经授权的用户

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

我正在尝试在 .NET 8 Blazor 服务器端应用程序中实现授权。当用户未登录并尝试访问需要授权的页面时,我想重定向到登录页面。我对带有“个人帐户”的默认 Blazor Web 应用程序模板执行了相同的操作,但使用了不同的 URI。但我的 URI 被忽略,重定向到 /Account/Login。我是否误解了

<NotAuthorized>
的作用?

这是 Routes.razor:

@using DataCollection.UI.Components.Shared
<Router AppAssembly="typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)">
            <NotAuthorized>
                <RedirectToLogin />
            </NotAuthorized>
        </AuthorizeRouteView>
        <FocusOnNavigate RouteData="routeData" Selector="h1" />
    </Found>
</Router>

这是 RedirectToLogin.razor (在 DataCollection.UI.Components.Shared 中定义):

@inject NavigationManager NavigationManager
@attribute [AllowAnonymous]

@code {
    protected override void OnInitialized()
    {
        NavigationManager.NavigateTo($"ui/Login?returnUrl={Uri.EscapeDataString(NavigationManager.Uri)}", forceLoad: true);
    }
}
asp.net-core blazor .net-8.0
1个回答
0
投票

在我的测试中,您可能选择交互位置为“每个组件”,“全局”模式不会出现此问题。解决办法也很简单。

App.razor

...
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="/" />
    <link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
    <link rel="stylesheet" href="app.css" />
    <link rel="stylesheet" href="BlazorApp25.styles.css" />
    <link rel="icon" type="image/png" href="favicon.png" />
    <HeadOutlet @rendermode="RenderModeForPage" />
</head>

<body>
    <Routes @rendermode="RenderModeForPage" />
    <script src="_framework/blazor.web.js"></script>
</body>

</html>

@code {
    [CascadingParameter]
    private HttpContext HttpContext { get; set; } = default!;

    private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account")
        ? null
        : InteractiveServer;
}

文档有解释https://learn.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-8.0

© www.soinside.com 2019 - 2024. All rights reserved.