使用asp.net c#在Web应用程序中唯一标识机器

时间:2013-11-06 09:03:09

标签: c# asp.net .net

我有一个登录页面,用户可以在第一次登录该页面时使用任何机器。一旦用户第一次登录,我需要限制该用户不登录到另一台机器。因此,用户只需使用一台首次登录时使用的机器。

我试图获取客户端mac地址,但我无法在我的网站中获取客户端mac地址。有没有其他方法可以唯一地识别机器?

3 个答案:

答案 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;
    }

显然这是来自另一个应用程序,你只能接受这个想法并在你自己的应用程序中实现它。你不能只是复制粘贴它。