简单的问题...
假设我有一个使用[自定义] RoleProvider的ASP.NET网站,
是否有方法可以在不强制用户注销并重新登录的情况下刷新提供程序?
我正在寻找类似虚构方法的东西
Roles.Refresh()
具体来说,我正在考虑的是,如果管理员更改了用户的角色,则用户会话可能每隔10分钟自动刷新一次。
简单的问题...
假设我有一个使用[自定义] RoleProvider的ASP.NET网站,
是否有方法可以在不强制用户注销并重新登录的情况下刷新提供程序?
我正在寻找类似虚构方法的东西
Roles.Refresh()
具体来说,我正在考虑的是,如果管理员更改了用户的角色,则用户会话可能每隔10分钟自动刷新一次。
web.config
文件中有类似以下内容:<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
cookieName
属性,这样我就不依赖于asp.net的默认设置。对于您的情况,您可能只需将cookieTimeout
属性设置为合理值即可完成操作。刷新只需要删除 cookie:
C# 中:Roles.DeleteCookie();
// 功能等同于 Roles.Refresh()
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;
}
}
取决于使用的自定义角色提供程序。
每个请求都调用“更新我的角色”函数?(不好的方法,但至少可以确保更新)