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

advertisement
Аутентификация и авторизация
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
Download