【问题标题】:Require authorization on ALL Blazor pages在所有 Blazor 页面上都需要授权
【发布时间】:2020-06-26 11:56:31
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 你不能把你的授权组件放在布局页面中吗?默认的 MVC 登录系统不使用该布局页面,我很确定。

标签: blazor blazor-server-side asp.net-blazor


【解决方案1】:

我相信这会起作用...将以下代码 sn-p 放在 _Imports.razor 文件中

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

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

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

【讨论】:

  • 哇,成功了!从来没有想过将它添加到 _imports 文件中。谢谢!
  • 太棒了,我也正要为此寻找解决方案。
  • @Sebazzz,你怎么知道它不起作用?你试过了吗?不,你没有!你读过你上面的cmets吗?只是为了记录,页面必须始终是一个组件。
  • 它是一个旧线程,它在所要求的情况下工作正常。但我很想在这里问一个后续问题。是否可以在 _imports.razor 中动态添加 Authorize 属性?因为我们不希望在开发环境中启用身份验证。我无法在 _imports.razor 中添加任何 @code 块
【解决方案2】:

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

services.AddRazorPages();

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

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

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

【讨论】:

    【解决方案3】:

    编辑:我实际上发现第一个解决方案存在问题,它不允许我拥有任何不需要授权的端点或页面。我确实找到了这个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()));
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2020-08-20
      • 1970-01-01
      • 2020-12-16
      • 2015-03-30
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多