我正在尝试在 .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);
}
}
在我的测试中,您可能选择交互位置为“每个组件”,“全局”模式不会出现此问题。解决办法也很简单。
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