只有具有“管理员”角色的用户才能访问控制器:
namespace ASPMVC.Controllers
{
[Authorize(Roles ="admin")]
public class AirplaneController : Controller
{
}
}
但是应用程序再次拒绝访问:
如果您重新启动应用程序,则会出现访问权限。问题:如何让角色发生变化时,用户无需重新启动应用程序就可以访问控制器?
RoleController中改变用户角色的方法:
[HttpPost]
public async Task<IActionResult> Edit(string userId, List<string> 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();
}


您已经编写了自定义控制器 + 角色/编辑操作,用户可以在其中更改角色列表。
您需要在此位置添加您更改权限的用户的注销和登录。如果它是当前用户,那将是多么容易!
我看到的第一个方向是这个。将应用程序切换为使用 SQL Server中的会话并遍历所有会话,反序列化 SessionItemShort并更改您需要的会话。(我真的从来没有尝试过自己反序列化这些数据,所以在这里你仍然需要研究如何去做的问题——好吧,可能性本身并不明显)
这个方向的优点:更改会话数据并不容易,但是在更改角色时进行一次。
我看到的第二个方向是这个。
您在 ApplicationUser 类中创建一个额外的HasRoleChanged字段并创建一个自写的处理程序,它将当前角色列表(它们在会话中)与每个 http 请求记录在数据库中的角色列表进行比较。实现起来要容易得多(可以在这里找到一个示例),但是通过为每个 http 请求获取角色来拉取数据库并不是很人性化。