Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Как при изменении ролей пользователя сразу же перечитывать их

Доступ к контроллеру имеют лишь пользователи с ролью "admin":
namespace ASPMVC.Controllers { [Authorize(Roles ="admin")] public class AirplaneController : Controller { } }
Обращаюсь с аккаунта без роли, приложение не пускает:
После устанавливаю роль "admin":
Но приложение снова отказывает в доступе: Если же перезапустить приложение, то доступ появляется. Вопрос: как сделать так, чтобы при изменении роли пользователь мог обращаться к контроллеру без перезапуска приложения?
Метод изменения ролей пользователя в RoleController:
[HttpPost] public async Task Edit(string userId, List roles) { UserDop userDop = await userManager.FindByIdAsync(userId); if (userDop != null) { var userRoles = await userManager.GetRolesAsync(userDop); var allRoles = roleManager.Roles.ToList(); var addedRoles = roles.Except(userRoles); var removedRoles = userRoles.Except(roles);
await userManager.AddToRolesAsync(userDop, addedRoles); await userManager.RemoveFromRolesAsync(userDop, removedRoles); return RedirectToAction("UserList"); } return NotFound(); }


Ответ

Я пожалуй рискну опубликовать ответом, хотя это скорее указание направления или идея, чем полноценный ответ. Если кто-то имеет опыт и хочет указать на недостатки - пишите в комментариях, а не ставьте молча минусы. Или опубликуйте свою версию ответа, мне тоже любопытно будет глянуть.
Вы написали свой кастомный контроллер+экшн Role/Edit в котором пользователю можно поменять список ролей.
Нужно в этом месте добавить разлогинивание и залогинивание пользователя, которому вы поменяли права. Как легко это было бы, если это был текущий пользователь!
Первое направление я вижу вот какое. Переключаете приложение на использование сессий в SQL сервер и пробегаетесь по всем сессиям, десериализуя SessionItemShort и меняя нужные. (Я правда сам никогда не пробовал сам десериализовать эти данные, так что тут ещё нужно изучить вопрос, как это делать - ну и сама возможность неочевидна)
Плюсы этого направления: данные сессий менять непросто, но это делается единожды в момент смены ролей.
Второе направление я вижу вот какое. Создаёте в классе ApplicationUser дополнительное поле HasRoleChanged и создаёте самописный Handler, который будет при каждом http-запросе сравнивать список текущих ролей (они в сессии) со списком ролей записанных в базе. Реализовать значительно проще (пример можно посмотреть тут), но дёргать базу получая роли на каждый http-запрос не очень гуманно.

Комментариев нет:

Отправить комментарий