如何防止单个用户名的多次登录?我在数据库中保存用户名和密码。我希望用户一次只能从一个地方登录。
有关如何配置ASP.NET应用程序的更多信息,请访问http://go.microsoft.com/fwlink/?LinkId=169433
以下是我尝试过的代码
配置文件
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<httpModules>
<add name="SingleSessionEnforcement" type="SingleSessionEnforcement" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="false" >
<add name="SingleSessionEnforcement" type="SingleSessionEnforcement" />
</modules>
</system.webServer>
</configuration>
班级档案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
namespace Demo1
{
public class SingleSessionEnforcement : IHttpModule
{
public SingleSessionEnforcement()
{
// No construction needed
}
private void OnPostAuthenticate(Object sender, EventArgs e)
{
Guid sessionToken;
HttpApplication httpApplication = (HttpApplication)sender;
HttpContext httpContext = httpApplication.Context;
// Check user's session token
if (httpContext.User.Identity.IsAuthenticated)
{
FormsAuthenticationTicket authenticationTicket =
((FormsIdentity)httpContext.User.Identity).Ticket;
if (authenticationTicket.UserData != "")
{
sessionToken = new Guid(authenticationTicket.UserData);
}
else
{
// No authentication ticket found so logout this user
// Should never hit this code
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
return;
}
MembershipUser currentUser = Membership.GetUser(authenticationTicket.Name);
// May want to add a conditional here so we only check
// if the user needs to be checked. For instance, your business
// rules for the application may state that users in the Admin
// role are allowed to have multiple sessions
Guid storedToken = new Guid(currentUser.Comment);
if (sessionToken != storedToken)
{
// Stored session does not match one in authentication
// ticket so logout the user
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
}
public void Dispose()
{
// Nothing to dispose
}
public void Init(HttpApplication context)
{
context.PostAuthenticateRequest += new EventHandler(OnPostAuthenticate);
}
}
}
ASPX.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Demo1
{
public partial class login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//TextBox userNameTextBox = (TextBox)LoginUser.FindControl("UserName");
SingleSessionPreparation.CreateAndStoreSessionToken(userNameTextBox.Text);
}
}
}
ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="Demo1.login" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
Name: <asp:TextBox ID="userNameTextBox" runat="server"></asp:TextBox><br/>
Password: <asp:TextBox ID="PasswordTextBox" runat="server"></asp:TextBox><br/>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
</form>
</body>
</html>
它给出了这个错误:
无法加载类型'SingleSessionEnforcement' 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Web.HttpException:无法加载类型'SingleSessionEnforcement'。
请参考附带的错误图片:
请指导我解决问题。
答案 0 :(得分:1)
type属性需要包含命名空间:
<add name="SingleSessionEnforcement" type="Demo1.SingleSessionEnforcement" />
答案 1 :(得分:0)
希望到这个时候你可以得到解决方案。如果没有,请参阅下面的评论:
问题出在web.config文件中。 Httpmodule只能在配置文件中启动一次。
如果是IIS 7.0或更低版本,请在system.web中使用以下内容,
<httpModules>
<add name="SingleSessionEnforcement" type="SingleSessionEnforcement" />
</httpModules>
如果是> IIS 7.0,在system.webServer中使用以下一个,
<modules>
<add name="SingleSessionEnforcement" type="SingleSessionEnforcement" />
</modules>