gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:14:34 25 4
gpt4 key购买 nike

我正在尝试设置一个 .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 数据。在您的表单例份验证票中。我将存储在字典中的对象设为标准 object因为我不知道你的提供者返回什么,所以如果它更具体,请务必使用该类。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com