Asp net identity roles

Asp net identity roles

В предыдущей статье мы применили атрибут Authorize для класса контроллера Account, который ограничивает допуск к методам действий для неавторизованных пользователей. В этой статье я покажу вам, как доработать систему авторизации, чтобы осуществить более полный контроль над тем, какие действия можно выполнять определенным пользователям. По традиции, я составил список из трех вопросов, которые у вас сразу могут возникнуть:

Авторизация — это процесс предоставления доступа к контроллерам и методам действий для определенных пользователей, как правило, находящихся в определенных ролях (например, допуск к админке должны иметь только администраторы).

Зачем нужно использовать?

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

Как использовать в рамках MVC?

Роли используются для реализации авторизации через атрибут Authorize, который применяется к контроллерам и методам действий.

Добавление поддержки ролей

ASP.NET >RoleManager , где T является реализацией интерфейса IRole, описывающего механизм хранения данных, используемых для представления ролей. Entity Framework использует класс IdentityRole, являющийся реализацией интерфейса IRole и содержит следующие свойства:

Свойства, определенные в классе IdentityRole

Название Описание
Id

Уникальный идентификатор роли.

Название роли./p>

Users

Возвращает список объектов IdentityUserRole, представляющих пользователей, которые находятся в данной роли.

Мы не будем использовать напрямую объекты IdentityRole в нашем приложении, вместо этого добавьте файл класса AppRole.cs в папку Models со следующим содержимым:

Класс RoleManager работает с экземплярами IRole с помощью методов и свойств, перечисленных в таблице ниже:

Свойства и методы, определенные в классе RoleManager

Название Описание
CreateAsync(role)

Создает новую роль

DeleteAsync(role)

Удаляет указанную роль

FindByIdAsync(id)

Поиск роли по идентификатору

FindByNameAsync(name)

Поиск роли по названию

RoleExistsAsync(name)

Возвращает true, если существует роль с указанным именем

UpdateAsync(role)

Сохраняет изменения в указанной роли

Roles

Список существующих ролей

Эти базовые методы реализуют тот же базовый шаблон, который использует класс UserManager для управления пользователями. Добавьте файл AppRoleManager.cs в папку Infrastructure со следующим содержимым:

Этот класс определяет статический метод Create(), который позволит OWIN создавать экземпляры класса AppRoleManager для всех запросов, где требуются данные Identity, не раскрывая информации о том, как данные о ролях хранятся в приложении. Чтобы зарегистрировать класс управления ролями в OWIN, необходимо отредактировать файл IdentityConfig.cs, как показано в примере ниже:

Это гарантирует, что экземпляры класса AppRoleManager используют тот же контекст базы данных Entity Framework, что и экземпляры AppUserManager.

Создание и удаление ролей

Мы подготовили базовую инфраструктуру для работы с ролями, давайте теперь создадим средство администрирования для работы с ролями. Сначала давайте определим методы действия и представления для управления ролями. Добавьте контроллер RoleAdmin в проект приложения с кодом, показанным в примере ниже:

Здесь мы применили многие из тех приемов, что использовали в контроллере Admin, в том числе добавили свойства UserManager и RoleManager для более быстрого запроса объектов AppRoleManager и AppUserManager. Также мы добавили аналогичный метод AddErrorsFromResult(), который обрабатывает ошибки в объекте IdentityResult и добавляет их в метаданные модели.

Представления для контроллера RoleAdmin содержат простую HTML-разметку и операторы Razor. Нам необходимо отобразить не только список ролей, но и имена всех пользователей, входящих в каждую роль. Класс >IdentityUserRole, описывающих пользователей роли. Каждый объект IdentityUserRole имеет свойство UserId, которое возвращает уникальный идентификатор пользователя, с помощью которого мы будем получать имя пользователя.

Добавьте файл класса IdentityHelpers.cs в папку Infrastructure со следующим содержимым:

Этот код содержит определение вспомогательного метода HTML, определенного как расширение класса HtmlHelper. Метод GetUserName() принимает строковый аргумент, содержащий идентификатор пользователя, получает экземпляр класса AppUserManager с помощью метода GetOwinContext().GetUserManager() (где метод GetOwinContext является расширяющим HttpContext), использует метод FindByIdAsync(), чтобы найти экземпляр AppUser, связанный с идентификатором и возвращает значение свойства UserName.

Следующий пример показывает содержимое файла Index.cshtml, находящегося в папке /Views/RoleAdmin:

В этом представлении отображается список ролей, определенных в приложении, вместе со списком пользователей в каждой роли. На данный момент мы еще не создали ни одной роли:

Следующий пример содержит представление Create.cshtml в той же папке, которое используется для создания новых ролей:

Единственная информация, которая требуется для создания новой роли — ее название. Поэтому мы добавили один стандартный элемент и кнопку отправки формы POST-методу действия Create.

Чтобы протестировать функционал создания ролей, запустите приложение и перейдите по адресу /RoleAdmin/Index в окне браузера. Чтобы создать новую роль нажмите кнопку «Создать», введите имя в поле ввода в появившейся форме и нажмите вторую кнопку «Создать». Новое представление будет отображать список ролей, сохраненных в базе данных:

Читайте также:  Coreldraw перешел в режим просмотра

Вы можете также удалить роль из приложения нажав кнопку «Удалить».

Редактирование ролей

Для авторизации пользователей недостаточно просто создавать и удалять роли. Мы также должны уметь управлять ролями, назначать и удалять пользователей из роли. Это не сложный процесс, но для его реализации нам необходимо загружать данные о ролях с помощью класса AppRoleManager, а затем вызывать методы, определенные в классе AppUserManager на объектах, связанных с определенной ролью.

Давайте начнем с добавления новых классов модели-представления (view-model) в файл UserViewModels.cs:

Класс RoleEditModel содержит информацию о роли и определяет список пользователей в роли в виде коллекции объектов AppUser. Благодаря этому, мы сможем извлечь ID и имя каждого пользователя в роли. Класс RoleModificationModel будет получать данные от системы привязки модели во время редактирования данных пользователя. Он содержит массив идентификаторов пользователей, а не объектов AppUser, для замены ролей.

Определившись с классами моделей, давайте добавим методы редактирования ролей Edit в контроллер RoleAdmin:

Большая часть кода в GET-версии метода Edit отвечает за формирование списков пользователей входящих и не входящих в роль и реализуется с помощью методов LINQ. После группировки пользователей возвращается представление, которому передается объект RoleEditModel.

POST-версия метода Edit отвечает за добавление и удаление пользователей из ролей. Класс AppUserManager наследует ряд вспомогательных методов для работы с ролями из класса UserManager . Эти методы перечислены в таблице ниже:

Вспомогательные методы класса UserManager для работы с ролями

Название Описание AddToRoleAsync(id, name)

Добавляет пользователя с указанным идентификатором id в роль с указанным именем name

GetRolesAsync(id)

Возвращает список из имен ролей, в которых находится пользователь с идентификатором id

IsInRoleAsync(id, name)

Вернет true, если пользователь с указанным идентификатором id является членом роли с именем name

RemoveFromRoleAsync(id, name)

Удаляет пользователя с указанным id из роли с указанным именем name

Странность этих методов заключается в том, что они работают с идентификатором пользователя и именем роли, хотя каждая роль также имеет свой уникальный идентификатор. Именно поэтому класс RoleModificationModel содержит строковое свойство RoleName.

В примере ниже показан код представления Edit.cshtml, находящегося в папке /Views/RoleAdmin.cshtml:

Представление содержит две таблицы: со списком пользователей входящих и не входящих в текущую роль, открытую для редактирования. Напротив каждого пользователя стоит флажок, который позволяет изменить его членство в данной роли.

Давайте протестируем функциональность редактирования ролей. Добавление класса AppRoleManager в архитектуру OWIN заставит Entity Framework удалить базу данных и воссоздать новую схему. Это означает, что пользователи, которых мы создали ранее исчезнут. Поэтому после запуска приложения перейдите по адресу /Admin/Index и создайте нескольких пользователей.

Чтобы проверить редактирование ролей, перейдите по адресу /RoleAdmin/Index и создайте несколько ролей, затем отредактируйте эти роли, добавив в них нескольких пользователей. На рисунке ниже показан пример приложения (я создал роль Users):

Нажмите на кнопке сохранить и перейдите в представление /RoleAdmin. Вы увидите список созданных ролей и список пользователей в каждой роли, как показано на рисунке ниже:

Использование ролей для авторизации

Теперь, когда у нас есть возможность управления ролями, мы можем использовать их в качестве основы для авторизации через атрибут Authorize. Чтобы проще было тестировать процесс авторизации, давайте добавим метод действия для выхода пользователя из системы в контроллер Account, как показано в примере ниже:

Давайте обновим контроллер Home и добавим новый метод действия, который будет передавать информацию об аутентифицированном пользователе в представление:

В этом примере мы оставили атрибут Authorize для метода действия Index без изменений, но добавили этот атрибут к методу OtherAction, задав при этом свойство Roles, ограничивающее доступ к этому методу только для пользователей, являющихся членами роли Users. Мы также добавили метод GetData(), который добавляет некоторую базовую информацию о пользователе, используя свойства, доступные через объект HttpContext.

В заключение, нам необходимо добавить кнопку выхода из приложения в представление Index.cshtml из папки /Views/Home:

Атрибут Authorize может быть также использован для настройки авторизации на основе списка пользователей. Данную возможность удобно использовать в небольших проектах, но это создаст трудности при расширении приложения, т. к. каждый раз потребуется изменять код в контроллере, когда будет добавляется новый пользователь. Использование ролей для авторизации изолирует приложение от изменений в учетных записях отдельных пользователей и контролирует доступ к приложению через членство ролей.

Для тестирования системы авторизации, запустите приложение и перейдите по адресу /Home/Index. Браузер будет перенаправлен на страницу входа в приложение, где вы должны будете ввести данные существующей учетной записи. Метод действия Index является доступным для любого авторизованного пользователя. Однако если вы перейдете по адресу /Index/OtherAction, доступ будет открыт только тем пользователям, которые являются членами роли Users.

Читайте также:  Hf jnf c dbltj

Если вы попытаетесь войти под пользователем, находящимся в другой роли, то браузер перенаправит вас снова на форму входа в приложение. Перенаправление уже аутентифицированных пользователей на страницу входа является малополезным решением, поэтому давайте отредактируем контроллер Account и добавим возможность перенаправления аутентифированных пользователей, не прошедших авторизацию, на страницу ошибки:

На рисунке ниже наглядно показано поведение нашего приложения, когда пользователю отказано в доступе:

There is very little documentation about using the new Asp.net Identity Security Framework.

I have pieced together what I could to try and create a new Role and add a User to it. I tried the following: Add role in ASP.NET Identity

I have added the code to a Database Initializer that is run whenever the model changes. It fails on the RoleExists function with the following error:

In my previous tutorial I have explained How to do Authentication of Users in >

  • 1. Admin – For doing administration works like assigning work to employees.
  • 2. Managers – For looking after the client needs, and completing projects on time.
  • 3. Network – For keeping the internet of the organization, up and running, in secured manner.
  • 4. Security – For guarding the premises of the organization.

In ASP.NET Core Identity System you can create any number of Roles and assign users to these roles.

For accessing and managing roles you need the help of RoleManager class. T is the class that represents roles in the Identity Database.

To represent roles you will need the help of IdentityRole >

  • 1. >IdentityUserRole objects that represents members of the role.

Creating and Deleting Roles in Identity

I will now create the functionality to Create and Delete Roles in my Identity System. So create a new Controller called ‘RoleController.cs’ and add the following code to it:

In the Role Controller >RoleManager class to the Constructor.

The RoleManager >IdentityRole .

Name Description CreateAsync(role) Creates a new role DeleteAsync(role) Deletes the specified role FindByIdAsync(id) Find a role by its id FindByNameAsync(name) Find a role by its name RoleExistsAsync(name) Used to check if a role with the specified name exists or not UpdateAsync(name) Updates a role Roles This property returns all the roles in the Identity system

The Index Action method of the Role Controller >Identity Roles to the default View like:

Create the Index View inside the ‘Views/Role’ folder. Add the following code to it:

This View takes a model of type IEnumerable . I will loop through all the roles, using the foreach method, and show them in the table.

Notice the ‘i-role’ attribute on the 3rd td element:

This attribute will call a Custom Tag Helper which will modify this td element to display a list of all the Users who are members of each Role.

Create the ‘TagHelper’ folder in the root of the application. To this folder add the Custom Tag Helper and call it ‘RoleUsersTH.cs’. The code of the RoleUserTH class is given below:

This tag helper operates on td elements with an ‘i-role’ attribute, which is used to receive the
>RoleManager and UserManager objects fetches a list of all the users that resides in a given role.
I need to update my view imports file (_ViewImports.cshtml) so that:

1. I can refer to the ‘Microsoft.AspNetCore.Identity’ namespace in the views without using a namespace.
2. I can use my custom tag helper in the Views.

The updated code of the ‘_ViewImports.cshtml’ file is given below:

The new Role is created by the Create Action method whose code is:

It takes the Role name from an Input control in the View and uses the CreateAsync method to create the View.

Add a new View called ‘Create’ inside the ‘Views/Role’ folder with the code as shown below:

The Delete Role feature is provided by the Delete Action method which takes the Role id in its parameter, and uses the DeleteAsync method to delete the role. The Code of this action method is given below:

Run your project and go to the create role URL – ‘/Role/Create’. Once you create a role you will be redirected the Index View, which will show all the Roles in your Identity System.

The create role view is shown below:

Adding and Removing Users from Roles in Identity

Now I will create a functionality to add or remove users from Roles. For implementing this functionality add 2 classes called ‘RoleEdit.cs’ and ‘RoleModification.cs’ in the ‘Models’ folder.

Читайте также:  Bosch tes 50129 rw неисправности

The RoleEdit class code:

The RoleEdit class is used to represent the Role and the details of the Users in the Identity System.

The RoleModification class code represents the changes that will be done to a role.

I will now use these 2 classes to add or remove users from a role. For this I will add ‘Update’ action method to the Role Controller.

The Updated controller code with the Update Action methods is given below:

Notice I have added a dependency of UserManager class on the constructor.

The Get version of the Update Action method is used to generate members and non-members of a selected role. While the Post version of the Update Action method is used for adding or removing users from a role.

I have used the following members of the UserManager class to play with the roles:

Name Description
AddToRoleAsync(AppUser user, string name) Adds a user to a role
RemoveFromRoleAsync(AppUser user, string name) Removes a user from a role
GetRolesAsync(AppUser user) Gives the names of the roles in which the user is a member
IsInRoleAsync(AppUser user, string name) Returns true is the user is a member of a specified role, else returns false

Next, add an ‘Update’ View inside the ‘Views/Role’ folder with the following code:

The view contains 2 tables:

1. For users who are ‘non-members’ of the selected role.
2. For users who are ‘members’ of the selected role.

A checkbox is given against each user’s name, and through this checkbox the users can be added or removed from the selected role.

Make sure you have 3 Users created in Identity. If not, then go to the URL – ‘/Admin/Create’ and create the following users:

See the below image:

To test the Update Role Feature, where you will add or remove users from a role, you should have 3 roles created from the URL – ‘/Role/Create’.

These roles are:

1. Managers
2. Developers
3. Admin

Notice the ‘Users’ column shows ‘No Users’ for each Role, as shown in the image below:

Now click the ‘Update’ button for the Manager’s role. You will be taken to the Update View where you will see your 3 users under the ‘Add To Manager’ heading, see below image:

Next, click ‘tom’ and ‘alice’ checkboxes and click the save button. This will add these 2 users to the ‘Manager’ role, as shown by the given image:

Next, click the ‘Update’ button of the Manager’s role once more. You will now see user ‘pintu’ shown ins >

Check the below image:

Click alice checkbox and then click the save button. This will remove ‘alice’ from ‘Mangers’ role. Check the below image:

Note that a user can be added to multiple Roles, like tom can be added to all the roles of the Identity System.

Roles for Authentication

Roles can be use with the [Authorize] attributes to specify that all Users of the selected Role can only access the Action method.

Add the Roles property of the ‘Authoriz’e attribute to specify that only ‘Manager’ role users can access the Index Action method of the Home Controller:

Run your application and login with user’s ‘tom’ credentials. Everything will work fine since user ‘tom’ belongs to the ‘Manager’ role.

If you had logged in with user’s ‘alice’ credentials then you will not be redirected to the Index Action of the Home Controller. This is due to the fact that ‘alice’ does not belong to the role of ‘Manager.

You will instead be redirected to the access denied URL – ‘Account/AccessDenied’.

Create ‘AccessDenied’ Action in the Account Controller with the following code:

Also adds the AccessDenied.cshtml view inside the ‘Views/Account’ folder:

Now re-run your application and go to the login URL – ‘/Account/Login’. Log in with ‘alice’ credentials:
1. Email – [email protected]
2. Password – [email protected]

After login you will be redirected to the Access Denied URL, as shown in the below image:

Remember: If you change the roles for the user you are currently authenticated as, the changes won’t take effect until you log out and authenticate.

You can download the full codes of this tutorial from the below link:

This completes the tutorial on Roles in Identity and now you are in a position to upgrade your website to include Identity Roles and authentication of users based on these roles.

«>

Ссылка на основную публикацию
Adblock
detector