简单的问题...
鉴于我有一个使用 [自定义] RoleProvider 的 ASP.NET 站点,
有没有什么方法可以在不强制用户退出站点并重新登录的情况下以某种方式“刷新”提供程序?
我正在寻找类似于虚构方法的东西
Roles.Refresh()
具体来说,我正在查看如果管理员更改用户的角色,用户会话可能每 10 分钟刷新一次。
简单的问题...
鉴于我有一个使用 [自定义] RoleProvider 的 ASP.NET 站点,
有没有什么方法可以在不强制用户退出站点并重新登录的情况下以某种方式“刷新”提供程序?
我正在寻找类似于虚构方法的东西
Roles.Refresh()
具体来说,我正在查看如果管理员更改用户的角色,用户会话可能每 10 分钟刷新一次。
我假设您的web.config
:
<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
角色缓存在 cookie中,因此您可以通过删除 cookie来强制它们刷新。这种方法对我有用。我添加了该cookieName
属性,以便我不依赖 asp.net 的默认值。但是,对于您的场景,您可以将cookieTimeout
属性设置为合理的值并完成它。
当然,此方法不会立即更新角色。在您删除 cookie 后,它们将在下一页加载时更新。
刷新只需要删除cookie即可:
对于 C#:Roles.DeleteCookie();
// 用作 Roles.Refresh()
如果您不想使用 cookie,您可以使用 Session 对象来缓存角色。像这样:
public override string[] GetRolesForUser(string username)
{
System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session;
if (Session["roles"] == null)
Session["roles"] = MyDataProvider.Security.GetRolesForUser(username);
return (string[])Session["roles"];
}
当您需要更新此用户的角色时,您可以执行
Session["roles"] = null
取决于使用的自定义角色提供程序。
只需在每个请求上调用“更新我的角色”功能吗?(不好的方式,但至少你肯定会更新它)
角色缓存在 cookie 中(当然是加密的)。最简单的解决方案是禁用 web.config 文件中的缓存。你会失去一些性能。
否则,您必须以某种方式重新发送身份验证 cookie。一个主要问题是许多浏览器不接受使用 post 方法进行重定向的 cookie。
另一个对我有用的解决方案:
1)在aspx方法中,将用户注销并将用户名存储在会话中
//将用户添加到角色审阅者并刷新票证
Roles.AddUserToRole(User.Identity.Name, Constants.ROLE_REVISOR);
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(User.Identity.Name, false); //Might work in some browsers
Session["REFRESHROLES"] = User.Identity.Name;
Response.Redirect("someprotectedurl?someid=" + someid);
2)如果用户名存储在会话中,则在登录页面中再次登录用户
protected void Page_Load(object sender, EventArgs e)
{
string returnUrl = Request.QueryString["ReturnUrl"];
if(String.IsNullOrEmpty(returnUrl) == false)
{
if(Session["REFRESHROLES"] != null)
{
if(!string.IsNullOrEmpty(Session["REFRESHROLES"].ToString()))
{
FormsAuthentication.SetAuthCookie(Session["REFRESHROLES"].ToString(), false);
Session.Remove("REFRESHROLES");
Response.Redirect(returnUrl);
return;
}
}