Створення системи авторизації
Створення провайдера ролей
Насамперед створимо систему авторизації. Отже, у нас в додатку будуть визначені 4 типи користувачів: адміністратор, модератор, виконавець і звичайний користувач.
Адміністратор буде керувати системою користувачів і додавати різні дані в довідники обладнання, загалом, буде нести стандартні управлінські функції.
Модератор призначатиме заявкам користувачів виконавців, які потім будуть вирішувати дану проблему.
Виконавець буде певним чином вирішувати виниклу задачу і потім оновлювати статус цього завдання. При завершенні виконання виконавець закриває задачу.
І звичайні користувачі просто формують заявки по виниклих у них проблемах.
Поділ на дані типи досить умовно, можна зробити менше, можна, навпаки, додати додаткові типи.
Кожен тип користувачів буде володіти певними обмеженнями. Так, нам треба зробити, щоб створювати і видаляти користувачів міг тільки адміністратор, але ніяк не модератор, не кажучи вже про звичайних користувачів.
Також, наприклад, нам треба, щоб тільки модератор міг призначати виконавців за заявками, а не самі виконавці. Ну і інші моменти, які ми згодом застосуємо у додатку.
Отже, додамо в проект папку Providers, в яку потім ми додамо класи провайдерів користувачів і ролей. Додамо в неї клас провайдера ролей:
Щоб реалізувати свій провайдер ролей, нам треба наслідувати клас від 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="AppUsersProblem.Providers.HelpdeskRoleProvider" />
</providers >
</roleManager >
Можливо, у великих додатках вам буде потрібно ще перевизначати або використовувати вбудовані постачальники членства і профілів (наприклад, SimpleMembershipProvider), але для даної задачі нам вистачить і постачальника ролей. А перевантажувати систему надлишковими класами не має сенсу.
Тепер перейдемо до самої логіки авторизації.
Створення контролера AccountController
При вході користувача на сайт його робота буде починатися з авторизації, і перше що користувач побачить - це сторінка авторизації. А за всю логіку авторизації відповідатиме контролер AccountController. Тому додамо в проект в папку Controllers клас AccountController:
Оскільки звертатися до контролера може будь хто, то для нього встановимо атрибут [AllowAnonymous], який відкриває анонімний доступ.
У контролері визначено дію Login, яка авторизує користувача. GET - варіант методу видає сторінку авторизації. А POST- версія обробляє введені дані і, залежно від того, чи був знайдений в базі даних користувач з подібними логіном і паролем, авторизує його, встановлюючи відповідні куки.
На метод RedirectToAction("Index", "Request"); поки можна не звертати уваги. Трохи пізніше ми визначимо контролер RequestContoller, на який в даному випадку буде йти на переадресацію.
Метод Login використовує допоміжний метод ValidateUser, який служить для валідації користувача. У разі, якщо б у нас використовувався провайдер членства, то ми б у ньому визначили цей метод. А в даному випадку ми визначаємо його в контролері.
Також, для спрощення роботи з даними в методі Login використовується модель LogViewModel, яка і буде передавати в контролер введені користувачем дані. Додамо клас цієї моделі в папку Models:
Cкомпілюємо проект за допомогою функції Build, щоб нам стали доступними всі створені моделі. Тепер додамо в проект перше представлення, яке буде призначене для авторизації. Це буде строго типізоване представлення - типізоване воно буде моделлю LogViewModel. Отже, додамо в проект представлення Login:
Для полегшення роботи використовуємо в налаштуваннях шаблон Create, який нам створить шаблонне представлення. А майстер- сторінка layout в даному випадку використовуватися не буде.
Трохи змінимо стандартне представлення наступним чином:
І врешті ми можемо протестувати представлення, запустивши проект. Звернемося до ресурсу в адресному рядку браузера, набравши localhost : номер_порту /Account/Login:
