ASP.NET MVC 3 MembershipProvider

Mic*_*ade 3 asp.net asp.net-mvc asp.net-membership asp.net-mvc-3

我目前正在使用ASP.NET MVC 3开发一个站点,我正在使用Nhibernate.我创建了一个自定义MembershipProvider,如下所述.

我的问题是时间在ValidateUser方法中的会话中记录用户身份验证并在GetUser中检索它.

从我注意到你不能在ValidateUser中使用Session,但使用Cache是​​不正确的,因为存储不是每个用户会话.

我该怎么办?

class MyMembershipProvider : MembershipProvider
{
    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        var membershipUser = MyMembershipUser)HttpContext.Current.Cache.Get(username);

        // Is not possible
        // var membershipUser = (MyMembershipUser) HttpContext.Current.Session[username];

        return membershipUser;
    }

    public override bool ValidateUser(string username, string password)
    {
        var usuario = UsuarioRepository.GetUsuarioAuthentication(username, password);

        if (usuario != null)
        {
            HttpContext.Current.Cache.Add(username, new MyMembershipUser(usuario.Id, usuario.Email), null,
                                          Cache.NoAbsoluteExpiration, FormsAuthentication.Timeout,
                                          CacheItemPriority.Default, null);

            // Is not possible 
            // HttpContext.Current.Session.Add(username, new MyMembershipUser(usuario.Id, usuario.Email));

            return true;
        }

        return false;
    }
Run Code Online (Sandbox Code Playgroud)

}

sai*_*lle 5

将ASP.NET成员身份与表单身份验证一起使用时,根本不涉及会话.

用户成功通过身份验证后,只需致电即可

FormsAuthentication.SetAuthCookie() 
Run Code Online (Sandbox Code Playgroud)

并自动为您创建一个身份验证cookie.不要在ValidateUser()中调用它,而是从调用ValidateUser()的客户端代码中调用它.

身份验证cookie完全独立于会话cookie.

有关详细信息,请参阅MSDN上的表单身份验证

如果要缓存已验证用户的用户详细信息,则应再次在调用Membership.ValidateUser()的客户端代码中完成此操作,而不是在成员资格提供程序本身中完成.成员资格提供者GetUser()和ValidateUser()应该按照他们的名字建议,并且没有任何其他副作用.