刷新 ASP.NET 角色提供程序
Posted
技术标签:
【中文标题】刷新 ASP.NET 角色提供程序【英文标题】:Refresh ASP.NET Role Provider 【发布时间】:2011-01-01 18:59:20 【问题描述】:简单的问题...
鉴于我有一个使用 [自定义] RoleProvider 的 ASP.NET 站点, 有什么方法可以让我以某种方式“刷新”提供程序而不强制用户退出站点并重新登录?
我正在寻找类似于虚构方法的东西
Roles.Refresh()
具体来说,我正在考虑如果管理员更改用户的角色,用户会话可能会每 10 分钟刷新一次。
【问题讨论】:
【参考方案1】:我假设你的 web.config
中有类似的内容:
<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
角色是cached in a cookie,所以你可以通过deleting the cookie强制他们刷新。这种方法对我有用。我添加了cookieName
属性,以便我不依赖asp.net 的默认值。不过,对于您的场景,您可能只需将 cookieTimeout
属性设置为合理的值即可。
当然,此方法不会立即更新角色。在您删除 cookie 后,它们将在下一页加载时更新。
【讨论】:
找到方法了,谢谢。这可以通过调用来完成:Roles.DeleteCookie(); 只是为了确保没有人误解,Roles.DeleteCookie 只是从字面上删除 cookie,它不能远程使 cookie 无效,所以把它放在你的管理界面中(你主要修改其他人的角色,而不是你自己的)几乎没用。【参考方案2】:刷新只需要删除cookie:
对于 C#:Roles.DeleteCookie();
// 用作 Roles.Refresh()
【讨论】:
【参考方案3】:如果您不想使用 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
【讨论】:
默认情况下,您不能在 GetRolesForUser() 方法中使用 Session 对象。在此阶段,Session 尚未初始化。不知道是否有解决方法。【参考方案4】:取决于使用的自定义角色提供程序。
只对每个请求调用“更新我的角色”功能? (不好的方式,但至少你肯定会更新它)
【讨论】:
是的,这就是我想要的(尽管我不会在每次请求时都调用它)。那么我将如何在我的自定义 RoleProvider 中实现这一点? RoleProvider 接口中似乎没有任何内容与 [如何/在哪里] ASP.NET 缓存角色有关。【参考方案5】:角色缓存在 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;
【讨论】:
以上是关于刷新 ASP.NET 角色提供程序的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET 在使用 Windows 身份验证和自定义角色提供程序时实现“充当”功能
ASP.Net MVC 2 中自定义成员资格提供程序中的角色分组