0

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

isAdmin <--datatype(byte")

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

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

4

3 回答 3

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 理论上应该重定向到登录页面。

于 2011-07-05T22:32:02.303 回答
1

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

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

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

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

于 2011-07-05T22:03:40.163 回答
0

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

于 2011-07-05T22:01:22.700 回答