0

当两个用户都使用同一台机器时,我必须限制新用户同时从该系统登录到我的 Web 应用程序。(即如果一个用户登录,那么如果另一个用户从同一台机器上尝试,我应该限制第二个用户在同一台​​机器上登录)

我想到了mac id验证,但它无法进入c#(不能使用active-x javascript来获取id)。这可以使用cookies来跟踪吗?

任何人都可以为此提出一些解决方案。

4

4 回答 4

0

使用windows身份验证并维护用户会话并在登录时检查相同!

或者

带有 cookie 的表单身份验证(无论它们是否持久)是基于浏览器会话的(持久 cookie 当然可以跨同一浏览器的多个会话(在同一台机器上的同一用户帐户上)工作。所以两个浏览器会话(或两个不同的浏览器或两台机器上的浏览器等)就表单身份验证而言将被视为不同的范围。

因此用户可以从不同的浏览器会话进行多次登录,并且其中一个注销不会影响另一个。是否允许同一用户的多个并发登录取决于 Web 应用程序。例如,在线银行网站将限制为只有一个用户会话 - 因此,如果用户从不同的会话登录,则先前的会话无效(即用户已注销)。必须在 ASP.NET 中编写自定义实现才能做到这一点——典型的实现会使每个用户会话条目进入数据库(通常无论如何都需要用于审计目的)——所以每当添加新条目时,都会检查是否有任何同一用户的活动会话,如果是,则该会话被标记为非活动。每个请求都会检查当前用户会话是否处于活动状态,如果没有,则会将此类消息标记给用户。

于 2013-10-09T10:57:29.337 回答
0

上述场景的实现可以根据需要而变化。我会使用保存user session在我的数据库中以及IP address. 现在,每当有新请求出现时,我都会检查这台机器上是否存在任何活动会话。如果是,那么我将不允许新用户登录。

您也可以将此信息保存在 cookie 中,但如果用户删除 cookie,他将被允许登录。

于 2013-10-09T10:57:35.570 回答
0

如果用户使用不同的浏览器,那么我认为这是不可能的,但是对于相同的浏览器,如果您遇到此问题,那么您可能错过了检查用户会话/cookie,无论您在登录页面上用于登录用户。

例如,在 login.aspx 页面上,如果我的 cookie/session 为 null,则表示用户已注销。否则我应该在登录后将用户重定向到页面(当用户已经登录时,不允许用户留在 login.aspx)

于 2013-10-09T11:09:01.553 回答
0

尝试这个 :

global.asax 源代码

 private int mnSessionMinutes = 2;
 private string msSessionCacheName="SessionTimeOut";

public void InsertSessionCacheItem(string sUserID)
{

   try
     {
         if (this.GetSessionCacheItem(sUserID) != "") { return; }
         CacheItemRemovedCallback oRemove = new CacheItemRemovedCallback(this.SessionEnded);
         System.Web.HttpContext.Current.Cache.Insert(msSessionCacheName + sUserID,sUserID,null, DateTime.MaxValue, 

TimeSpan.FromMinutes(mnSessionMinutes),CacheItemPriority.High,oRemove);
      }
      catch (Exception e) { Response.Write(e.Message); }
}

public string GetSessionCacheItem(string sUserID)
{
      string sRet="";

      try
       {
         sRet = (string)System.Web.HttpContext.Current.Cache[msSessionCacheName + sUserID];
         if (sRet == null) { sRet = ""; }
        }
       catch (Exception) { }
       return sRet;
}


public void SessionEnded(string key, object val, CacheItemRemovedReason r)
{

    string sUserID="";
    string sSessionTest="";

   try
    {
      sSessionTest = Session["Test"].ToString();
    }
    catch (Exception e) { sSessionTest = e.Message;}

    try
    {

        sUserID = (string)val;
     // Make sure your SMTP service has started in order for this to work

        System.Web.Mail.MailMessage message = new System.Web.Mail.MailMessage();

        message.Body = "your session has ended for user : " + sUserID + " - Session String: " + sSessionTest;
        message.To = "your email goes here";
        message.From = "info@eggheadcafe.com";
        message.BodyFormat = System.Web.Mail.MailFormat.Text;
        message.Subject = "Session On End";

        System.Web.Mail.SmtpMail.Send(message);     

        message = null;

     }
     catch (Exception) { }

}

default.aspx 源代码

<script Language="C#" runat="server">

 protected string msUserID = "201";
 protected string msSessionCacheValue="";

 protected void Page_Load(object sender, EventArgs e) { ProcessPage(); }

 public void ProcessPage()
 {
    Session["Test"] = "test string to see if session variables still exist after app recycle.";

    ((global_asax)Context.ApplicationInstance).InsertSessionCacheItem(msUserID);

   // Test to access the cache and make sure it still exists
    msSessionCacheValue = ((global_asax)Context.ApplicationInstance).GetSessionCacheItem(msUserID);
 }

</script>   

<HTML><BODY>

 <table border="0" align="center" cellpadding="2" cellspacing="2" width="70%">
  <tr><td><br></td></tr>
  <tr><td><br></td></tr>
  <tr><td align="left">Close the browser and wait for email notification</td></tr>
  <tr><td><br></td></tr>
  <tr><td align="left"><a href=default.aspx target=_self>Redirect to this page to reaccess the cache</a></td></tr>
  <tr><td><br></td></tr>
  <tr><td align="left"><%=  Session["Test"].ToString()  %></td></tr>
  <tr><td><br></td></tr>
  <tr><td align="left"><%= msSessionCacheValue %></td></tr>
 </table>

</body></html>

我认为您可以使用缓存来做到这一点。你没有给出具体的场景,所以我不会给出具体的答案。但是您可以查看以下教程。

防止 ASP.NET 中的多次登录

在 ASP.NET 中使用缓存防止多次登录

于 2013-10-09T11:00:21.040 回答