【问题标题】:Blazor Security - Razor Pages custom authentication/securityBlazor 安全性 - Razor 页面自定义身份验证/安全性
【发布时间】:2020-05-04 04:42:17
【问题描述】:

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

<component type="typeof(Main)" render-mode="ServerPrerendered" param-Data="@simple"/>

我的问题是:

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

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

类似的东西:

@if (HasPermission)
{
   <button type="button" onclick="MutateDatabase">MutateDatabase</button>
}

【问题讨论】:

  • 我会说如果不渲染剃须刀页面就不可能调用 blazor 组件,没有为该组件定义路由并且它不在 wwwroot 中。

标签: asp.net-core razor razor-pages blazor-server-side


【解决方案1】:

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

documentataion 声明 Blazor 确实与 ASP.NET Core 身份集成:

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

现在,回答您的问题:

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

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

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

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

  3. 我相信这种情况与 (1) 相同:在渲染托管 Razor 视图之前,您不会启动 Blazor。
  4. 最好关注 Blazor 的 security management page:您有几个选项可以确保您为经过身份验证的用户提供服务:

    1. 使用&lt;AuthorizeView&gt; 控制渲染的内容:

    <AuthorizeView>
    <Authorized>
        <button type="button" onclick="MutateDatabase">MutateDatabase</button>
    </Authorized>
    <NotAuthorized>
        <p>You're not signed in.</p>
    </NotAuthorized>
    </AuthorizeView>
    

    从技术上讲,您可以使用 if (user.IsInRole()) 语句,但 might not get updated when User AuthenticationState changes

    如果这还不够,您可以pick up cascading AuthenticationState parameter 或查看implementing your own AuthenticationStateProvider

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2012-09-19
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多