重定向到 Blazor WebAssembly 中的 403 禁止组件

Posted

技术标签:

【中文标题】重定向到 Blazor WebAssembly 中的 403 禁止组件【英文标题】:Redirect to 403 Forbidden component in Blazor WebAssembly 【发布时间】:2020-08-27 08:06:32 【问题描述】:

我目前正在开发一个 .NET Standard 2.1 Blazor WebAssembly Hosted 应用程序。

在我的身份验证方案中,我使用用户角色

如果用户不是角色,即管理员,我想将所有用户重定向到<ForbiddenView />

最好在应用程序的一个地方处理这个问题。

我的 App.razor 如下所示:
   <CascadingAuthenticationState>
        <Router AppAssembly="@typeof(Program).Assembly">
            <Found Context="routeData">
                <AuthorizeRouteView RouteData="@routeData">
                    <Authorizing>
                        <p>Authorizing...</p>
                    </Authorizing>
                    <NotAuthorized>
                        @if (!context.User.Identity.IsAuthenticated)
                        
                           // User is not authenticated - forward to login view
                            <LoginView />
                        
                        else if(context.User.Identity.IsAuthenticated && context.User.Identity.NotInRole) // .NotInRole does not exist!!
                        
                            // 403 - User is authenticated, but not in a specific role i.e. admin to view a page in my app. The server understood the request, but is refusing to fulfill it.
                            <ForbiddenView />
                        
                        else
                        
                           // 401 - Login of my user happend - the request already includes Authorization credentials.
                            <NotAuthorizedView />
                        
                    </NotAuthorized>
                </AuthorizeRouteView>
            </Found>
            <NotFound>
                <NotFoundView />
            </NotFound>
        </Router>
    </CascadingAuthenticationState>

你知道如何集中处理 Blazor WebAssembly 中的 403 错误吗?

您对如何处理 Blazor WebAssembly 上的 403 错误有任何建议吗?

【问题讨论】:

【参考方案1】:

尝试在不同的上下文中使用 AuthorizeView:

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData">
                <Authorizing>
                    <p>Authorizing...</p>
                </Authorizing>
                <NotAuthorized>
                    <AuthorizeView Context="authenticated">
                        <Authorized Context="authenticated">
                            <AuthorizeView Roles="WhatEver" Context="role">
                                <Authorized Context="role">
                                    <NotAuthorizedView />
                                </Authorized>
                                <NotAuthorized Context="role">
                                    <ForbiddenView />
                                </NotAuthorized>
                            </AuthorizeView>
                        </Authorized>
                        <NotAuthorized Context="authenticated">
                            <RedirectToLogin />
                        </NotAuthorized>
                    </AuthorizeView>
                </NotAuthorized>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <NotFoundView />
        </NotFound>
    </Router>
</CascadingAuthenticationState>

!context.User.IsInRole("WhatEver");

如果您特别需要 NotInRole:

public static bool NotInRole(this ClaimsPrincipal claimsPrincipal) 
    => claimsPrincipal.Claims.All(c => c.Type != "role");

【讨论】:

以上是关于重定向到 Blazor WebAssembly 中的 403 禁止组件的主要内容,如果未能解决你的问题,请参考以下文章

使用参数在 blazor 中重定向

从 Blazor 组件 (.razor) 重定向到 Razor 页面 (.cshtml) [服务器端]

当 url 响应状态代码为 400 时如何使用 C# .Net Core 5 Blazor 服务器端应用程序中的中间件重定向到主页

多个 Blazor 应用程序,相同的托管。从第一个应用程序重定向到第二个应用程序。 Azure 应用服务

Angular 项目中的 Blazor webassembly

2022 wasm blazor.webassembly.js 未找到 .net5 到 .net6 升级