简单的问题...刷新ASP.NET角色提供
假设我有一个ASP.NET网站,它使用[自定义] RoleProvider,
有什么办法中,我能以某种方式“刷新”提供商而不强迫用户注销网站并重新登录?
我在寻找的东西,这将是类似于一个虚构的方法
Roles.Refresh()
具体来说,我在看这个的,如果管理员更改用户的角色,用户会话也许可以刷新自己每隔10分钟什么的。
简单的问题...刷新ASP.NET角色提供
假设我有一个ASP.NET网站,它使用[自定义] RoleProvider,
有什么办法中,我能以某种方式“刷新”提供商而不强迫用户注销网站并重新登录?
我在寻找的东西,这将是类似于一个虚构的方法
Roles.Refresh()
具体来说,我在看这个的,如果管理员更改用户的角色,用户会话也许可以刷新自己每隔10分钟什么的。
我假设你有你的web.config
是这样的:
<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
的角色是cached in a cookie,这样你就可以迫使他们通过deleting the cookie刷新。这种方法适用于我。我添加了cookieName
属性,以便我不依赖于asp.net的默认值。不过,对于您的场景,您可能只需将cookieTimeout
属性设置为合理的值并完成此操作即可。
当然,此方法不会立即更新角色。删除Cookie后,它们将在下一页加载时更新。
取决于使用的自定义角色提供程序。
只需在每个请求中调用“更新我的角色”功能? (坏的方式,但至少你一定要更新)
是的,这就是我想要的(虽然我不会在每个请求上调用它)。 如何在我的自定义RoleProvider中执行此操作? RoleProvider接口中没有任何东西可以嵌入ASP.NET缓存角色的[how/where]。 – eidylon 2010-01-05 20:06:01
如果您不想使用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对象。本阶段尚未初始化。 虽然不知道是否有解决方法。 – 2010-09-02 14:25:43
的角色在cookie中(当然是加密的)缓存。最简单的解决方案是禁用web.config文件中的缓存。你会失去一些表现。
否则,您必须以某种方式重新发送身份验证cookie。一个主要的问题是,许多浏览器不会使用method post重定向接受cookie。
是为我工作的另一种解决方案:
1)在一个ASPX methodod注销用户和用户名存储在会话
//添加用户到角色审阅,并刷新票
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)在loginpage重新登录用户是否用户名被存储在会话
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;
}
}
宽松,绞索,驼鹿,鹅? – 2011-11-15 13:59:27
对不起 – yonexbat 2011-11-18 12:23:06
刷新只需要删除cookie:
对于C#:Roles.DeleteCookie();
//作为角色工作。刷新()
找到了方法,谢谢。这可以通过调用:Roles.DeleteCookie(); – eidylon 2010-03-04 16:49:58
为了确保没有人误解,Roles.DeleteCookie只是从字面上删除了Cookie,它不能远程使Cookie无效,因此将其放入您的管理界面(您大多修改其他人的角色,而非您自己的角色)几乎没用。 – 2012-10-09 14:12:54