寻找在 Blazor AuthorizeView 组件中使用多个角色的更好方法

Looking for better way to use multiple roles in Blazor AuthorizeView component

我正在开发一个使用 Blazor 和身份验证/授权的小型应用程序,在大多数情况下,基于角色的授权是完美的。但是,在一些情况下,我需要在 AuthorizeView 组件中授权多个角色,但我不确定我是否以最佳方式进行授权。我试图避免将字符串值硬编码到组件中,所以我首先设置一个静态 class 来管理字符串值,如下所示:

public static class Roles
{
    public const string Admin = "Admin"; 
    public const string CanManageClients = "CanManageClients"; 
    public const string CanManageProjects = "CanManageProjects"; 
}

现在我可以在任何需要的地方使用这些值,对于基于标准属性的授权,我扩展了 AuthorizeAttribute class 以允许我根据需要传递多个值。现在我可以使用 [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}")">