寻找强大而有效的实施方案,我可以限制用户只从一台计算机登录我的网络应用程序。
如果同一个用户已经登录而另一个人试图从另一台计算机登录,那么我应该可以选择
目前,使用带有自定义成员资格和角色提供程序的表单身份验证进行身份验证。
我们的服务器显示它的年龄,所以我正在寻找使用最少处理能力的东西,并希望做很少的数据库读取(如果需要的话)。我最初的天真实现是在成功登录时存储IP(在db?app状态?),然后根据场景检查每个页面请求或每个其他登录尝试。想听听更好的想法=)
答案 0 :(得分:4)
你可以这样做:
HttpContext.Current.Session.SessionID
)与时间戳一起存储在Application
对象中。Global.asax
中),检查当前会话是否与之前相同,并且是否已经过了不到20分钟。如果会话相同,请让它们正常工作。如果它们不同,只有在20分钟过后才让它们工作。请更新Application
对象。这将允许一个用户一次在一台计算机上。它可能不是100%安全,但它是一种非常可行的方法。
答案 1 :(得分:1)
早些时候,我遇到了类似的情况,并按照以下方式进行了评估
如果组合不同,您可以
您可以使用请求的时间戳来验证会话超时..
答案 2 :(得分:1)
您好 这是我实现它的方式(我已经将这些行添加到我的Page的基类的上传中):
bool authenticated = UserIsAuthenticated();
if (Session["~~~loginprocessed"] == null)
{
if (authenticated)
{
// user just logged in:
if (Application[Page.User.Identity.Name] != null)
Application.Remove(Page.User.Identity.Name);
Application.Add(Page.User.Identity.Name, Session.SessionID);
Session.Add("~~~loginprocessed", true);
}
}
else
{
if (!authenticated)
{
Session.Remove("~~~loginprocessed");
}
}
if (authenticated)
{
if ((Application[Page.User.Identity.Name] == null) || (Application[Page.User.Identity.Name].ToString() != Session.SessionID))
{
System.Web.Security.FormsAuthentication.SignOut();
// show some message to user which will tell he has signed out because of login from somewhere else!
}
}
答案 3 :(得分:0)
如果我正确理解您的问题,您希望确保每个用户只能在给定时间登录一次。据我所知,ASP.NET成员资格提供程序仅存储上次活动日期和上次登录日期。您可以保留已登录的用户ID列表,并在新用户尝试以该列表中已有的用户身份登录时显示您的消息。一个复杂的问题是,当你注销时,你需要从这个'LoggedOn'列表中删除用户。您也许可以在Global.asax
中使用session_end