none
asp.net mvc FormsAuthentication RRS feed

  • Вопрос

  • Добрый день.

    Возникли проблемы с реализацией авторизации. Сначала использовал стандартный контроллер + свою реализацию мембершиппровайдера. Потом не поняв для чего он все таки нужен переписал все под архитектуру остальной части сайта, те модель у меня состоит из EDM (EF) части - на ней основаны репозитории(так же был реализован и репозиторий User). Все репозитории через интерфейсы собраны в один класс доступа к данным. Так вот этот класс доступен всем контроллерам. (Такая архитектура вообще нормальна?)

    1) Проблема заключается в том, что авторизация почему то не зависит от  "RememberMe", хотя и дата и время устанавливаются на 3 дня, но аутентификация начинает их игнорировать по истечение сессии. Что надо подкрутить на сервере, что бы аутентификация не зависела от сессии.

    Веб конфиг:

    		<authentication mode="Forms">
    			<forms loginUrl="~/Account/LogOn" name="authcc" timeout="30" cookieless="UseCookies"/>
    		</authentication>
    

     

     Код логон:

     

    [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
          if (ModelState.IsValid)
          {
            if (db.Users.ValidateUser(model.UserName, model.Password))
            {
              FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, model.UserName,
                DateTime.Now, DateTime.Now.AddMinutes(model.RememberMe ? 4320 : FormsAuthentication.Timeout.TotalMinutes),
                model.RememberMe, "", FormsAuthentication.FormsCookiePath);
              string encryptedTicket = FormsAuthentication.Encrypt(ticket);
              HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
           //   cookie.Expires = ticket.Expiration;
           //   cookie.Path = FormsAuthentication.FormsCookiePath;
              Response.Cookies.Add(cookie); 
              if (!String.IsNullOrEmpty(returnUrl))
              {
                return Redirect(returnUrl);
              }
              else
              {
                return RedirectToAction("Index", "Home");
              }
            }
            else
            {
              ModelState.AddModelError("", "Имя пользователя или пароль указаны неверно.");
            }
          }
          // Появление этого сообщения означает наличие ошибки; повторное отображение формы
          return View(model);
        }
    

     

    2) Весь сайт у меня закрыт на время разработки

     

    <authorization>
    	<deny users="?"/>
    </authorization>
    

    но для того что бы css шаблон сохранялся на странице авторизации в папке "контента" стоит

     

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.web>
        <authorization>
          <allow users="*" />
        </authorization>
      </system.web>
    </configuration>
    

     

    изредка, не понимаю почему, загружается страница авторизации и ресурсы из папки контента не доступны(например css файл, картинки в подпапке)

    2 февраля 2011 г. 18:21

Ответы

Все ответы

  • 1. Установи Expires еще и у HttpCookie. Без него браузер выбросит куку в конце сессии.

    2. deny users="?" значит "перенаправлять всех неавторизованных на страницу логина". На страницу из loginUrl этот deny не распространяется. Т.е. этот способ не "закрывает сайт". Он просто заставляет всех авторизироваться (точнее, аутентифицироваться).

    My blog
    2 февраля 2011 г. 20:30
  • 1) закомментированный код привел специально - не помогает...

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

    2 февраля 2011 г. 20:41
  • 1. Проверь Firebug-ом, или другим инструментом со стороы браузера - какой устанавливается cookie, и уходит ли он в следующий раз.

    2. Лови момент "иногда" и пытайся повторить. Можно попробовать задать allow не в отдельном конфиге, а в web.config приложения, используя location. мало ли, настройки не подтягиваются после старта приложения.


    My blog
    2 февраля 2011 г. 21:11
  • 1) я даже через отладчик тестил что коки приходят с выставленым временем завершения через 3 дня, но они почему то игнорируются 2) по началу так и было все в основном конфиге, потом разнес...
    • Изменено Max Sins 3 февраля 2011 г. 6:15 правка
    3 февраля 2011 г. 6:14
  • 1. В EventLog\Application появляются записи "forms auth cookie is invalid"? Приложение работает под IIS7? В вебконфиге не прописан machineKey? если два из трех - да, то куки слетают после перезапуска app pool, из-за перегенерации ключей. Впиши machineKeys явно в конфиге.

    2. Тогда попытайся точно повторить, и починить. Не повторяется - не баг.

    3. Вот поэтому лучше задавать разные вопросы в разных топиках.


    My blog
    • Помечено в качестве ответа Max Sins 3 февраля 2011 г. 18:42
    3 февраля 2011 г. 7:09
  • Вроде бы помогла установка машин кей, спасибо большое.

    Если кому то понадобится в будущем:

    • Помечено в качестве ответа Max Sins 3 февраля 2011 г. 18:42
    3 февраля 2011 г. 18:42