使用Session来存储登录的用户id好吗?或者有更简单的方法吗



我们在ASP.Net Webforms中有一个登录表单。当用户登录时,我们将用户id保存到会话状态。

Session["CurrentUserId"] = user.Id;

这就是我们知道用户登录的方式

if(Session["CurrentUserId"] == null) Redirect("Login.aspx");

这就是我们使用Session的全部目的。我将会话存储在DynamoDB中,因为我们有许多负载平衡的服务器。但有时DynamoDB会过载或出现错误。因此,我试图摆脱会话状态,以避免这些错误并简化登录过程。

那么还有什么替代方案呢?现代网站如何让人们登录并记住他们已经登录,并在x分钟后超时?

有没有一种方法可以使用安全的cookie来做到这一点?如果用户在20分钟内不做任何事情,您将如何使其过期?它必须在一组网络服务器上工作。

在会话中存储用户ID并不一定很糟糕,但必须与其他内容相结合,才能保护网站免受会话固定攻击和CSRF(也称为"会话劫持"(等攻击。如果您使用进程内会话状态,那么在web场中也会出现问题。

在ASP.NET web表单中,标准的身份验证方法是使用表单身份验证,它在浏览器上放置一个加密的cookie("身份验证票证"(。您可能还想将用户ID放在会话中的某个位置,并将其与身份验证票证进行比较,以确保它们匹配。

如果您使用标准的FBA登录提供程序?

您可以通过以下方式获取用户登录ID:

Membership.GetUser.ProviderUserKey

你可以通过以下方式获得用户电子邮件:

Membership.GetUser.Email

因此,用户登录id可以用上面的方法获取。

至于session((是一个瓶颈?

好吧,没那么糟糕——你不是";更新";通过这样做,session((值,因此它当然不必每次都被写回(对于一篇文章(,而且这意味着在写回等过程中不应该发生对session((的锁定。

然而,我会考虑上面两种方法中的一种,因为那时session((重新设置或其他任何事情都不需要获取用户ID或电子邮件。

如前所述,这在很大程度上取决于您在这里使用的安全和身份验证提供商。

相关内容

最新更新