我可以显示已登录成员的组。在这种情况下,角色对应于电子邮件组。
@model IEnumerable<IdentityRole>
@{
ViewBag.Title = "Manage Emails";
Layout = "_Layout";
}
<div class="bg-primary panel-body text-center"><h4>Email Groups</h4></div>
<div class="text-danger" asp-validation-summary="ModelOnly"></div>
<table class="table table-condensed table-bordered table-bordered">
<tr><th>Email Group</th><th>Assigned</th><th></th></tr>
@if (Model.Count() == 0)
{
<tr><td colspan="4" class="text-center">No Email Groups Present</td></tr>
}
else
{
foreach (var role in Model)
{
<tr>
<td>@role.Name</td>
@if (User.IsInRole(role.Name))
{
<td>Yes</td>
}
else
{
<td>No</td>
}
<td class="text-center">
<form asp-action="ManageDelete" asp-route-id="@role.Id" method="post">
@if (!User.IsInRole(role.Name))
{
<a class="btn btn-sm btn-success" asp-action="ManageEdit" asp-route-id="@role.Id">Add Me To This Group</a>
}
else
{
<button type="submit" asp-action="ManageDelete" class="btn btn-sm btn-danger"asp-route-id="@role.Id">Delete Me From Group</button>
}
</form>
</td>
</tr>
}
}
</table>
在我的控制器中,我有一种允许用户从组中删除自己的方法:
[Authorize]
[HttpPost]
public async Task<IActionResult> ManageDelete(string id)
{
AppUser user = await userManager.FindByNameAsync(User.Identity.Name);
IdentityRole role = await roleManager.FindByIdAsync(id);
IdentityResult result;
if(user != null)
{
result = await userManager.RemoveFromRoleAsync(user, role.Name);
if (!result.Succeeded)
{
AddErrorsFromResult(result);
}
}
return RedirectToAction("ManageIndex");
}
但是,当从此操作方法刷新上述视图时,它不会显示正确的信息。我已检查并在数据库中更正了角色更新。如果我停止调试并重新启动,则View会显示正确的信息。
如何刷新视图以显示正确的信息?
答案 0 :(得分:1)
角色声明存储在身份验证Cookie中。因此,调用RemoveFromRoleAsync不会从当前cookie中删除声明。
如果您想立即查看更改,仍需要重新生成Cookie。
result = await userManager.RemoveFromRoleAsync(user, role.Name);
await _signInManager.RefreshSignInAsync(user);