C# MVC Простая пользовательская аутентификация с ролями

TL;DR

Редактировать

По сути, я просто хочу сказать какой-то функции: хорошо, я проверил этого пользователя сам, он в порядке. Теперь сохраните некоторые произвольные данные о нем и создайте для него сеанс, который дает ему разрешения на доступ к определенным частям моего приложения.

что-то в этом роде:

logInUserFrameworkFunction(new UserStruct(int id, string username, RolesEnum[] roles));

И чем все обрабатывается в фоновом режиме, чтобы сделать [Authorize(Roles = RolesEnum.Admin | RolesEnum.Manager)] атрибутировать работу.

Я мог бы сделать это с сессиями сам, но я хотел бы пропустить эту часть:D


Я играю с MVC и Entity Framework, и теперь я хотел бы реализовать простую аутентификацию пользователей с ролями.

я имею User класс / таблица в моей базе данных, которая выглядит примерно так:

public class User {
    int ID;
    string Email;
    string Password;
    Role Role;
...
}

А также Role класс, который выглядит так:

public class Role {
    int ID;
    RoleType Type; // this is an Enum
}

public Enum RoleType {
    visitor, employee, admin
}

Теперь проверить в контроллере входа, существует ли пользователь с указанным именем пользователя и паролем, я просто делаю что-то вроде этого:

[HttpPost]
    public ActionResult LogIn(LogIn login) {
        // If credentials are valid
        if(new UserManager().IsValid(login.Username, login.Password)) {
            var user = db.getUserByEmail(login.Username);
...

Я мог бы легко хранить пользователя ID а также Role в сеансе, а затем проверить учетные данные, позвонив некоторым function на каждом соответствующем контроллере, но я хочу использовать некоторые функции C# и MVC.


Дело в том, что я бы предпочел сделать это с атрибутами, но я не уверен, как.

Вот как я это представлял:

[Roles(RoleType.visitor, RoleType.employee)]
public ActionResult SomeProtectedAction() {
// only employee and visitor can access this,
// others get redirected to where ever
...
}

1 ответ

Вы можете авторизоваться с помощью ролей следующим образом:

[Authorize(Roles= MyEnum.Admin | MyEnum.Moderator)]
public ActionResult myAction()
{
}

Атрибут Authorize здесь применяется на уровне контроллера, но вы можете применять его только к методам действий, в зависимости от ваших потребностей.

При условии, что вы правильно настроили логику аутентификации (ASP.NET Identity), которая будет возвращать cookie аутентификации, включая роли пользователей. Теперь после успешного входа в систему, если вы делаете запрос к методу контроллера, cookie распаковывается в фоновом режиме и свойство User this.User заполнен этими данными, включая роли этого пользователя.

Атрибут authorize сделает проверку за вас автоматически.

Другие вопросы по тегам