MVC 3 Аутентификация / Авторизация: Роли отсутствуют - PullRequest
1 голос
/ 06 декабря 2011

Мы используем MVC 3. Управление пользователями по умолчанию нам не подходит, так как информация о нашей учетной записи хранится в нашем собственном хранилище данных, и доступ осуществляется через наши собственные классы репозитория.

Я пытаюсь назначить роль главного участника HttpContext.User и выдать файл авторизации.

Основываясь на фрагменте кода, я обнаружил, что попробовал что-то вроде этого:

if (UserIsOk(name, password))
{
    HttpContext.User =
        new GenericPrincipal(
            new GenericIdentity(name, "Forms"),
            new string[] { "Admin" }
        );
    FormsAuthentication.SetAuthCookie(name, false);

    return Redirect(returnUrl);
}

Когда следующий запрос выполнен, пользователь проходит проверку подлинности, но он не в роли «Администратор». Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Вы уверены, что роли включены, и есть такая роль?

Если нет, сделайте следующее: В Visual Studio: Проект -> Конфигурация ASP.NET

Затем выберите Безопасность, включите роли. Создать роль "Администратор".

Тогда попробуй свой подход

0 голосов
/ 06 декабря 2011

Я думаю, вы должны реализовать FormsAuthenticationTicket .Больше информации здесь: http://msdn.microsoft.com/en-us/library/aa289844(v=vs.71).aspx

В Mvc это очень похоже.

У меня есть класс с именем UserSession, который внедряется в LoginController и который я использую в действии LogOn:

    [HttpPost, ValidateAntiForgeryToken]
public ActionResult Index(LoginInput loginInput, string returnUrl)
{
    if (ModelState.IsValid)
    {
        return (ActionResult)_userSession.LogIn(userToLog, loginInput.RememberMe, CheckForLocalUrl(returnUrl), "~/Home");
    }
}

Вот моя реализация UserSession LogIn (обратите внимание, я жестко запрограммировал роль «Администратор» для примера, но вы можете передать ее в качестве аргумента):

public object LogIn(User user, bool isPersistent, string returnUrl, string redirectDefault)
    {
        var authTicket = new FormsAuthenticationTicket(1, user.Username, DateTime.Now, DateTime.Now.AddYears(1), isPersistent, "Admin", FormsAuthentication.FormsCookiePath);
        string hash = FormsAuthentication.Encrypt(authTicket);

        var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);

        if (authTicket.IsPersistent) authCookie.Expires = authTicket.Expiration;

        HttpContext.Current.Response.Cookies.Add(authCookie);

        if (!String.IsNullOrEmpty(returnUrl))
            return new RedirectResult(HttpContext.Current.Server.UrlDecode(returnUrl));

        return new RedirectResult(redirectDefault);
    }

Затем в базовом контроллере япереопределите метод OnAuthorization для получения файла cookie:

if (filterContext.HttpContext.Current.User != null)
{
   if (filterContext.HttpContext.Current.User.Identity.IsAuthenticated)
   {
      if( filterContext.HttpContext.Current.User.Identity is FormsIdentity ) 
      {
         FormsIdentity id = filterContext.HttpContext.Current.User.Identity as FormsIdentity;
         FormsAuthenticationTicket ticket = id.Ticket;
         string roles = ticket.UserData;

         filterContext.HttpContext.Current.User = new GenericPrincipal(id, roles);
      }
   }
}

Надеюсь, это поможет.Дайте мне знать.

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