寻找一种实现基本用户角色的简单方法

时间:2014-04-17 10:42:34

标签: c# authorization asp.net-mvc-5 roles identity

我正在使用Windows身份验证构建Intranet应用程序,并且已将用户拉到我的本地数据库,只保留Active Directory所需的信息。

我想为我的用户(管理员或用户)分配角色并限制管理员视图。

有没有一种简单的方法可以在不使用Identity路径的情况下执行此操作?我已经对它进行了调查,看起来有点矫枉过正,相当混乱。是否有办法创建一个可用作注释的实用程序类,并根据当前用户角色属性简单地限制视图?

1 个答案:

答案 0 :(得分:1)

我为那些感兴趣的人找到了一个简单的解决方案我决定完全避免使用任何角色提供程序,因为您真正需要的是一种对请求进行身份验证的方法,另一种是检查用户角色的方法。在我的Global.asax中,我添加了以下方法taken from this blog post

void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    var ctx = HttpContext.Current;
    if (ctx.Request.IsAuthenticated)
    {
        string[] roles = LookupRolesForUser(ctx.User.Identity.Name);
        var newUser = new GenericPrincipal(ctx.User.Identity, roles);
        ctx.User = Thread.CurrentPrincipal = newUser;
    }
}

您必须自己实现的唯一方法是LookupRolesForUser。我看起来像这样(Linq将取决于你的数据库结构,我有3个表格:User,Role和User_Role):

public string[] LookupRolesForUser(string username)
{
    using (MyContext db = new MyContext())
    {
        var user = db.Users.FirstOrDefault(u => u.Username.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));

        var roles = from ur in user.Roles
                    from r in db.Roles
                    where ur.RoleId == r.RoleId
                    select r.RoleName;
        if (roles != null)
            return roles.ToArray();
        else
            return new string[] { }; ;
    }
}

然后您可以在控制器中使用Authorize annotion:

 [Authorize(Roles = "Administrator")]
 public class AdminController : BaseController