Blazor WebAssembly。在布局级别添加授权属性

Blazor WebAssembly. Add Authorize attribute at layout level

我从一个 visual studio 模板开始,这是一个新的 Blazor WebAssembly,带有身份验证和 Web API 作为服务器端。

我的问题是保护所有页面,而不仅仅是某些页面。我尝试添加:

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

到 MainLayout 而不是所有页面,但没有任何运气。 我想这样做是因为我正在写一个管理员,如果没有连接,我根本不希望人们看到布局

I wanted to do that because I'm writing an admin and I don't want people to see the layout at all if there are not connected

可以这么理解,当用户没有登录的时候,是不能进入任何页面的,所以这时候我们可以jump to the login page对吧?

如果是这样,您可以通过以下步骤实现:

  • 首先在当前blazor中创建一个RedirectToLogin.razor页面 项目。

    本页OnInitializedAsync方法中,通过判断是否 当前有用户登录,如果没有,重定向到 Login 页。

    RedirectToLogin.razor:

    @inject NavigationManager Navigation
    @code {
        [CascadingParameter]
        private Task<AuthenticationState> AuthenticationStateTask { get; set; }
    
        protected override async Task OnInitializedAsync()
        {
            var authenticationState = await AuthenticationStateTask;
    
            if (authenticationState?.User?.Identity is null || !authenticationState.User.Identity.IsAuthenticated)
            {
                Navigation.NavigateTo("Identity/Account/Login", true);
            }
        }
    }
    
  • 然后在App.razor中加入如下代码,保证 NotAuthorized将进入RedirectToLogin.razor页面:

    <CascadingAuthenticationState>
        <Router AppAssembly="@typeof(Program).Assembly">
            <Found Context="routeData">
                <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                    <NotAuthorized>
                        <RedirectToLogin />
                    </NotAuthorized>
                </AuthorizeRouteView>
            </Found>
            <NotFound>
                <LayoutView Layout="@typeof(MainLayout)">
                    <p>Sorry, there's nothing at this address.</p>
                </LayoutView>
            </NotFound>
        </Router>
    </CascadingAuthenticationState>
    
  • 最后在MainLayout.razor页面中,做了区分 Authorized和NotAuthorized之间:

    @inherits LayoutComponentBase
    <AuthorizeView>
        <Authorized>
            <div class="sidebar">
                <NavMenu />
            </div>
    
            <div class="main">
                <div class="top-row px-4 auth">
                    <LoginDisplay />
                    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
                </div>
    
                <div class="content px-4">
                    @Body
                </div>
            </div>
        </Authorized>
        <NotAuthorized>
            <RedirectToLogin />
        </NotAuthorized>
    </AuthorizeView>
    

测试结果如下:

将@attribute [Authorize] 放入 _Imports.razor 似乎有效。参见 。如果找不到路线,接受的答案可能无法正常工作。不过,您可以使用不同的 public 布局(不是 MainLayout)。