Роли пользователей и авторизация - PullRequest
0 голосов
/ 06 июля 2011

Итак, я хочу создать страницу входа, где при вводе учетных данных для входа в систему вы получаете доступ. Если вы не являетесь администратором, вы будете перенаправлены обратно на страницу входа. В моей базе данных есть поле логического типа:

isAdmin <--datatype(byte")

Так как ты можешь сделать это наилучшим образом ?! Я хотел бы сделать это в виде шаблона репозитория, так как тогда становится проще его модульное тестирование.

Я много гуглил и начинаю немного путаться по этому вопросу. Сколько классов, моделей и т. Д. У меня должно быть ?! Я предполагаю, что один контроллер подойдет. У кого-нибудь есть хорошие идеи ?! Я читал некоторые из паттернов DCI о ролях пользователей, но поскольку это в основном «только», чтобы проверить, что логическое значение в базе данных, может быть, это излишне? Благодарен за все отзывы.

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Если я правильно понимаю, у меня была похожая проблема. Из вашего вопроса видно, что вы не используете поставщика членства по умолчанию (по крайней мере, как есть). Я тоже не Поэтому я создал новый атрибут авторизации. В вашем случае это может выглядеть примерно так:

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 может быть простым запросом, чтобы проверить логическое значение, соответствующее предоставленному идентификатору пользователя. Примерно так (пожалуйста, проверьте, если 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 голос
/ 06 июля 2011

Вам следует создать пользовательский поставщик членства и проверить пользователя isAdmin как часть ValidateUser.

В качестве альтернативы, если другие пользователи разрешены, используйте поставщика пользовательских ролей.

Следующая ссылка - хорошее место для начала

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

0 голосов
/ 06 июля 2011

Является ли ваш столбец isAdmin битовым или байтовым?Наверное, должно быть немного.Вы можете просто создать запрос, который проверяет учетные данные и столбец IsAdmin.Если строка возвращается, то вход был успешным.

...