如何重新加载安全主体用户信息或部分视图

How to reload security principal user info or a partial view

我正在开发一个 aspnet mvc 应用程序,我在重新加载一些数据时遇到问题,我不知道问题是出在每个视图包含的安全主体信息中,还是在我的部分视图中不包含显示其他视图时重新加载。

我有一个在我的整个应用程序中使用的布局页面,在这个布局页面中我有这个局部视图代码片段:

@Html.Partial("_PartialActiveClient")

此局部视图包含下一行:

@if (User.IsInRole("HasClients"))
{
    <p>An Active Client</p>
    <a href="@Url.Action("Activate", "Client")">Change active client</a>

}
else
{
    <p>You don't have any clients<p>
    <a href="@Url.Action("Create", "Client")">Create client</a>
}

因此,当用户第一次创建帐户时,该用户有 0 个客户并且不属于 "HasClients" 角色,并且会显示 "you don't have any clients" 消息,但是当该用户创建他的第一个客户端,用户在我的控制器中默认添加到 "HasClients" 角色。问题是即使我更改视图,"you don't have any clients" 仍然存在。为了显示其他消息,此用户必须注销然后重新登录。

所以我的问题是,我的用户如何在创建客户端后立即看到 "An Active Client" 消息?

角色缓存在 cookie 中,因此您可以通过删除 cookie 强制它们刷新。您需要刷新用户角色。这是一个方法 你可以调用它 Roles.DeleteCookie(); 它会清除角色并在下一个请求中重新加载它。
这是取自这个问题页面 Refresh ASP.NET Role Provider

只是为了澄清我对 Tchaps 提供的答案的评论。这是我的解决方案的代码(不是我的原始代码,但说明了我的观点),就像我在评论中写的那样,它并不优雅,但我可以工作,至少在我的情况下是这样。

// Add to role, save changes
await _userManager.AddToRoleAsync(userInSession.Id, roleHaveClients.Name);
await _userManager.UpdateAsync(userInSession);
// Sign out / Sing in
_registerManager.AuthenticationManager.SignOut();
await __registerManager.SignInAsync(userInSession, false, false);
// Redirect to another action
return RedirectToAction("someAction","someController");