Blazor 安全性 - Razor Pages 自定义身份验证/安全性

Chr*_*itt 7 razor asp.net-core razor-pages blazor-server-side

我正在尝试构建一个托管在服务器上的 Blazor 应用程序,起点位于一个 razor 页面内。类似的东西:

<component type="typeof(Main)" render-mode="ServerPrerendered" param-Data="@simple"/>
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如果剃刀页面具有授权属性,所有 blazor 代码都不是通过身份验证正确保护的,会发生什么?
  • 没有剃刀页面电路 id 就不可能调用 blazor 应用程序吗?
  • 如果我的 razor 页面确实具有基于OnGetAsync方法内的数据库值的自定义身份验证- 我是否需要在 blazor 中重做某些内容,或者只有在 razor 页面工作时才呈现有状态组件?

  • 如果我有一个具有按钮调用的任意 if/else 块会发生什么,该按钮调用是否会受到状态的保护?

沿线的东西:

@if (HasPermission)
{
   <button type="button" onclick="MutateDatabase">MutateDatabase</button>
}
Run Code Online (Sandbox Code Playgroud)

tim*_*mur 5

我假设您运行 Blazor Server(在撰写本文时,WASM 仍处于预览阶段,并且在安全方面会有很大不同)。

文档指出 Blazor 确实与 ASP.NET Core 身份集成:

Blazor 服务器应用程序包括一个AuthenticationStateProvider从 ASP.NET Core 的 HttpContext.User 获取身份验证状态数据的内置服务。这就是身份验证状态与现有 ASP.NET Core 服务器端身份验证机制集成的方式。

现在,回答您的问题:

  1. 给定您的渲染模式,要使 Blazor 启动,Razor 页面必须渲染初始状态并标记 Blazor 稍后将在其中管理视图的元素。AuthorizeAttribute 的工作方式(我想这就是您的意思?)将阻止页面呈现,因此这应该会阻止 Blazor 完全启动 - 您将被重定向到进行身份验证。但是,一旦您的用户通过了那个门 - 请注意,Blazor[Authorize]不同的方式处理子控件

    仅用于通过 Blazor 路由器[Authorize]访问的@page组件。授权仅作为路由的一个方面执行,而不是为页面内呈现的子组件执行。要授权在页面内显示特定部分,请AuthorizeView改用。

    (这似乎不是你的情况,但我会把它放在这里以防万一)

  2. 我不完全确定我是否理解这里的声明:circuitMS 使用这个术语来标识您的应用程序实例在显示给客户端时所在的服务器切片。连接是通过 websockets 维护的,并且通常限于会话(检查/_blazor端点的cookie 和 url 参数)。但是,不能保证用户在整个应用程序生命周期内都拥有相同的电路(由于连接问题或服务器负载平衡器配置)——这很好,您应该自己处理电路之间的状态持久性

  3. 我相信这种情况与 (1) 相同:在呈现托管 Razor 视图之前,您不会启动 Blazor。
  4. 最好遵循 Blazor 的安全管理页面:您有几个选项可以确保满足经过身份验证的用户的需求:

    1. 使用<AuthorizeView>控制什么获取呈现:

    <AuthorizeView>
    <Authorized>
        <button type="button" onclick="MutateDatabase">MutateDatabase</button>
    </Authorized>
    <NotAuthorized>
        <p>You're not signed in.</p>
    </NotAuthorized>
    </AuthorizeView>
    
    Run Code Online (Sandbox Code Playgroud)

    从技术上讲if (user.IsInRole()),您可以使用语句,但当 User AuthenticationState 更改时,它可能不会更新

    如果这还不够,您可以选择级联AuthenticationState参数或查看实现您自己的 AuthenticationStateProvider