我正在开发一个使用Blazor和身份验证/授权的小型应用程序,在大多数情况下,基于角色的授权是完美的。然而,我有几个场景需要在AuthorizeView组件中授权多个角色,我不确定我是否以最佳方式授权。我试图避免将字符串值硬编码到组件中,所以我首先设置了一个静态类来管理字符串值,如下所示:
public static class Roles
{
public const string Admin = "Admin";
public const string CanManageClients = "CanManageClients";
public const string CanManageProjects = "CanManageProjects";
}
现在,我可以在任何需要的地方使用这些值,对于标准的基于属性的授权,我扩展了AuthorizeAttribute类,允许我根据需要传入多个值。现在我有一个[AuthorizeRoles]
属性可以使用。到目前为止没有问题。我可以用这样的东西装饰整个页面:
@attribute [AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]
以及根据需要的相关方法装饰:
[AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]
public void DoTheThing()
{
//Doing things
}
然而,当涉及到Blazor AuthorizeView组件时,事情会变得棘手。Razor语法不允许我将多个角色链接在一起或插入字符串,所以我找到了一个解决方法:
<AuthorizeView Roles="@rolesList">
<Authorized>
//View related code once authorized
</Authorized>
</AuthorizeView>
以及生成组件期望的逗号分隔字符串的相关代码块:
@code {
string rolesList => $"{Roles.Admin}, {Roles.CanManageClients}";
}
这就像它应该做的那样,让我到达了我需要的地方,但对我来说,它看起来和感觉都很粗糙。我避免了可怕的魔术串场景,但在支持该组件的代码的另一部分,我有一个奇怪的后备字段。我知道我可以通过转移到基于策略或声明的系统来解决这个问题,但老实说,这对这个小应用程序来说太过分了,因为我只有少数用例。如果社区有任何反馈,我们将不胜感激,也许我没有考虑什么,也许这就是好的方式?
这可能有助于
<AuthorizeView Roles="@($"{Roles.Admin}, {Roles.CanManageClients}")">