2010-01-05 104 views
3

简单的问题...刷新ASP.NET角色提供

假设我有一个ASP.NET网站,它使用[自定义] RoleProvider,
有什么办法中,我能以某种方式“刷新”提供商而不强迫用户注销网站并重新登录?

我在寻找的东西,这将是类似于一个虚构的方法

Roles.Refresh() 

具体来说,我在看这个的,如果管理员更改用户的角色,用户会话也许可以刷新自己每隔10分钟什么的。

回答

4

我假设你有你的web.config是这样的:

<roleManager enabled="true" defaultProvider="..." 
      cacheRolesInCookie="true"> 

的角色是cached in a cookie,这样你就可以迫使他们通过deleting the cookie刷新。这种方法适用于我。我添加了cookieName属性,以便我不依赖于asp.net的默认值。不过,对于您的场景,您可能只需将cookieTimeout属性设置为合理的值并完成此操作即可。

当然,此方法不会立即更新角色。删除Cookie后,它们将在下一页加载时更新。

+3

找到了方法,谢谢。这可以通过调用:Roles.DeleteCookie(); – eidylon 2010-03-04 16:49:58

+4

为了确保没有人误解,Roles.DeleteCookie只是从字面上删除了Cookie,它不能远程使Cookie无效,因此将其放入您的管理界面(您大多修改其他人的角色,而非您自己的角色)几乎没用。 – 2012-10-09 14:12:54

0

取决于使用的自定义角色提供程序。

只需在每个请求中调用“更新我的角色”功能? (坏的方式,但至少你一定要更新)

+0

是的,这就是我想要的(虽然我不会在每个请求上调用它)。 如何在我的自定义RoleProvider中执行此操作? RoleProvider接口中没有任何东西可以嵌入ASP.NET缓存角色的[how/where]。 – eidylon 2010-01-05 20:06:01

1

如果您不想使用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 
+1

默认情况下,您不能在GetRolesForUser()方法中使用Session对象。本阶段尚未初始化。 虽然不知道是否有解决方法。 – 2010-09-02 14:25:43

0

的角色在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; 
      } 
     } 
+0

宽松,绞索,驼鹿,鹅? – 2011-11-15 13:59:27

+0

对不起 – yonexbat 2011-11-18 12:23:06

3

刷新只需要删除cookie:

对于C#:Roles.DeleteCookie(); //作为角色工作。刷新()

相关问题