【问题标题】:Refresh ASP.NET Role Provider刷新 ASP.NET 角色提供程序
【发布时间】:2011-01-01 18:59:20
【问题描述】:

简单的问题...

鉴于我有一个使用 [自定义] RoleProvider 的 ASP.NET 站点,
有什么方法可以让我以某种方式“刷新”提供程序而不强制用户退出站点并重新登录?

我正在寻找类似于虚构方法的东西

Roles.Refresh()

具体来说,我正在考虑如果管理员更改用户的角色,用户会话可能会每 10 分钟刷新一次。

【问题讨论】:

    标签: asp.net refresh roleprovider


    【解决方案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;
                  }
               }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        相关资源
        最近更新 更多