Аутентификация и авторизация ASP.NET MVC 4.0 2014 1 Аутенификация и авторизация Аутентификация – проверка идентичности пользователя некоторому объекту, известному системе. Например, проверяется, что пользователь знает те же самые логин и пароль, что зарегистрированы на сервере под Id=12345. Авторизация – проверка того, что аутентифицированный пользователь имеет определенные права, например, создавать других пользователей. Часто отдельные права соединяются в пакеты и называются ролями. • Windows Authentication • Forms Authentication Forms Authentication – такой способ аутентификации, когда пользователь доказывает свою идентичность при помощи ввода определенных данных через веб-интерфейс. 2 Forms Authentication В web.config: <authentication mode="Forms"> <forms loginUrl="~/Account/Login" timeout="2880" /> </authentication> 3 Как работает FA • Когда пользователь успешно аутентифицирован, ему отсылается мандат – зашифрованный куки с именем .ASPAUTH. • Этот куки в дальнейшем присоединяется к каждому запросу пользователя и доказывает его идентичность. Проверка наличия куки в запросе производится прозрачно для программиста в особом модуле ASP.NET. • В куки зашифровано имя пользователя, срок годности куки и пр., поэтому если пользователь долго не активен, его мандат делается недействительным и требуется повторная аутентификация. • Если новый пользователь запрашивает страницу, доступную лишь аутентифицированному пользователю, он автоматически перенаправляется на страницу loginUrl • После идентификации пользователь автоматически перенаправляется на запрошенную страницу. 4 Информация о пользователе Информация об аутентифицированном пользователе, записанная в куки, доступна в контроллере через свойство User (тип свойства – IPrincipal). public interface IPrincipal { IIdentity Identity { get; } bool IsInRole(string role); } public interface IIdentity { string AuthenticationType { get; } bool IsAuthenticated { get; } string Name { get; } } Эти интерфейсы являются частью фреймворка безопасности ASP.NET. 5 Управление доступом Доступ к котроллерам в целом и к отдельным методам-действиям регулируется фильтром [Authorize] [Authorize] – метод доступен для всех аутентифицированных пользователей [Authorize(Roles="Administrator, SuperAdmin")] – метод доступен для пользователей в указанных ролях [Authorize(Users="Jon, Phil, Scott, Brad")] – метод доступен для пользователей с указанными именами 6 Пользовательский интерфейс FA Он состоит из: 1) формы для аутентификации (показана раньше), 2) формы для саморегистрации в системе, 3) формы для изменения пароля. 7 Программный интерфейс FA Программный интерфейс является частью инфраструктуры ASP.NET и состоит из нескольких статических классов. Реализация программного интерфейса обеспечивается классами провайдеров. Provider3 API 8 Классы из System.Web.Security MembershipProvider RoleProvider SqlMembershipProvider SqlRoleProvider static class Мемbership static class Roles В АSP.NET есть готовые реализации провайдеров на основе MS SQL Server и Actuve Directory, но можно реализовать и собственный вариант. В своем приложении мы воспользуемся провайдером на основе MS SQL Server. Чтобы этот провайдер исполнил свою роль, ему нужны не только классы кода, но и таблицы в базе данных MS 9 Sql Server. Класс Membership CreateUser(String, String) CreateUser(String, String, String) CreateUser(String, String, String, String, String, Boolean, MembershipCreateStatus) CreateUser(String, String, String, String, String, Boolean, Object, MembershipCreateStatus) DeleteUser(String) DeleteUser(String, Boolean) FindUsersByEmail(String) FindUsersByEmail(String, Int32, Int32, Int32) FindUsersByName(String) FindUsersByName(String, Int32, Int32, Int32) GeneratePassword GetAllUsers() GetAllUsers(Int32, Int32, Int32) GetNumberOfUsersOnline GetUser() GetUser(Boolean) GetUser(Object) GetUser(String) GetUser(Object, Boolean) GetUser(String, Boolean) GetUserNameByEmail UpdateUser ValidateUser Класс Membership находится в пространстве System.Web.Security 10 Класс Roles Метод AddUsersToRole AddUsersToRoles AddUserToRole AddUserToRoles CreateRole DeleteCookie DeleteRole(String) DeleteRole(String, Boolean) FindUsersInRole GetAllRoles GetRolesForUser() GetRolesForUser(String) GetUsersInRole IsUserInRole(String) IsUserInRole(String, String) RemoveUserFromRole RemoveUserFromRoles RemoveUsersFromRole RemoveUsersFromRoles RoleExists 11 Регистрация провайдеров в приложении Провайдеры регистрируются в узлах <membership> и <roleManager> файла web.config. <connectionStrings> <add name="ArtMuseumDb" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|ArtMuseum.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <authentication mode="Forms"> <forms loginUrl="~/Account/Login" timeout="2880" /> </authentication> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add connectionStringName="ArtMuseumDb" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </providers> </membership> <roleManager enabled="true" defaultProvider="DefaultRoleProvider"> <providers> <add connectionStringName="DefaultConnection" applicationName="/" name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </providers> </roleManager> … </system.web> 12 Управление членством и ролями при помощи WAT Меню Project / ASP.NET Configuration 13 Классы из WebMatrix.WebData namespace System.Web.Sequrity MembershipProvider SimpleMembershipPro vider RoleProvider SimpleRoleProvider static class WebSecurity Фасадным классом для SimpleMembershipProvider и SimpleRoleProvider является статический класс WebSecurity. 14 Класс WebSecurity Имя ChangePassword ConfirmAccount(String) ConfirmAccount(String, String) Описание Изменяет пароль для указанного пользователя. Подтверждает допустимость учетной записи и активирует ее. Подтверждает допустимость учетной записи указанного пользователя и активирует ее. CreateAccount Создает новую учетную запись членства с использованием указанного имени пользователя и пароль, при необходимости позволяет указать, что пользователь должен явно подтвердить учетную запись. CreateUserAndAccount Создает новую запись профиля пользователя и новую учетную запись. GeneratePasswordResetToken Создает маркер сброса пароля для отправки пользователю по электронной почте. GetCreateDate Возвращает дату и время создания указанной учетной записи. GetLastPasswordFailureDate Возвращает дату и время последнего ввода неправильного пароля для указанной учетной записи. GetPasswordChangedDate Возвращает дату и время последнего изменения пароля для указанной учетной записи. GetPasswordFailuresSinceLastSucce Возвращает число неправильных попыток ввода пароля ss указанной учетной записи с момента последнего успешного входа или создания учетной записи. GetUserId Возвращает идентификатор пользователя на основе указанного имени пользователя. GetUserIdFromPasswordResetToken Возвращает значение ИД пользователя из маркера сброса 15 Регистрация провайдеров Если приложение MVC4 создано по шаблону Internet, провайдеры из WebMatrix зарегистрированы неявно. Их явная регистрация необходима для MVC3. <system.web> <membership defaultProvider="SimpleMembershipProvider"> <providers> <clear/> <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> </providers> </membership> <roleManager enabled="true" defaultProvider="SimpleRoleProvider"> <providers> <clear/> <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> </providers> </roleManager> </system.web> 16 Поддержка Forms Authentication в шаблоне приложения Модель – файл AccountModels.cs Контроллер – файл AccountController.cs Представление - папка Account Фильтр контроллера – файл Filters/InitializeSimpleMembershipAttribute.cs 17 Как использовать существующую базу Пусть имеется готовая база данных в виде .mdf файла в папке App_Data. В web.config есть строка соединения с этой базой. Строка называется "MyConStr". 1. В /InitializeSimpleMembershipAttribute.cs приводим в соответствие с нашей базой вызов метода WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 2. Изменяем имя строки соединения с "DefaultConnection" на "MyConStr" a) в файле ~Models/AccountModel.cs b) в файле ~/Filters/InitializeSimpleMembershipAttribute.cs Если нужны предустановленные пользователи и роли, создаем их после вызова InitializeDatabaseConne ction кодом вроде этого: string ROLE = "teacher", USER = "teacher1", PASS = "@teacher1"; if (!System.Web.Security.Roles.RoleExists(ROLE)) { System.Web.Security.Roles.CreateRole(ROLE); } if (!WebMatrix.WebData.WebSecurity.UserExists(USER)) { WebMatrix.WebData.WebSecurity.CreateUserAndAccount(USER, PASS); System.Web.Security.Roles.AddUserToRole(USER, ROLE); } 18 Протокол ОAuth Позволяет использовать в приложении регистрационные данные социальных сетей: Facebook, Twitter, Microsoft, Google. Для этого создается учетная запись приложения и связывается с учетной записью в соц. сети. Важно, что процедура аутентификации выполняется не в приложении, а в социальной сети, т.е. пользователю не нужно вводить свои данные в вашем приложении. 19 Реализация OAuth 1. В файле ~/App_Start/AuthConfig.cs раскомментируем то, что относится к конкретным сетям. 2. Добываем в конкретной сетяи пару – Id, секретный код (для Google этого не требуется). 3. Если надо, исправляем класс UserProfile в файле AccountModels.cs , чтобы он соответствовал таблице пользователей в базе данных. [Table("Tutors")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int TutorId { get; set; } public string TutorName { get; set; } } 20 Самостоятельно 1. Сделать так, чтобы в процессе регистрации пользователя вводился возраст пользователя (целое число от 1 до 150). Возраст должен сохраняться в столбце Age таблицы UserProfile. 21 Самостоятельно 1. Создать MVC- проект и добавить два контроллера (Student и Teacher) и по одному представлению Index в каждый. 2. Сделать так, чтобы страницу Teacher/Index могли видеть только зарегистрированные пользователи в роли "teacher", а страницу Student/Index могли видеть только зарегистрированные пользователи в роли "student". 3. Сделать так, чтобы пользователь, прошедший аутентификацию, автоматически попадал на страницу Teacher/Index, если он teacher, и на страницу Student/Index, если он student. 22