在哪里使用Forms身份验证在ASP.NET MVC上存储已记录的用户信息?

Gui*_*ini 22 asp.net-mvc session forms-authentication

我在我的应用程序上使用ASP.NET MVC和Forms Authentication.基本上我 FormsAuthentication.SetAuthCookie用来登录和FormsAuthentication.SignOut注销.

在HttpContext.Current.User.Identity中我存储了用户名,但我需要有关已登录用户的更多信息.我不想将我的整个User obj存储在Session中,因为它可能很大并且信息比我需要的多得多.

您是否认为创建类似于LoggedUserInfo仅使用我需要的属性调用的类然后将其添加到Session中是一个好主意variable?这是一个好方法吗?

或者你有更好的想法?

Luk*_*Led 8

我使用这个解决方案:

ASP.NET 2.0 Forms身份验证 - 保持自定义而简单

总结一下:我创建了自己的IPrincipal实现.它存储在HttpContext.Current.Cache中.如果它以某种方式丢失,我有来自客户端授权cookie的用户名并且可以重建它.此解决方案不依赖于Session,后者很容易丢失.

编辑

如果您想在控制器中使用您的主体并使其可测试,您可以这样做:

    private MyPrincipal _myPrincipal;
    MyPrincipal MyPrincipal
    {
        get
        {
            if (_myPrincipal == null)
                return (MyPrincipal)User;
            return _myPrincipal;
        }
        set
        {
            _myPrincipal = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在测试中,您将设置准备进行测试的对象.否则它将从HttpContext中获取.现在我开始思考,为什么我要用Ninject来做呢?


Rob*_*nik 2

好吧,你必须将这些存储在某个地方。不过有两个主要可能的地方:

服务器

您可以将它们放入 Session 中。我建议您创建一个单独的类,仅保存您实际需要的数据,以避免浪费太多内存。或者,您也可以存储到缓存中,当存在大量并发用户时,最终可能会产生许多数据库调用。

客户端

在这种情况下,如果您可以使用单独的类限制数据量,并使用任何方式对其进行序列化并将其发送到客户端。无论是在 cookie 中还是在 URI 中(如果长度允许并且禁用 cookie)...

这些想法的结果:
如果您通过这种方式获得了很多内存资源,那么这里的主要内容是创建一个单独的类。所以这是你应该做的第一件事。


归档时间:

查看次数:

28340 次

最近记录:

12 年,6 月 前