有没有其他方法可以检查用户所处的 .net 角色

本文关键字:net 角色 用户 检查 其他 方法 有没有 | 更新日期: 2023-09-27 18:35:18

我有很多检查来确定用户的角色,然后分配角色编号。有没有办法我可以简化检查吗?

        if (User.IsInRole("Super"))
        {
            ViewBag.Role = 30;
        }
        else if (User.IsInRole("Admin"))
        {
            ViewBag.Role = 20;
        }
        ...
        ...
        else if (User.IsInRole("Guest"))
        {
            ViewBag.Role = 10;
        }
        else
        {
            ViewBag.Role = 5;
        }

我需要做的是找到用户所处的最高角色,然后将该值分配给 ViewBag.Role,这是一个动态变量。上面的代码确实有效,但所有的 if 和 else 语句对我来说都不像是好的编码实践。

有没有其他方法可以检查用户所处的 .net 角色

您可以向 User 类添加一个属性:

    public virtual int RoleNumber
    {
        get
        {
            if (this.IsInRole("Super")) return 30;
            if (this.IsInRole("Admin")) return 20;
            if (this.IsInRole("Guest")) return 10;
            return 5;
        }
    }

然后在视图中:

ViewBag.Role = User.RoleNumber

如果用户只有一个角色,则可以使用 GetRoles 方法(该方法返回一个角色数组)来检查它是否具有任何值。
如果是这样 - 您可以使用要提供给视图包的值将用户具有的第一个和唯一角色解析为枚举。如果数组没有值 - 您可以提供默认的最小值。


如果有多个角色,可以用更"复杂的方式"来解决,但归根结底,开发、理解和执行的成本可能比简单的 if 要高。其他代码

我会使用枚举而不是字符串。这允许您对名称进行编译时检查。

以下代码为您提供了更改(广告或删除)角色的灵活性,而无需更改下划线角色检查逻辑。

    public int IsInRole()
    {
        int defaultValue = (int)UserRole.Default;
        var names = Enum.GetNames(typeof (UserRole));
        foreach (var name in names)
        {
            if(User.IsInRole(name))
            {
                defaultValue = (int)((UserRole)Enum.Parse(typeof(UserRole), name));
                break;
            }
        }
        return defaultValue;
    }
public enum UserRole
{
    Super = 30,
    Admin = 20,
    Guest = 10,
    Default = 5
}

你可以尝试这样的事情:

Dictionary<string, int> weight = new Dictionary<string, int>();
weight.Add("Super", 30);
weight.Add("Admin", 20);
weight.Add("Guest", 10);
string[] roles = Roles.GetRolesForUser(User.Identity.Name);
if (roles.Any())
{
  ViewBag.Role = weight.Where(w => roles.Contains(w.Key))
    .OrderBy(w => w.Value)
    .FirstOrDefault();
}
else
{
  ViewBag.Role = 5;
}

假设您的角色类为

public class Role
{
    public string Name { get; set; }
    public int Number { get; set; }
    ......
}

您可以使用

var roles = GetYourRoles(); // IEnumerable<Role>    
var result = roles.First(r => User.IsInRole(r.Name));

扩展ASP怎么样?NET 的角色表?如果每个角色都有固定权重,则创建一个表(称为RoleWeight或其他东西)并使用该角色设置所需的权重。这样,您就不必设置任何内容(并消除"看起来不像良好的编码实践"的代码),而是已经存在值。