【问题标题】:Blazor prevent POST actions for not authorized usersBlazor 阻止未授权用户的 POST 操作
【发布时间】:2020-11-17 09:47:58
【问题描述】:

我正在使用 Blazor 服务器,我想阻止用户对应用进行更改。 有些将拥有writer 和一些reader 权限。

我有“全局”组件,这很好,因为我可以做这样的事情:

<AuthorizeView Policy="@Policies.HAS_WRITE_PERMISSIONS">
    <Authorized>
        <DxButton SizeMode="SizeMode.Large" SubmitFormOnClick="true" Text="@(IsSaving ? "Saving...":"Save" )" Enabled="!IsSaving && !Disabled"></DxButton>
    </Authorized>
    <NotAuthorized>
        <br />
        <i> You are not authoried to make any changes</i>
    </NotAuthorized>
</AuthorizeView>
@code{
    [Parameter]
    public bool IsSaving { get; set; }

    [Parameter]
    public bool Disabled { get; set; }

}

但这并不妨碍我“聪明”的用户如何将按钮插入任何表单(例如使用 Chrome 开发人员工具)并点击Save

不想只为读者制作特殊视图并重复数十个视图。我想重用相同的视图(只是阻止它们对数据进行任何更改)。

Blazor 中是否有任何全局 POST 操作拦截器或任何“全局”。

我尝试将属性添加到方法中,但这不起作用。

 [Authorize(Policy = Policies.HAS_WRITE_PERMISSIONS)]
        protected async Task HandleValidSubmit()

编辑:

我没有使用 httpClient 连接到后端(应用程序将始终是 Blazor 服务器,而不是 Blazor WebAssembly)。我“直接”连接到后端代码。

编辑2:

当然,我可以创建 IdentityContext,它使用 AuthenticationStateProvider 检查所需的角色并将该检查添加到每个 Submit 方法,但它比应用属性或制作一些“全局”解决方案更难看。

 protected async Task HandleValidSubmit()
        {
            if (await IdentityContext.HasWritePermissions() == false)
            {
                return;
            }
          ...

【问题讨论】:

  • 我认为从架构的角度来看,将授权策略添加到受保护的 API 并从前端或服务层调用它会更有意义,您可以相应地响应潜在的 403。
  • 我不想进行架构更改并使用 httpClient。应用程序将始终是 Blazor 服务器,它不想复杂化并使用 httpClient 在服务器上发出请求,而我目前“在服务器上”
  • 原谅我的无知,但为什么非授权用户甚至看到他们不应该能够提交的表单。
  • 因为,就像问题中所说的那样:有只能看到的用户(读者)和具有作家角色的用户(能够做出破坏性行为)。我不想复杂的事情,只是简单,优雅的解决方案。我不想制作 APIis,也不想制作特殊的“读者”视图。只需隐藏提交按钮并防止“聪明”用户仍然提交任何内容。这不是公共应用程序,只有少数用户会使用它。但我仍然想让它安全,而不需要进行 2 周的开发。一些装饰我所有破坏性操作的 DestructiveOperationDecorator 可以完成这项工作

标签: c# asp.net-core blazor blazor-server-side


【解决方案1】:

也许它太简单了,但您是否考虑过使用简单级别的封装? 如果用户具有正确的权限,创建一个接受应该发生的操作的委托的方法?


    public static class IdentiyContextExecuter
    {
        public static async Task<T> Execute<T>(Func<Task<T>> method, IdentityContext context)
        {
            if (await context.HasWritePermissions() == false)
            {
                return default;
            }

            T result = await method();
            return result;
        }
    }

并且在您的提交方法或每个提交方法中,您可以使用该类。

protected async Task HandleValidSubmit()
{
    var result = await IdentiyContextExecuter.Execute(() => Task.FromResult(true), IdentityContext);
} 

我猜它不是很优雅,但应该符合你的目的。您可以将其重写为 IdentityContext 类的扩展方法。赞ExecuteIfHasWritePermissions(...)

【讨论】:

  • 事实上,我已经为我的所有“破坏性”动作准备了一些装饰器。所以我可以在方法的开头添加这个授权检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多