刷新ASP.NET角色提供程序

时间:2010-01-05 19:46:36

标签: asp.net refresh roleprovider

简单的问题......

鉴于我有一个ASP.NET站点,它使用[custom] RoleProvider,
有什么方法可以让我以某种方式“刷新”提供者而不强迫用户退出网站并重新登录?

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

Roles.Refresh()

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

5 个答案:

答案 0 :(得分:4)

我认为你的web.config

中有类似的内容
<roleManager enabled="true" defaultProvider="..." 
             cacheRolesInCookie="true">

角色为cached in a cookie,因此您可以强制它们按deleting the cookie刷新。这种方法对我有用。我添加了cookieName属性,以便我不依赖于asp.net的默认值。但是,对于您的方案,您可以将cookieTimeout属性设置为合理的并完成。

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

答案 1 :(得分:3)

刷新只需要删除cookie:

对于C#:Roles.DeleteCookie(); //作为Roles.Refresh()

工作

答案 2 :(得分: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

答案 3 :(得分:0)

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

只需在每次请求时调用“更新我的角色”功能吗? (糟糕的方式,但至少你肯定会更新它)

答案 4 :(得分:0)

角色缓存在cookie中(当然是加密的)。最简单的解决方案是禁用web.config文件中的缓存。你会失去一些表现。

否则你必须以某种方式重新发送auth cookie。一个主要问题是许多浏览器不会在方法发布的重定向上接受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;
            }
         }