asp.net使自定义角色提供程序(authorize)在到期时表现得像自定义成员资格提供程序(authenticate)

时间:2011-05-28 00:09:12

标签: asp.net session forms-authentication authorization security

我的表单身份验证工作正常,有3个月的Cookie设置到期时间:

FormsAuthentication.Initialize();
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, this.txtUsername.Text, DateTime.Now
                    , DateTime.Now.AddMonths(3), true, string.Empty);

所以即使IIS重新启动或项目重建发生,用户仍然会自动审核,直到他选择退出我们的3个月过去。

对于自定义角色提供者[授权部分],当用户登录isValid()时,我添加会话变量:

HttpContext.Current.Session.Add("userinfo", userInfo);

但是我们知道会话在web.config更改,项目构建,IIS重启或默认情况下通过20分钟后到期。

所有我想要的是使系统保存Session [“userinfo”]与认证[cookie]相同而不是在没有在cookie中设置userinfo因为即使userId被认为是存储在cookie中的安全漏洞也不安全!

那么如何实现呢?我想将用户ID存储在cookie中但加密然后如果我发现会话已过期但用户仍然经过身份验证我将从数据库重新加载userInfo但这是否足够好或更好的方法可用?如何在上面的代码段中的(string.Empty)中将userInfo存储在authTicked中,以后可以访问它以及如何使用它?

1 个答案:

答案 0 :(得分:0)

好的,听起来没有身体回应!所以我选择将userId存储在身份验证票据的用户数据部分:

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, this.txtUsername.Text, DateTime.Now
                , DateTime.Now.AddMonths(3), true, UserInfo.UserId.ToString());

然后当我需要检查userInfo时,我使用以下属性:

public UserInformation UserInfo
    {
        get
        {
            if (Session["userinfo"] == null)
            {
                FormsIdentity id = (FormsIdentity)User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;
                long userId = Convert.ToInt64(ticket.UserData);
                Session["userinfo"]=new MySqlMembershipProvider().LoadUserInfo(userId);
            }
            return (UserInformation)Session["userinfo"];
        }
    }

就是这样。我想到了配置文件提供程序,但我不喜欢从db [9表结构]获取用户权限的想法,然后将会话表中的记录重新存储在其中[就像在自己身边传播一样]如果用户权限或prefs更新需要更多db命中!!