Доступ к контроллеру имеют лишь пользователи с ролью "admin":
namespace ASPMVC.Controllers
{
[Authorize(Roles ="admin")]
public class AirplaneController : Controller
{
}
}
Обращаюсь с аккаунта без роли, приложение не пускает:
После устанавливаю роль "admin":
Но приложение снова отказывает в доступе:
Если же перезапустить приложение, то доступ появляется.
Вопрос: как сделать так, чтобы при изменении роли пользователь мог обращаться к контроллеру без перезапуска приложения?
Метод изменения ролей пользователя в RoleController:
[HttpPost]
public async Task
await userManager.AddToRolesAsync(userDop, addedRoles);
await userManager.RemoveFromRolesAsync(userDop, removedRoles);
return RedirectToAction("UserList");
}
return NotFound();
}
Ответ
Я пожалуй рискну опубликовать ответом, хотя это скорее указание
направления или идея, чем полноценный ответ. Если кто-то имеет опыт и
хочет указать на недостатки - пишите в комментариях, а не ставьте
молча минусы. Или опубликуйте свою версию ответа, мне тоже любопытно
будет глянуть.
Вы написали свой кастомный контроллер+экшн Role/Edit в котором пользователю можно поменять список ролей.
Нужно в этом месте добавить разлогинивание и залогинивание пользователя, которому вы поменяли права. Как легко это было бы, если это был текущий пользователь!
Первое направление я вижу вот какое. Переключаете приложение на использование сессий в SQL сервер и пробегаетесь по всем сессиям, десериализуя SessionItemShort и меняя нужные. (Я правда сам никогда не пробовал сам десериализовать эти данные, так что тут ещё нужно изучить вопрос, как это делать - ну и сама возможность неочевидна)
Плюсы этого направления: данные сессий менять непросто, но это делается единожды в момент смены ролей.
Второе направление я вижу вот какое. Создаёте в классе ApplicationUser дополнительное поле HasRoleChanged и создаёте самописный Handler, который будет при каждом http-запросе сравнивать список текущих ролей (они в сессии) со списком ролей записанных в базе. Реализовать значительно проще (пример можно посмотреть тут), но дёргать базу получая роли на каждый http-запрос не очень гуманно.
Комментариев нет:
Отправить комментарий