我有一个登录页面,用户可以在第一次登录该页面时使用任何机器。一旦用户第一次登录,我需要限制该用户不登录到另一台机器。因此,用户只需使用一台首次登录时使用的机器。
我试图获取客户端mac地址,但我无法在我的网站中获取客户端mac地址。有没有其他方法可以唯一地识别机器?
答案 0 :(得分:1)
对于asp.net,无法获取客户端的mac地址。你需要有一些Windows应用程序,它运行在用户的系统上。
带有GUID的永久cookie也可能是一种解决方案。
另一个解决方案可能是在发出请求时查找服务器变量,您将拥有Request.ServerVariables [“REMOTE_ADDR”];如果应用程序是内部/内部网,则可能是内部IP。还有REMOTE_HOST。有时这些会被代理/防火墙/ nat过滤掉,但希望不在您的情况下。
希望它有所帮助!
答案 1 :(得分:1)
如果内网Web应用程序,那么你就可以执行Windows身份验证 - 并保持登录的用户列表,在数据库中,与当登录的用户将时间戳时间后自动注销的时间戳
或者,在表单身份验证中使用cookie来做到这一点。但无论如何,如果他在另一台机器上,您将需要登录用户列表,并自动关闭用户。
更多的是,您可以获取客户端的IP地址并从那里开始,但它不可靠,因为它可能是ISP。它很棘手,但cookie似乎是最简单的方法。
然而,一个好的解决方案就是像IRC那样做,以跟踪登录用户。它向客户端发送PING,并期望客户端以不同的时间间隔返回PONG。如果客户端未收到PONG,则IRC服务器会自动断开用户连接。尝试使用SignalR之类的东西。这样做的缺点是,如果用户关闭浏览器并且PING请求进入,它将会反弹并且客户端将断开连接,因为他/她将无法发回PONG请求。
答案 2 :(得分:0)
我相信您希望用户在任何给定时间仅在一个会话中登录该网站。问题是你无法确定用户何时离开,如果他没有使用注销按钮退出。要解决此问题,你必须暂停。我在应用程序的服务器上使用了一个文本文件,它可以工作。
登录按钮:
protected void btLogin_Click(object sender, EventArgs e)
{
if (check(txtPass.Text) && check(txtUser.Text))
{
var user = new UserManager().login(txtUser.Text, txtPass.Text);
if (user != null)
{
// this is the test you're looking for, the rest is only context
if (!FileManager.alreadyLoggedIn(user.email))
{
FormsAuthentication.SetAuthCookie(user.email, false);
}
else
{
//throw error that it is already connected in some other place
}
}
else
{
//throw error that login details are not OK
}
}
}
在第二类静态方法中:
//you have to call this function at every request a user makes
internal static void saveUserSessionID(string email)//email or any unique string to user
{
var dir = HostingEnvironment.MapPath("~/temp/UserSession/");// a folder you choose
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
string path = dir + email + ".txt";
File.WriteAllText(path, HttpContext.Current.Session.SessionID);
}
// if a request has not been made in tha last 4 minutes, the user left, closed the browser
// the test checks this only on a real server, localhost is not tested to be easy for the developer
internal static bool alreadyLoggedIn(string email)
{
var file = HostingEnvironment.MapPath("~/temp/UserSession/" + email + ".txt");
return File.Exists(file) && File.GetLastWriteTime(file).AddMinutes(4) > DateTime.Now && !HttpContext.Current.Request.IsLocal;
}
显然这是来自另一个应用程序,你只能接受这个想法并在你自己的应用程序中实现它。你不能只是复制粘贴它。