在我使用C#.net构建的WebApp中,我想允许用户仅从一台PC连接。 因此,当用户第一次登录时,我将保存电脑的详细信息,当我检测到其他电脑时,他们将无法登录。
我想做的事情:
1)在用户首次登录时保存ip并在每次登录时检查,问题: ip可以更改。
protected string GetIPAddress()
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}
2)将一些密钥保存在本地存储中,然后在每次登录时检查密钥,问题:他们可以清除本地存储或选择不使用它或浏览器不支持本地存储。
localStorage.setItem("key", "123123");
有一个好的,安全的方法吗?
答案 0 :(得分:0)
虽然我同意@nvoight认为这是一个非常奇怪且有问题的计划,但这是一种可以让它起作用的方式:
在服务器端,有一个数据库表(或某种形式的存储)将用户名映射到“令牌”。用户首次登录时,随机生成此类令牌,使用适当的用户名将其存储在数据库中,并使用包含令牌的HTTP响应发送cookie。从那时起,每当用户尝试登录时,请检查cookie是否与数据库中的令牌匹配。
但是,这种方法存在一些明显的问题,比如用户删除cookie时该怎么办(就像你提到的那样从localStorage中删除)。在这种情况下,如果没有联系您删除服务器端的记录,他们将永远无法再从任何计算机登录。同样,同一个用户可能会尝试从同一台计算机上的其他浏览器登录,这将无法正常工作。此外,除非您通过HTTPS提供此站点,否则Cookie将以纯文本形式发送,并且很容易被同一网络上的其他用户劫持。
所以,是的,你可以将一些可能有用的东西拼凑在一起,但尝试完成它可能是一件坏事,而且你很可能只能找到让你在那里工作的解决方案。
答案 1 :(得分:0)
mac地址唯一标识计算机,您应该可以使用它来拒绝/允许连接。
诀窍在于它无法从javascript中读取,因此您需要在浏览器的沙箱外部执行一些代码才能找到它 - 一个Java小程序可以正常工作。
它的kludgey因为它是一个奇怪的要求。如果它只能在一台计算机上运行,为什么这是一个Web应用程序?
答案 2 :(得分:0)
如果您想要按PC付费,那么WebApp是错误的技术。 构建浏览器不是以这种方式工作。 要么改变许可模式,要么改变技术。 如果你想要每台PC付费,那么你需要一个激活的胖客户端。