15

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

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

谢谢!

4

3 回答 3

25

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

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

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

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

于 2020-03-14T22:59:26.390 回答
2

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

services.AddRazorPages();

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

回退身份验证策略要求对所有用户进行身份验证,但 Razor 页面、控制器或具有身份验证属性的操作方法除外。

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

于 2021-06-21T12:54:30.380 回答
0

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

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

新解决方案:

//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()));
于 2021-09-10T08:58:20.723 回答