我有这个枚举:
public enum PerfilUsuarioEnum
{
AdministradorSistema = 1,
AdministradorLoja = 2,
Gerente = 3
}
我希望将其传递给我的授权角色
[Authorize(Roles = PerfilUsuarioEnum.AdministradorLoja + ", " + PerfilUsuarioEnum.Gerente)]
有一些方法可以做到这一点吗?
答案 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模板作为构建过程的一部分,以保持结构字符串与数据库同步。
到目前为止,这一点非常有效,并且允许我让我们的产品所有者能够在数据库中编辑权限名称,描述等,而无需开发人员参与。