如何在AuthorizeAttribute中使用enum razor mvc?

时间:2016-07-20 20:55:36

标签: c# asp.net .net asp.net-mvc razor

我有这个枚举:

public enum PerfilUsuarioEnum
{
    AdministradorSistema = 1,
    AdministradorLoja = 2,
    Gerente = 3
}

我希望将其传递给我的授权角色

[Authorize(Roles = PerfilUsuarioEnum.AdministradorLoja + ", " + PerfilUsuarioEnum.Gerente)]

有一些方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

角色必须是常量表达式,例如string。最简单的方法是使用cosntant。

public static class PerfilUsuario
{
   public const string AdministradorLoja = "AdministradorLoja";
   public const string Gerente = "NaviGerentegators";
}

[Authorize(Roles = PerfilUsuario.AdministradorLoja + ", " +
     PerfilUsuario.Gerente)]

答案 1 :(得分:0)

好问题。这就是我做的......

我决定将我的权限数据库驱动,所以我需要一种方法将字符串转换为某些内容" typed"所以我可以得到编译时警告,所以我可以更改数据库中的权限名称,而不必更新我们所有的生产代码。由于属性是基于字符串的(所谓的魔术字符串),我决定不使用枚举,而是使用读取数据库的T4脚本并为每条记录生成结构。这样我就可以添加一些好的显示名称,有关权限的详细信息以及可以向用户显示的错误消息。

这是T4模板运行后的示例权限行。

public struct CanViewClaimData
{
    // Using const allows the compiler to generate the values in the assembly at compile time and satisfy MVC Authorize Attribute requirements for const strings.
    public const System.String Name = "CanViewClaimData";
    public const System.String DisplayName = "Can View Claim Data";
    public const System.String Description = "The allows users to view claim data";
    public const System.String DefaultErrorMessage = "You must have the \"Can View Claim Data\" permission to access this feature.";

}

然后在代码中我使用子类授权并将Action标记为

[Security.AuthorizedAttribute(Roles = CanViewClaimData.Name, Message = CanViewClaimData.DefaultErrorMessage)]

然后在每次自动构建期间推送到C.I.环境,我运行T4模板作为构建过程的一部分,以保持结构字符串与数据库同步。

到目前为止,这一点非常有效,并且允许我让我们的产品所有者能够在数据库中编辑权限名称,描述等,而无需开发人员参与。