Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Еще один способов аутентификации пользователей представляет аутентификация форм. Она более гибкая по сравнению с аутентификацией 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 на сервере. После успешной авторизации на сервере приложения мы можем посмотреть в браузере добавленный куки-набор:
Как вы видите, первый куки-набор .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>