220 likes | 504 Views
Аутентификация и авторизация. ASP . NET MVC 4.0 2014. Аутенификация и авторизация.
E N D
Аутентификация и авторизация ASP.NET MVC 4.0 2014
Аутенификация и авторизация Аутентификация – проверка идентичности пользователя некоторому объекту, известному системе. Например, проверяется, что пользователь знает те же самые логин и пароль, что зарегистрированы на сервере под Id=12345. Авторизация – проверка того, что аутентифицированный пользователь имеет определенные права, например, создавать других пользователей. Часто отдельные права соединяются в пакеты и называются ролями. • Windows Authentication • Forms Authentication Forms Authentication – такой способ аутентификации, когда пользователь доказывает свою идентичность при помощи ввода определенных данных через веб-интерфейс.
Forms Authentication <authenticationmode="Forms"> <formsloginUrl="~/Account/Login"timeout="2880" /> </authentication> В web.config:
Как работает FA • Когда пользователь успешно аутентифицирован, ему отсылается мандат – зашифрованный куки с именем .ASPAUTH. • Этот куки в дальнейшем присоединяется к каждому запросу пользователя и доказывает его идентичность. Проверка наличия куки в запросе производится прозрачно для программиста в особом модуле ASP.NET. • В куки зашифровано имя пользователя, срок годности куки и пр., поэтому если пользователь долго не активен, его мандат делается недействительным и требуется повторная аутентификация. • Если новый пользователь запрашивает страницу, доступную лишь аутентифицированному пользователю, он автоматически перенаправляется на страницу loginUrl • После идентификации пользователь автоматически перенаправляется на запрошенную страницу.
Информация о пользователе Информация об аутентифицированном пользователе, записанная в куки, доступна в контроллере через свойство User (тип свойства – IPrincipal). publicinterfaceIPrincipal { IIdentity Identity { get; } boolIsInRole(string role); } publicinterfaceIIdentity { stringAuthenticationType { get; } boolIsAuthenticated { get; } string Name { get; } } Эти интерфейсы являются частью фреймворка безопасности ASP.NET.
Управление доступом Доступ к котроллерам в целом и к отдельным методам-действиям регулируется фильтром [Authorize] • [Authorize] • – метод доступен для всех аутентифицированных пользователей • [Authorize(Roles="Administrator,SuperAdmin")] • – метод доступен для пользователей в указанных ролях • [Authorize(Users="Jon, Phil, Scott, Brad")] • – метод доступен для пользователей с указанными именами
Пользовательский интерфейс FA Он состоит из: формы для аутентификации (показана раньше), формы для саморегистрации в системе, формы для изменения пароля.
Программный интерфейс FA Программный интерфейс является частью инфраструктуры ASP.NET и состоит из нескольких статических классов. Реализация программного интерфейса обеспечивается классами провайдеров. Provider3 Provider1 Provider2 API
Классы из System.Web.Security MembershipProvider RoleProvider SqlMembershipProvider SqlRoleProvider static class Мемbership static class Roles В АSP.NET есть готовые реализации провайдеров на основе MS SQL Server и ActuveDirectory, но можно реализовать и собственный вариант. В своем приложении мы воспользуемся провайдером на основе MS SQL Server. Чтобы этот провайдер исполнил свою роль, ему нужны не только классы кода, но и таблицы в базе данных MS SqlServer.
Класс Membership Класс Membership находится в пространстве System.Web.Security
Регистрация провайдеров в приложении Провайдеры регистрируются в узлах <membership> и <roleManager> файла web.config. <connectionStrings> <addname="ArtMuseumDb"connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|ArtMuseum.mdf;Integrated Security=True;User Instance=True"providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <authenticationmode="Forms"> <formsloginUrl="~/Account/Login"timeout="2880" /> </authentication> <membershipdefaultProvider="DefaultMembershipProvider"> <providers> <addconnectionStringName="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> <roleManagerenabled="true"defaultProvider="DefaultRoleProvider"> <providers> <addconnectionStringName="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> √ √
Управление членством и ролями при помощи WAT Меню Project / ASP.NET Configuration
Классы из WebMatrix.WebData namespace System.Web.Sequrity MembershipProvider RoleProvider SimpleMembershipProvider SimpleRoleProvider static class WebSecurity Фасадным классом для SimpleMembershipProvider и SimpleRoleProviderявляется статический класс WebSecurity.
Регистрация провайдеров Если приложение MVC4 создано по шаблону Internet, провайдеры из WebMatrix зарегистрированы неявно. Их явная регистрация необходима для MVC3. <system.web> <membershipdefaultProvider="SimpleMembershipProvider"> <providers> <clear/> <addname="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> </providers> </membership> <roleManagerenabled="true"defaultProvider="SimpleRoleProvider"> <providers> <clear/> <addname="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> </providers> </roleManager> </system.web>
Поддержка Forms Authentication в шаблоне приложения Модель – файл AccountModels.cs Контроллер – файл AccountController.cs Представление - папка Account Фильтр контроллера – файл Filters/InitializeSimpleMembershipAttribute.cs
Как использовать существующую базу Пусть имеется готовая база данных в виде .mdf файла в папке App_Data. В web.config есть строка соединения с этой базой. Строка называется "MyConStr". • В /InitializeSimpleMembershipAttribute.cs приводим в соответствие с нашей базой вызов метода • WebSecurity.InitializeDatabaseConnection("DefaultConnection", • "UserProfile", "UserId", "UserName", autoCreateTables: true); • 2. Изменяем имя строки соединения с "DefaultConnection" на "MyConStr" • в файле ~Models/AccountModel.cs • в файле ~/Filters/InitializeSimpleMembershipAttribute.cs • Если нужны предустановленные пользователи и роли, создаем их после вызова InitializeDatabaseConnectionкодом вроде этого: 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); }
Протокол ОAuth Позволяет использовать в приложении регистрационные данные социальных сетей: Facebook, Twitter, Microsoft, Google. Для этого создается учетная запись приложения и связывается с учетной записью в соц. сети. Важно, что процедура аутентификации выполняется не в приложении, а в социальной сети, т.е. пользователю не нужно вводить свои данные в вашем приложении.
Реализация OAuth • В файле ~/App_Start/AuthConfig.csраскомментируем то, что относится к конкретным сетям. • Добываем в конкретной сетяи пару – Id, секретный код (для Google этого не требуется). • Если надо, исправляем класс UserProfileв файле AccountModels.cs, чтобы он соответствовал таблице пользователей в базе данных. [Table("Tutors")] publicclassUserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] publicintTutorId { get; set; } publicstringTutorName { get; set; } }
Самостоятельно • Сделать так, чтобы в процессе регистрации пользователя вводился возраст пользователя (целое число от 1 до 150). Возраст должен сохраняться в столбце Age таблицы UserProfile.
Самостоятельно • Создать MVC- проект и добавить два контроллера (Student и Teacher) и по одному представлению Index в каждый. • Сделать так, чтобы страницу Teacher/Index могли видеть только зарегистрированные пользователи в роли "teacher", а страницу Student/Index могли видеть только зарегистрированные пользователи в роли "student". • Сделать так, чтобы пользователь, прошедший аутентификацию, автоматически попадал на страницу Teacher/Index, если он teacher, и на страницу Student/Index, если он student.