<路由器>在 Blazor 8 中未按预期工作

<Router> is not working as expected in Blazor 8

提问人:Web Dev 提问时间:11/17/2023 更新时间:11/20/2023 访问量:156

问:

我有一个正常工作的 Blazor 7 WASM 应用。它在文件中有以下代码:<Router>App.razor

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <h2>You are not authorized.</h2>
                <h3>To log in click <a href="/Accounts/LogIn">here</a>.</h3>
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
        <CascadingAuthenticationState>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </CascadingAuthenticationState>
    </NotFound>
</Router>

我在 Blazor 8 交互式 Web 程序集中移动了相同的应用,并将上述代码添加到 Server 项目(即没有 .client 的项目)的组件中。但是上面的代码不再起作用了。Routes.razor

例如,所有具有 [Authorize] 属性的应用组件现在都会引发 401 错误,而不是显示上面的部分。<NotAuthorized>

同样,导航到错误的 URL 也不会显示该部分。<NotFound>

这在 Blazor 7 中按预期完美运行,但在 Blazor 8 中不起作用。我的 Blazor 8 如下所示:Routes.razor

<Router AppAssembly="@typeof(Program).Assembly" AdditionalAssemblies="new[] { typeof(Client._Imports).Assembly }">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <h2>You are not authorized.</h2>
                <h3>To log in click <a href="/Accounts/LogIn">here</a>.</h3>
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
       <CascadingAuthenticationState>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
       </CascadingAuthenticationState>
    </NotFound>
</Router>

我也尝试将整个包裹在里面,但问题仍然存在。<Router><CascadingAuthenticationState>

可能是什么问题?我需要在哪里修复?

请帮忙。

asp.net-core blazor 服务器端 blazor-webassembly

评论

0赞 Md Farid Uddin Kiron 11/17/2023
你检查过浏览器日志吗?你在那里遇到任何错误吗?此外,请确认您的身份验证状态是否通过您的组件正确级联。该组件应包装依赖于身份验证的整个内容。确保身份验证状态正确地传递到组件。<CascadingAuthenticationState>
0赞 Web Dev 11/17/2023
浏览器显示具有 [Authorize] 属性的所有组件的 401 错误。浏览器控制台中没有其他错误。我已经尝试将整个<路由器>放在 <CascadingAuthenticationState> 中,但没有运气。此应用适用于 Blazor 7。尚未对 JWT 代码和自定义身份验证状态进行任何更改。所以,我认为身份验证状态也必须没问题。检查身份验证状态是否正确的最佳方法是什么?
0赞 Md Farid Uddin Kiron 11/17/2023
好吧,为了检查身份验证状态是否相应地工作,您可以直接注入 AuthenticationState 服务并检查其属性以查看用户是否是 它将允许您在组件级别检查身份验证状态,并可以帮助确定身份验证状态的处理方式是否存在问题。确保您的中间件顺序也正确无误。@inject AuthenticationState AuthenticationState <p>IsAuthenticated: @AuthenticationState.User.Identity.IsAuthenticated</p>
0赞 ℍ ℍ 11/17/2023
有多少[授权],在哪里?
0赞 Web Dev 11/20/2023
我在代码中检查了 AuthenticationState。令人惊讶的是,除了 MainLayout 之外,它在所有组件中都是正确的。因此,各个组件内部的身份验证和授权工作正常,但相同的代码在 MainLayout.razor 中不起作用。

答:

0赞 Artur Chrzanowski 11/20/2023 #1

嗨,我今天在我自己迁移到 Net 8 时处理了这个问题。

正如官方文档所说:https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-8.0#provide-custom-content-when-content-isn't-found

本部分仅适用于 Blazor WebAssembly 应用。 Blazor Web 应用 不要使用 NotFound 模板

他们建议使用这个: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0#usestatuscodepageswithredirects

因此,您需要做的是在启动中添加以下行:

应用程序。UseStatusCodePagesWithReExecute(“/StatusCode/{0}”);

然后像这样制作具有相应 URL 的页面

@page “/StatusCode/404” // 未找到

@page “/StatusCode/x” // 对于除 401 之外的任何其他内容

等等。

我希望它能对你有所帮助,它对我有用。(虽然我的项目有 blazor 服务器背景)。