用户角色和授权

时间:2011-07-05 21:55:40

标签: asp.net-mvc-3 authorization repository-pattern login-control user-roles

所以我想创建一个登录页面,当您以管理员身份输入登录凭据时,您将获得访问权限。如果您不是管理员,则会重定向回登录页面。在我的数据库中,我有一个布尔类型字段:

isAdmin <--datatype(byte")

那么你怎么能以最好的方式做到这一点?!我想以存储库模式的方式执行此操作,因为它更容易进行单元测试。

我已经搜索了很多内容并开始对此事感到困惑。我应该有多少班级,型号等?!我猜一个控制器会这样做。有人有什么好主意吗?!我已经阅读了一些有关用户角色的DCI模式但是因为它基本上“仅”来检查数据库中的布尔值是否有点过分?感谢所有反馈。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,我也有类似的问题。从您的问题看来,您没有使用默认成员资格提供程序(至少按原样)。我也没有。所以我所做的是创建一个新的授权属性。在你的情况下,它看起来像这样:

public class AdminOnlyAttribute : AuthorizeAttribute {
    IUserRepository _UserRepository;

    public SimpleUser SimpleUser { get; set; }

    public AdminOnlyAttribute() {
        _UserRepository = new SqlUserRepository(new DbContext());
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        bool baseAuthorized = base.AuthorizeCore(httpContext);
        if (!baseAuthorized) {
            return false;
        } 

        //Here you use your repository to check if a user is an admin or not
        bool isAdmin = _UserRepository.IsAdmin(int.Parse(httpContext.User.Identity.Name));

        if (!isAdmin) {
            return false;
        }

        return true;
    }
}

存储库方法IsAdmin可以像查询一样简单,以检查与提供的用户ID相对应的布尔值。这样的事情(请仔细检查是否需要SingleOrDefault()):

public bool IsAdmin(int userID) {
    bool isAdmin = (from user in db.Users
                    where user.ID == userID
                    select user.isAdmin).SingleOrDefault();
    return isAdmin;
}

然后在你想要的动作中使用它:

[AdminOnly]
public ActionResult Index(){
    //Code here...
}

当这返回false时,你的ActionResult将是一个HttpUnauthorizedResult,理论上它应该重定向到登录页面。

答案 1 :(得分:1)

您应该创建一个自定义成员资格提供程序,并将用户isAdmin作为ValidateUser的一部分进行检查。

或者,如果允许其他用户使用,请使用自定义角色提供程序。

以下链接是一个很好的起点

http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-1/

答案 2 :(得分:0)

你的isAdmin列是一位还是一个字节?它可能应该是一点点。您可以创建一个检查凭据和IsAdmin列的查询。如果返回一行,则登录成功。