asp.net-mvc - 使用 FormsAuthenticationTicket 存储额外的用户 session 对象 - cookie 大小太大

标签 asp.net-mvc authentication asp.net-membership iprincipal

我正在尝试设置一个 .NET MVC 3 项目来存储自定义用户 session 对象(稍后可以在其他后续操作中从自定义主体对象访问该对象) 我已按照此处的步骤操作: ASP.NET MVC - Set custom IIdentity or IPrincipal (LukeP 说的 - 我也需要自定义成员(member)资格等)

在我的登录操作中,我有这样的内容:


if (provider.ValidateUser(model.UserName, model.Password))
{
        // setup principal 
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        string userData = serializer.Serialize(provider.GetSession());

        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
             1,
             model.UserName,
             DateTime.Now,
             DateTime.Now.AddMinutes(15),
             false,
            userData);

        string encTicket = FormsAuthentication.Encrypt(authTicket);
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        Response.Cookies.Add(faCookie);

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
}
else
{
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
}

这基本上会获取用户对象(provider.GetSession() 从外部身份验证服务返回自定义用户 session 对象),然后将其存储在 FormsAuthenticationTicket 中

问题是来自外部服务的用户 session 对象超过 4Kb(加密后大约 7Kb),并且由于大小原因,cookie 没有存储在浏览器中。

有没有其他安全的方法来存储这个用户 session 对象,这样我就不必继续查询数据库了? 我听说将其存储在 session 中是不安全的(因为 session 劫持 - 并且它与成员身份分离。) - 那么我还有什么其他选择?

我无法减小自定义用户 session 对象的大小 - 这不是一个选项,因为它的属性依赖于所有系统层调用。

问候, 马丁

最佳答案

我不明白为什么你不能将它存储在用户的 session 对象中,因为你应该在他们每次执行特权操作时验证他们的表单例份验证。

如果您确实不想将其存储在 session 中,您可以创建一个静态字典并将数据存储在那里:

using System.Collections.Concurrent;

// Class level declaration.
static ConcurrentDictionary<string, object> UserData =
        new ConcurrentDictionary<string, object>();

// Inside your magic method.
if (provider.ValidateUser(...)) {
  object providerSession = provider.GetSession();
  string userId = Guid.NewGuid().ToString("n");

  UserData.TryAdd(userId, providerSession);

  FormsAuthenticatonTicket authTicket = new FormsAuthenticatonTicket(
    1,
    model.UserName,
    DateTime.Now,
    DateTime.Now.AddMinutes(15),
    false,
    userid);

  // ...
}

然后,您可以根据表单例份验证票证中存储的 userId 查找提供商 session 数据。我将存储在字典中的对象设置为标准对象,因为我不知道您的提供程序返回什么,因此如果它是更具体的内容,请务必使用该类。

关于asp.net-mvc - 使用 FormsAuthenticationTicket 存储额外的用户 session 对象 - cookie 大小太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14452294/

相关文章:

jquery - 从 Action 进行完整重定向

authentication - glassfish 4 程序化登录

authentication - 如何管理用于本地开发的 Google Cloud 凭据

.net - ASP.NET 自定义 MembershipProvider,更改 CreateUser 语义或添加新方法

asp.net-mvc - 如何在我的 View 模型类中使用名为 'Model' 的属性?

c# - 获取最后附加文本框的值 asp.net mvc

javascript - 在 JavaScript 中处理大型网格数据集

java - 如何在 Java SE 中使用 SSL 设置相互身份验证

c# - 使用 RijndaelManaged 解密 ASP.NET 成员身份的加密密码

asp.net - 当passwordFormat = Encrypted且解密= AES时从Membership迁移到Identity