当两个用户都使用同一台机器时,我必须限制新用户同时从该系统登录到我的 Web 应用程序。(即如果一个用户登录,那么如果另一个用户从同一台机器上尝试,我应该限制第二个用户在同一台机器上登录)
我想到了mac id验证,但它无法进入c#(不能使用active-x javascript来获取id)。这可以使用cookies来跟踪吗?
任何人都可以为此提出一些解决方案。
使用windows身份验证并维护用户会话并在登录时检查相同!
或者
带有 cookie 的表单身份验证(无论它们是否持久)是基于浏览器会话的(持久 cookie 当然可以跨同一浏览器的多个会话(在同一台机器上的同一用户帐户上)工作。所以两个浏览器会话(或两个不同的浏览器或两台机器上的浏览器等)就表单身份验证而言将被视为不同的范围。
因此用户可以从不同的浏览器会话进行多次登录,并且其中一个注销不会影响另一个。是否允许同一用户的多个并发登录取决于 Web 应用程序。例如,在线银行网站将限制为只有一个用户会话 - 因此,如果用户从不同的会话登录,则先前的会话无效(即用户已注销)。必须在 ASP.NET 中编写自定义实现才能做到这一点——典型的实现会使每个用户会话条目进入数据库(通常无论如何都需要用于审计目的)——所以每当添加新条目时,都会检查是否有任何同一用户的活动会话,如果是,则该会话被标记为非活动。每个请求都会检查当前用户会话是否处于活动状态,如果没有,则会将此类消息标记给用户。
上述场景的实现可以根据需要而变化。我会使用保存user session
在我的数据库中以及IP address
. 现在,每当有新请求出现时,我都会检查这台机器上是否存在任何活动会话。如果是,那么我将不允许新用户登录。
您也可以将此信息保存在 cookie 中,但如果用户删除 cookie,他将被允许登录。
如果用户使用不同的浏览器,那么我认为这是不可能的,但是对于相同的浏览器,如果您遇到此问题,那么您可能错过了检查用户会话/cookie,无论您在登录页面上用于登录用户。
例如,在 login.aspx 页面上,如果我的 cookie/session 为 null,则表示用户已注销。否则我应该在登录后将用户重定向到页面(当用户已经登录时,不允许用户留在 login.aspx)
尝试这个 :
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>
我认为您可以使用缓存来做到这一点。你没有给出具体的场景,所以我不会给出具体的答案。但是您可以查看以下教程。