Как использовать другую базу данных и сеанс для авторизации? - PullRequest
0 голосов
/ 04 марта 2012

Я создаю приложение Asp.net MVC3 (с Razor), и у меня есть база данных, которая содержит информацию о пользователях и ролях.

Это упрощенная схема моей БД.

Пользователь ( IDUser , Логин, Пароль);
Роль ( IDRole , Имя);
UserInRole ( IDUser , IDRole );// Многие ко многим

Выглядит так:

db schema screnshot

Я читал об использовании AuthorizeAttribute, для управления страницами для зарегистрированных пользователей, с определенными ролями, и я исследуюоб использовании моей БД для управления пользователями и ролями.Поэтому мои вопросы:

  1. Можно ли использовать мою БД для управления пользователями и ролями и использовать [Авторизовать] в моих действиях?[Если да, то как я могу это сделать?]
  2. Возможно ли использовать сеанс вместо cookie для управления входом в систему и использовать родную авторизацию Asp.net MVC3?[если да, то как мне это сделать?если нет, как использовать сессию в противном случае?]

Если возможно, пожалуйста, отправьте примеры кода.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Не уверен, правильно ли я понял, но вы хотите использовать атрибут [Authorize] для работы с вашей пользовательской базой данных пользователей?

Если это так, нужно кое-что проверить:

Чтобы просто разрешить / запретить в зависимости от того, авторизован пользователь или нет, атрибут stock [Authorize] будет работать просто отлично. Настраиваемая логика входит в действие «Вход в систему», где вы проверяете базу данных с заданными учетными данными и соответственно запускаете куки. Что-то вроде:

    public ActionResult Login(string username, string password)
    {
        bool isValid = //check the database with the given username and password

        if(isValid)
        {
            FormsAuthentication.SetAuthCookie(username, false);

            return RedirectToAction("...");
        }else
        {
            return View();
        }
    }

Если вы хотите также контролировать доступ на основе ролей, я бы сказал, что есть два способа:

  • Реализация пользовательских провайдеров членства и ролей, что мне не нравится, поскольку я нахожу их довольно бесполезными, и всегда заканчиваю переделкой логики в моих репозиториях

  • Реализация пользовательского атрибута AuthorizeAttribute, например

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            //Check based on these 2 properties:
            //  this.Roles
            //  this.Users
            //against httpContext.User
    
            //return true or false to indicate access or deny 
        }
    }
    
0 голосов
/ 11 марта 2012

Спасибо, Педро. Основываясь на вашем посте, я строю это для использования СЕССИИ:

public class CustomAutorizeAttribute : AuthorizeAttribute
{
    public List<string> Roles { get; set; }

    public CustomAutorizeAttribute()
    {
    }

    public CustomAutorizeAttribute(params string[] Roles)
    {
        this.Roles = new List<string>();
        this.Roles.AddRange(Roles);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        User user = (User)httpContext.Session["user"];

        if (user != null)
        {
            if (Roles != null)
            {
                foreach (var role in user.Roles)
                {
                    if (Roles.Exists(e => e == role)) return true;
                }
                return false; // User don't have any hole
            }
            else
            {
                return true; // The Attribute is used without roles.
            }
        }
        else return false; // Not logged.
    }
}

Пишите здесь, чтобы надеяться на других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...