Первым делом создадим систему авторизации. Итак, у нас в приложении будут определены 4 типа пользователей: администратор, модератор, исполнитель и обычный пользователь.
Администратор будет управлять системой пользователей и добавлять различные данные в справочники оборудования, в общем, будет нести стандартные управленческие функции.
Модератор будет назначать заявкам пользователей исполнителей, которые затем будут решать данную проблему.
Исполнитель будет определенным образом решать возникшую задачу и затем обновлять статус этой задачи. При завершении выполнения исполнитель закрывает задачу.
И обычные пользователи просто формируют заявки по возникшим у них проблемам.
Деление на данные типы довольно условно, можно сделать меньше, можно, наоборот, добавить дополнительных типов.
Каждый тип пользователей будет обладать определенными ограничениями. Так, нам надо сделать, чтобы создавать и удалять пользователей мог только администратор, но никак не модератор, не говоря уже об обычных пользователях.
Также, например, нам надо, чтобы только модератор мог назначать исполнителей по заявкам, а не сами исполнители. Ну и прочие другие моменты, которые мы впоследствии применим в приложении.
Итак, добавим в проект папку Providers, в которую затем мы добавим классы провайдеров пользователей и ролей.
Добавим в нее класс провайдера ролей:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.Helpers; using System.Web.WebPages; using Microsoft.Internal.Web.Utils; using HelpDeskTrain.Models; namespace HelpDeskTrain.Providers { public class HelpdeskRoleProvider : RoleProvider { public override string[] GetRolesForUser(string login) { string[] role = new string[] { }; using (HelpdeskContext _db = new HelpdeskContext()) { try { // Получаем пользователя User user = (from u in _db.Users where u.Login == login select u).FirstOrDefault(); if (user != null) { // получаем роль Role userRole = _db.Roles.Find(user.RoleId); if (userRole != null) { role = new string[] { userRole.Name }; } } } catch { role = new string[] { }; } } return role; } public override bool IsUserInRole(string username, string roleName) { bool outputResult = false; // Находим пользователя using (HelpdeskContext _db = new HelpdeskContext()) { try { // Получаем пользователя User user = (from u in _db.Users where u.Login == username select u).FirstOrDefault(); if (user != null) { // получаем роль Role userRole = _db.Roles.Find(user.RoleId); //сравниваем if (userRole != null && userRole.Name == roleName) { outputResult = true; } } } catch { outputResult = false; } } return outputResult; } public override void AddUsersToRoles(string[] usernames, string[] roleNames) { throw new NotImplementedException(); } public override void CreateRole(string roleName) { throw new NotImplementedException(); } public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) { throw new NotImplementedException(); } public override string[] FindUsersInRole(string roleName, string usernameToMatch) { throw new NotImplementedException(); } public override string[] GetAllRoles() { throw new NotImplementedException(); } public override string[] GetUsersInRole(string roleName) { throw new NotImplementedException(); } public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) { throw new NotImplementedException(); } public override bool RoleExists(string roleName) { throw new NotImplementedException(); } } }
Чтобы реализовать свой провайдер ролей, нам надо наследовать класс от RoleProvider. В данном случае мы переопределяем два метода базового класса: GetRolesForUser, который возвращает все роли пользователя, и IsUserInRole, который показывает, связан ли пользователь с данной ролью.
Теперь подключим наш провайдер ролей к проекту в файле web.config в секции system.web. По умолчанию там уже есть определение провайдера ролей:
<roleManager defaultProvider="DefaultRoleProvider"> <providers> <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </roleManager>
Изменим его на следующее:
<roleManager enabled="true" defaultProvider="HelpdeskRoleProvider"> <providers> <add name="HelpdeskRoleProvider" type="HelpDeskTrain.Providers.HelpdeskRoleProvider" /> </providers> </roleManager>
Возможно, в больших приложениях вам потребуется еще переопределять или использовать встроенные поставщики членства и профилей (например, SimpleMembershipProvider), но для данной задачи нам хватит и поставщика ролей. А перегружать систему избыточными классами не имеет смысла.
Теперь перейдем к самой логике авторизации.