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

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

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

我该怎么办?

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;
    }

}

最佳答案

当您将 ASP.NET Membership 与 Forms 身份验证一起使用时,根本不涉及 session 。

一旦用户成功通过身份验证,只需调用

FormsAuthentication.SetAuthCookie()

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

身份验证 cookie 完全独立于 session cookie。

有关更多信息,请参阅 MSDN 上的 Forms Authentication

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

关于ASP.NET MVC 3 MembershipProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11129807/

10-11 02:19