22
Аутентификация и авторизация 1 ASP.NET MVC 4.0 2014

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

  • Upload
    sonel

  • View
    106

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

1

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

ASP.NET MVC 4.02014

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

2

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

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

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

• Windows Authentication

• Forms Authentication

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

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

3

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

В web.config:

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

4

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

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

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

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

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

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

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

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.

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

6

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

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

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

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

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

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

7

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

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

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

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

8

Provider3

Provider2

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

Provider1

API

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

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

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

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.

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

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

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

11

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

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

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>

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

13

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

Меню Project / ASP.NET Configuration

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

14

Классы из WebMatrix.WebData

SimpleMembershipProvider

SimpleRoleProvider

static class WebSecurity

MembershipProvider

RoleProvider

namespace System.Web.Sequrity

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

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

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 Возвращает значение, указывающее, существует ли пользователь

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

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

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>

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

17

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

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

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

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

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

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

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 кодом вроде этого:

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

19

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

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

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

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

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

21

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

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

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

22

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

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

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

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