刷新 ASP.NET 角色提供程序

3

简单的问题...

假设我有一个使用[自定义] RoleProvider的ASP.NET网站,
是否有方法可以在不强制用户注销并重新登录的情况下刷新提供程序?

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

Roles.Refresh()

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

5个回答

4
我假设您在您的web.config文件中有类似以下内容:
<roleManager enabled="true" defaultProvider="..." 
             cacheRolesInCookie="true">

角色缓存在cookie中,所以您可以通过删除cookie来强制刷新它们。这种方法对我很有效。我添加了cookieName属性,这样我就不依赖于asp.net的默认设置。对于您的情况,您可能只需将cookieTimeout属性设置为合理值即可完成操作。
当然,这种方法不会立即更新角色。在您删除cookie后,它们将在下一次页面加载时更新。

3
找到方法了,谢谢。可以通过调用以下代码来完成:Roles.DeleteCookie(); - eidylon
4
为了确保没有误解,Roles.DeleteCookie只是字面上删除cookie,它不能远程使cookie失效,因此在您的管理界面(您主要修改他人角色而非自己的角色)中放置该方法几乎没有用处。请注意保持翻译内容的原义,同时使其更加通俗易懂,切勿添加解释或其他无关信息。 - Matti Virkkunen

3

刷新只需要删除 cookie:

C# 中:Roles.DeleteCookie(); // 功能等同于 Roles.Refresh()


1
如果您不想使用 cookies,可以使用 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对象。在此阶段中尚未初始化会话。 不确定是否有解决方法。 - Jan_V

0

角色被缓存在一个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;
            }
         }

0

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

每个请求都调用“更新我的角色”函数?(不好的方法,但至少可以确保更新)


是的,那就是我想要的(虽然我不会在每个请求上都调用它)。 那么我该如何在我的自定义RoleProvider中实现呢?在RoleProvider接口中似乎没有任何东西可以钩入到ASP.NET缓存角色的[how/where]ever。 - eidylon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接