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

Preview:

DESCRIPTION

Аутентификация и авторизация. ASP . NET MVC 4.0 2014. Аутенификация и авторизация. - PowerPoint PPT Presentation

Citation preview

1

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

ASP.NET MVC 4.02014

2

Аутенификация и авторизацияАутентификация – проверка идентичности пользователя некоторому

объекту, известному системе. Например, проверяется, что пользователь знает те же самые логин и пароль, что зарегистрированы на сервере под Id=12345.

Авторизация – проверка того, что аутентифицированный пользователь имеет определенные права, например, создавать других пользователей. Часто отдельные права соединяются в пакеты и называются ролями.

• Windows Authentication

• Forms Authentication

Forms Authentication – такой способ аутентификации, когда пользователь доказывает свою идентичность при помощи ввода определенных данных через веб-интерфейс.

3

Forms Authentication <authentication mode="Forms"> <forms loginUrl="~/Account/Login" timeout="2880" /> </authentication>

В web.config:

4

Как работает FA• Когда пользователь успешно аутентифицирован, ему отсылается мандат –

зашифрованный куки с именем .ASPAUTH. • Этот куки в дальнейшем присоединяется к каждому запросу пользователя и

доказывает его идентичность. Проверка наличия куки в запросе производится прозрачно для программиста в особом модуле ASP.NET.

• В куки зашифровано имя пользователя, срок годности куки и пр., поэтому если пользователь долго не активен, его мандат делается недействительным и требуется повторная аутентификация.

• Если новый пользователь запрашивает страницу, доступную лишь аутентифицированному пользователю, он автоматически перенаправляется на страницу loginUrl

• После идентификации пользователь автоматически перенаправляется на запрошенную страницу.

5

Информация о пользователе

Информация об аутентифицированном пользователе, записанная в куки, доступна в контроллере через свойство 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.

6

Управление доступом Доступ к котроллерам в целом и к отдельным методам-действиям

регулируется фильтром [Authorize]

[Authorize] – метод доступен для всех аутентифицированных пользователей

[Authorize(Roles="Administrator, SuperAdmin")] – метод доступен для пользователей в указанных ролях

[Authorize(Users="Jon, Phil, Scott, Brad")] – метод доступен для пользователей с указанными именами

7

Пользовательский интерфейс FAОн состоит из: 1) формы для аутентификации

(показана раньше), 2) формы для саморегистрации в

системе, 3) формы для изменения пароля.

8

Provider3

Provider2

Программный интерфейс FA

Provider1

API

Программный интерфейс является частью инфраструктуры ASP.NET и состоит из нескольких статических классов.

Реализация программного интерфейса обеспечивается классами провайдеров.

9

Классы из System.Web.Security

SqlMembershipProvider SqlRoleProvider

static class Мемbership

static class Roles

MembershipProvider RoleProvider

В АSP.NET есть готовые реализации провайдеров на основе MS SQL Server и Actuve Directory, но можно реализовать и собственный вариант.

В своем приложении мы воспользуемся провайдером на основе MS SQL Server. Чтобы этот провайдер исполнил свою роль, ему нужны не только классы кода, но и таблицы в базе данных MS Sql Server.

10

Класс MembershipCreateUser(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)GeneratePasswordGetAllUsers()GetAllUsers(Int32, Int32, Int32)GetNumberOfUsersOnlineGetUser()GetUser(Boolean)GetUser(Object)GetUser(String)GetUser(Object, Boolean)GetUser(String, Boolean)GetUserNameByEmailUpdateUserValidateUser

Класс Membership находится в пространстве System.Web.Security

11

Класс RolesМетодAddUsersToRoleAddUsersToRolesAddUserToRoleAddUserToRolesCreateRoleDeleteCookieDeleteRole(String)DeleteRole(String, Boolean)FindUsersInRoleGetAllRolesGetRolesForUser()GetRolesForUser(String)GetUsersInRoleIsUserInRole(String)IsUserInRole(String, String)RemoveUserFromRoleRemoveUserFromRolesRemoveUsersFromRoleRemoveUsersFromRolesRoleExists

12

Регистрация провайдеров в приложенииПровайдеры регистрируются в узлах <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>

13

Управление членством и ролями при помощи WAT

Меню Project / ASP.NET Configuration

14

Классы из WebMatrix.WebData

SimpleMembershipProvider

SimpleRoleProvider

static class WebSecurity

MembershipProvider

RoleProvider

namespace System.Web.Sequrity

Фасадным классом для SimpleMembershipProvider и SimpleRoleProvider является статический класс WebSecurity.

15

Класс WebSecurityИмя ОписаниеChangePassword Изменяет пароль для указанного пользователя.ConfirmAccount(String) Подтверждает допустимость учетной записи и активирует ее.ConfirmAccount(String, String) Подтверждает допустимость учетной записи указанного

пользователя и активирует ее.CreateAccount Создает новую учетную запись членства с использованием

указанного имени пользователя и пароль, при необходимости позволяет указать, что пользователь должен явно подтвердить учетную запись.

CreateUserAndAccount Создает новую запись профиля пользователя и новую учетную запись.

GeneratePasswordResetToken Создает маркер сброса пароля для отправки пользователю по электронной почте.

GetCreateDate Возвращает дату и время создания указанной учетной записи.GetLastPasswordFailureDate Возвращает дату и время последнего ввода неправильного

пароля для указанной учетной записи.GetPasswordChangedDate Возвращает дату и время последнего изменения пароля для

указанной учетной записи.GetPasswordFailuresSinceLastSuccess

Возвращает число неправильных попыток ввода пароля указанной учетной записи с момента последнего успешного входа или создания учетной записи.

GetUserId Возвращает идентификатор пользователя на основе указанного имени пользователя.

GetUserIdFromPasswordResetToken Возвращает значение ИД пользователя из маркера сброса пароля.

InitializeDatabaseConnection(String, String, String, String, Boolean)

Инициализирует систему членства путем подключения к базе данных с пользовательскими данными и при необходимости создает таблицы членства, если они не существуют.

InitializeDatabaseConnection(String, String, String, String, String, Boolean)

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

IsAccountLockedOut(String, Int32, Int32)

Возвращает значение, указывающее, заблокирована ли заданная учетная запись из-за слишком большого количества неудачных попыток ввода пароля за определенное число секунд.

IsAccountLockedOut(String, Int32, TimeSpan)

Возвращает значение, указывающее, заблокирована ли заданная учетная запись из-за слишком большого количества неудачных попыток ввода пароля за указанное время.

IsConfirmed Возвращает значение, которое указывает, подтвердил ли пользователь учетную запись.

IsCurrentUser Возвращает значение, указывающее, соответствует ли имя пользователя, вошедшего в систему, указанному имени пользователя.

Login Реализует вход пользователя в систему.Logout Выход пользователя из системы.RequireAuthenticatedUser Если пользователь не прошел проверку подлинности, задает

состояние HTTP 401 (Не санкционировано).RequireRoles Если текущий пользователь входит не во все указанные роли,

задается код состояния HTTP 401 (Не санкционировано).RequireUser(Int32) Если указанный пользователь не вошел в систему, задает

состояние HTTP 401 (Не санкционировано).RequireUser(String) Если текущий пользователь не совпадает с указанным, задает

состояние HTTP 401 (Не санкционировано).ResetPassword Сброс пароля с помощью маркера сброса пароля.UserExists Возвращает значение, указывающее, существует ли пользователь

в базе данных членства.

16

Регистрация провайдеровЕсли приложение 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>

17

Поддержка Forms Authentication в шаблоне приложения

Модель – файл AccountModels.cs

Контроллер – файл AccountController.cs

Представление - папка Account

Фильтр контроллера – файл Filters/InitializeSimpleMembershipAttribute.cs

18

Как использовать существующую базуПусть имеется готовая база данных в виде .mdf файла в папке App_Data. В web.config есть строка соединения с этой базой. Строка называется "MyConStr".

1. В /InitializeSimpleMembershipAttribute.cs приводим в соответствие с нашей базой вызов метода

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables:

true);

2. Изменяем имя строки соединения с "DefaultConnection" на "MyConStr" a) в файле ~Models/AccountModel.csb) в файле ~/Filters/InitializeSimpleMembershipAttribute.cs

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); }

Если нужны предустановленные пользователи и роли, создаем их после вызова InitializeDatabaseConnection кодом вроде этого:

19

Протокол ОAuthПозволяет использовать в приложении регистрационные данные социальных сетей: Facebook, Twitter, Microsoft, Google. Для этого создается учетная запись приложения и связывается с учетной записью в соц. сети.

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

20

Реализация 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; }}

21

Самостоятельно1. Сделать так, чтобы в процессе регистрации пользователя вводился

возраст пользователя (целое число от 1 до 150). Возраст должен сохраняться в столбце Age таблицы UserProfile.

22

Самостоятельно

1. Создать MVC- проект и добавить два контроллера (Student и Teacher) и по одному представлению Index в каждый.

2. Сделать так, чтобы страницу Teacher/Index могли видеть только зарегистрированные пользователи в роли "teacher", а страницу Student/Index могли видеть только зарегистрированные пользователи в роли "student".

3. Сделать так, чтобы пользователь, прошедший аутентификацию, автоматически попадал на страницу Teacher/Index, если он teacher, и на страницу Student/Index, если он student.

Recommended