刷新 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 如何创建自定义角色提供程序

ASP.Net MVC 2 中自定义成员资格提供程序中的角色分组

在 ASP.Net 中使用自定义 RoleProvider 时如何允许多个角色查看页面

ASP.NET 身份检查用户角色不起作用

使用 ASP.NET Core Identity 3 的用户角色权限