Аутентификация форм

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Еще один способов аутентификации пользователей представляет аутентификация форм. Она более гибкая по сравнению с аутентификацией Windows, хотя, возможно, и чуть более сложная в понимании. Она основывается она выдаче аутентифицированному пользователю куки-наборов, по которым он в дальнейшем верифицируется.

Чтобы установить режим аутентификации на основе форм, в файл конфигурации web.config заносится следующие строки в секцию system.web:

  <system.web>
	..................
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
	............
  </system.web>

Блок authentication определяет параметры аутентификации, в частности, блок forms задает в параметре loginUrl ресурс, на который будет направлен пользователь, который не был аутентифицирован.

Для рассмотрения аутентификации форм возьмем веб-приложение по шаблону Internet Application, который содержит всю базовую инфраструктуру авторизации пользователей.

Это приложение в файле конфигурации по умолчанию содержит подключение к бд. При желании мы можем сами создать свою БД и переопределить подключение. А база данных для этого подключения, создаваемая при первом обращении пользователя в папке App_Data, хранит все данные об учетных записях, зарегистрированных в системе. Из этой же базы будут браться данные для подтверждения аутентификации пользователя.

Вся логика аутентификации заключена в методах Login контроллера AccountController, которые осуществляют вход пользователя в систему. В зависимости от используемой версии Visual Studio. Так, в Visual Studio 2010 метод Login выглядит следующим образом:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }
    return View(model);
}

Тогда как в проекте, созданном в Visual Studio 2012 этот метод будет выглядеть следующим образом:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, 
								persistCookie: model.RememberMe))
    {
        return RedirectToLocal(returnUrl);
    }

    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}

Несмотря на некоторые различия фактически они производят те же действия в виде аутентификации форм. Сама аутентификация разделяется на два действия:

  • Валидация пользователя: в первом случае это делает метод Membership.ValidateUser. И если пользователь находится в нашей базе данных, то далее приложение переходит ко второму этапу.

  • Второй этап представляет создание аутентификационного тикета - то есть некоторого билета безопасности, по которому веб-приложение будет опознавать пользователя. Этот тикет приложение устанавливает для браузера в виде куки-набора по имени .AUTHPATH с помощью метода FormsAuthentication.SetAuthCookie

В этом и по сути и состоит сущность аутентификации форм.

Несмотря на то, что во втором случае - в коде для Visual Studio 2012 не используются явно эти методы, а вместо них применяется только один - WebSecurity.Login, но фактически он скрывает ту же функциональность в своей внутренней реализации:

public static bool Login(string userName, string password, bool persistCookie = false)
{
    VerifyProvider();
    bool success = Membership.ValidateUser(userName, password);
    if (success)
    {
        FormsAuthentication.SetAuthCookie(userName, persistCookie);
    }
    return success;
}

Создание куки-набора

Важно отметить, что при установке куки-наборов их содержимое шифруется при помощи машинных ключей, которую автоматически создает IIS на сервере. После успешной авторизации на сервере приложения мы можем посмотреть в браузере добавленный куки-набор:

Установка куки-наборов в ASP.NET MVC

Как вы видите, первый куки-набор .AUTHPATH, который содержит данные авторизованного пользователя, совершенно нечитаем, что уменьшает вероятность взломов простой подделкой занчений куки.

Второй куки-набор - __RequestVerificationToken - представляет специальный куки-набор, который препятствует взлому в виде CSRF-атак.

Настройка аутентификации

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

  • coockieless: определяет, применяются ли куки-наборы и как они используются. Может принимать следующие значения: UseCookies(определяет, что куки-наборы будут использоваться всегда вне зависимости от устройства), UseUri (куки-наборы никогда не используются), AutoDetect (если устройство поддерживает куки-наборы, то они используются, в противном случае они не применяются, при этом проводится тестирование, определяющее, включена ли поддержка), UseDeviceProfile (используется по умолчанию) (если устройство поддерживает куки-наборы, то они используются, в противном случае они не применяются, в отличие от предыдущего случая тестирование не проводится)

  • defaultUrl: определяет путь, по которому осуществляется переход после авторизации

  • domain: определяет куки-наборы для всего домена. Благодаря этому мы можем использовать одни и те же куки-набры для главного домена и его субдоменов. По умолчанию имеет значение в качестве пустой строки

  • loginUrl: адрес для аутентификации пользователя. Значение по умолчанию - "~/Account/Login"

  • name: задает имя для куки-набора. Значение по умолчанию - ".ASPXAUTH"

  • path: задает путь для куки-наборов. Значение по умолчанию - "/"

  • requireSSL: определяет, требуется ли SSL-соединение для передачи куки-наборов. Значение по умолчанию false

  • timeout: определяет срок действия куков в минутах

Например, мы можем задать следующее определение аутентификации форм:

  <system.web>
	..................
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="600" name="cookies" />
    </authentication>
	............
  </system.web>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850