需要对所有 Blazor 页面进行授权

Require authorization on ALL Blazor pages

我正在玩 Blazor 并创建了一个由服务器托管的 Web 应用程序。我必须像这样在页面顶部放置一个授权行 @attribute [Authorize] 以确保用户已登录。

看来我必须将这一行单独添加到每个页面。是否有一个全局设置可以保护应用程序中的所有页面,当然除了登录页面。

谢谢!

我相信这会奏效...将以下代码片段放入 _Imports.razor 文件

@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]

在这种情况下,当点击索引页面时,用户将被重定向到登录页面。如果要在呈现 Blazor 应用程序之前执行身份验证,请在 _Host.cshtml 文件

中添加上面的代码片段

@attribute [AllowAnonymous] 添加到您希望从身份验证中排除的特定页面,例如索引页面。

您可以通过添加授权回退策略来做到这一点:

services.AddRazorPages();

services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

The fallback authentication policy requires all users to be authenticated, except for Razor Pages, controllers, or action methods with an authentication attribute.

这意味着您可以使用示例 @attribute [Authorize] (attributes) 的属性来自定义身份验证和授权。

编辑:我实际上发现了第一个解决方案的问题,它不允许我拥有任何不需要授权的端点或页面。我确实找到了这个 link,它很有魅力。

我自己正在为此寻找解决方案,并找到了以下 link。到目前为止它似乎按预期工作。

新解决方案:

//RedirectToLogin
@inject NavigationManager NavigationManager
@code{

protected override async Task OnInitializedAsync()
{
    var returnUrl = "~/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
    NavigationManager.NavigateTo($"Identity/Account/Login?returnUrl={returnUrl}", forceLoad:true);
}

//App.razor
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
    <NotAuthorized>
        <RedirectToLogin />
    </NotAuthorized>
    <Authorizing>
        <p>Authorizing...</p>
    </Authorizing>
</AuthorizeRouteView>

//this in the page I want authorization for
@attribute [Authorize]

旧的解决方案: 我将以下内容放入我的 ConfigureServices:

// Add a default AuthorizeFilter to all endpoints
services.AddRazorPages()
    .AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter()));