Создание системы авторизации

Создание провайдера ролей

Последнее обновление: 31.10.2015

Первым делом создадим систему авторизации. Итак, у нас в приложении будут определены 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), но для данной задачи нам хватит и поставщика ролей. А перегружать систему избыточными классами не имеет смысла.

Теперь перейдем к самой логике авторизации.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850