【发布时间】: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