asp.net-core - Blazor 安全性 - Razor Pages 自定义身份验证/安全性

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

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

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

我的问题是:
  • 如果 Razor 页面具有授权属性,所有 blazor 代码都不是通过身份验证正确保护的,会发生什么?
  • 没有 Razor 页面电路 id 就不可能调用 blazor 应用程序吗?
  • 如果我的 Razor 页面确实具有基于 OnGetAsync 中的数据库值的自定义身份验证怎么办?方法 - 我是否需要在 blazor 中重做某些内容,还是只有在 razor 页面工作时才会呈现有状态组件?
  • 如果我有一个具有按钮调用的任意 if/else 块会发生什么,该按钮调用会受到状态保护吗?

  • 沿线的东西:
    @if (HasPermission)
    {
       <button type="button" onclick="MutateDatabase">MutateDatabase</button>
    }
    

    最佳答案

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

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

    Blazor Server apps include a built-in AuthenticationStateProvider service that obtains authentication state data from ASP.NET Core's HttpContext.User. This is how authentication state integrates with existing ASP.NET Core server-side authentication mechanisms.



    现在,回答您的问题:
  • 给定您的渲染模式,要使 Blazor 启动,Razor 页面必须渲染初始状态并标记 Blazor 稍后将在其中管理 View 的元素。方式AuthorizeAttribute工作(我想这就是你的意思?)会阻止页面呈现,所以这应该阻止 Blazor 完全启动 - 你将被重定向到身份验证。但是,一旦您的用户通过了那个门 - 请注意 Blazor 处理 [Authorize]child controls differently :

    Only use [Authorize] on @page components reached via the Blazor Router. Authorization is only performed as an aspect of routing and not for child components rendered within a page. To authorize the display of specific parts within a page, use AuthorizeView instead.



    (这似乎不是你的情况,但我会把它放在这里以防万一)
  • 我不完全确定我是否理解这里的声明: circuit 是 MS 用来标识您的应用程序实例在显示给客户端时所在的服务器切片的术语。连接是通过 websockets 维护的,并且通常限定在一个 session 中(查看您的 /_blazor 端点的 cookie 和 url 参数)。但是,不能保证用户在整个应用程序生命周期内都具有相同的电路(由于连接问题或服务器负载平衡器配置)- 没关系,您应该处理状态 persistance across circuits你自己。
  • 我相信这种情况与 (1) 相同:在呈现托管 Razor View 之前,您不会启动 Blazor。
  • 最好遵循 Blazor 的 security management page :您有几个选项可以确保满足经过身份验证的用户的需求:
  • 使用 <AuthorizeView>控制渲染的内容:

  • <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

    关于asp.net-core - Blazor 安全性 - Razor Pages 自定义身份验证/安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59784888/

    相关文章:

    javascript - 'IJsonHelper' 不包含 'Encode' 的定义

    asp.net-core - Asp.Net Core 中的 HttpContext.Features 与 HttpContext.Items

    c# - ASP.NET Core多个dbcontext无法添加迁移

    c# - 如何使用自定义路由模式访问 url?

    razor-pages - Razor 页面为用户分配角色

    c# - 将我的应用程序迁移到 ASP.NET Core 3.0 后,之前有效的索引 URL 返回 404

    c# - 如何在 Controller 操作中访问 $orderBy 等查询参数?

    javascript - ASP.NET : Illegal character '@' in '@Html.Raw' call

    c# - 如何在 asp.net mvc 中使用另一个项目的部分 View

    asp.net-core - ASP.NET Core Razor 页面中的排序和过滤