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