Blazor 服务器端组件中的 @attribute [AllowAnonymous] 无效

Ano*_*ous 5 c# .net-core asp.net-core blazor blazor-server-side

我已经使用 .NET Core 3.0 创建了一个新的 Blazor 服务器端项目,并且已经关闭了未经过身份验证的用户的应用程序。

我现在试图通过将 [AllowAnonymous] 放在文件顶部来允许匿名访问 Index.razor 组件。然而,这似乎并没有做任何事情。

设想

使用默认的 Blazor 模板“WeatherForecast”后,我将以下内容添加到Startup.cs

services.AddMvcCore(options =>
{
    var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
    options.Filters.Add(new AuthorizeFilter(policy));
});
Run Code Online (Sandbox Code Playgroud)

如果用户未通过身份验证,这段代码会阻止对我的应用程序的所有请求。

添加那段代码后,我想为未经身份验证的用户打开默认的Index.razor组件。我通过将@attribute [AllowAnonymous]添加到 Index.razor 来做到这一点:

@page "/"
@attribute [AllowAnonymous]

<h1>Hello, world!</h1>

Welcome to your new app.
Run Code Online (Sandbox Code Playgroud)

应用程序.razor

<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
    <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
    <CascadingAuthenticationState>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </CascadingAuthenticationState>
</NotFound>
</Router>
Run Code Online (Sandbox Code Playgroud)

预期结果

运行我的应用程序时,未经身份验证的用户将被允许访问https://localhost:XXXX的索引页面

实际结果

我的用户被转发到我的 OpenIdConnect URI。

Lie*_*ero 0

您需要将整个 Blazor 应用程序视为 ASP.NET Core 的单个 html 页面。换句话说,Blazor 应用程序托管在单个 html 页面中。这就是为什么它被称为单页应用程序框架:)

如果用户无权访问该单个页面,则任何 Blazor 代码都无关紧要。


@attribute [AllowAnonymous]仅适用于 Blazor 应用程序,但services.AddMvcCore(options => options.Filter.Add(...))不允许用户访问托管 Blazor 应用程序的单个页面。

它与任何其他 SPA 框架相同。如果您有一个托管在 HTML 文件中的 React/Angular/Vue 应用程序,您需要确保用户有权访问该 HTML 文件。

我认为你必须执行以下操作:

  1. 修改为 ASP.NET Core 授权以授权您的其他控制器/页面,但允许匿名访问您的整个 blazor 应用程序(所有其他路由)。

    我没有尝试过,但是像这样的东西代替了授权过滤器

    app.MapRazorPages().RequireAuthorization();
    app.MapControllers().RequireAuthorization();
    
    app.MapRazorComponents<App>().AllowAnonymous()
       .AddInteractiveServerRenderMode()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 修改您的 Blazor 应用程序以授权除 index 之外的所有页面。