求登录按钮的代码 如题登录按钮单击事件:链接数据库,判断是否是合法用户,是则转向一个正确的页面,错误则转向一个错误的页面另外还想请教一下如何判断用户是否已经登录了,而决定是否向其开放这个页面,以防绕过登录程序直接用链接打开页面非常感谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SqlConnection _conn = new SqlConnection(连接字符串);_conn.Open();SqlCommand _cmd =new SqlCommand("select count(*) from 表 where Uid ='"+this.txtUid.Text+"' and Pwd = '"+this.txtPwd.Text+"'",_conn);if((int)_cmd.ExecuteScalar()>0){表示用户验证成功Response.Redirect(新的网页);}else{不成功} 以防绕过登录程序直接用链接打开页面 这个用Form验证就可以了 如楼上所说session可以保存用户信息很方便,找一下这方面的资料参考下吧 登录成功后把用户名放入session里,在其他页面上验证是否存在就行了。 下载本文源代码 系统的基本架构 我们假设一个系统System包含Service客户服务中心、Shop网上购物中心和Office网上办公中心三个独立的网站。Service管理客户的资料,登录和注销过程。不论客户访问System的任何一个页面,系统都会转到登录界面,在用户登录后,系统会自动转会到客户上次请求的页面。并且用户此后可以在System中无缝切换。不需要再次进行登录。即在System中实现单点登录SSO(Single Sign-On)。 我们知道,用户的即时状态通常是使用Application、Session、Cookie和存储的。而这些都是不能在程序中跨站点访问的。我们必需通过站点间相互通讯来确认用户的即时状态。 简单的实现 如图所示,该图描述了用户访问System的流程。 第一步,假设用户访问了Shop或Office的任何一个页面Any。该页面所在的网站将会检查用户的即时状态。如果用户已经登录了,则将Any页面的信息返回给用户。如果用户还没有登录,则自动转到Service的Validate页面,验证用户在Service状态。即Shop或Office向 Service发出请求,要求Service返回用户的即时状态。 第二步,Validate验证用户的即时状态,如果用户已经登录了,则Service将用户的即时状态返回给Shop或Office的同步页面Synchronous,通知Shop或Office同步用户状态。如果用户没有登录,则自动转向Customer页面,提示用户登录。 第三步,用户完成登录过程,当用户成功登录后,自动转回Validate页面,通知Shop或Office的Synchronous进行用户状态的同步。 第四步,在用户状态同步完成后,在本地站点,用户状态成为在线状态,即可访问Any页面。 在上面的流程中。我们知道,不管用户访问哪个站点,用户只需要一次登录,就保证用户在Service的即时状态都是在线的,不会再需要进行第二次登录的过程。 现在我们的思路已经清楚,具体的实现我们将在代码分析中完成。 http://dev.yesky.com/msdn/326/2036826.shtml Web.config <configuration> <system.web> <compilation debug="true"/> <authentication mode="Forms"> <forms loginUrl="login.aspx" name = ".ASPXFORMSAUTH" /> </authentication> <authorization> <deny users="?"/> </authorization> </system.web> </configuration> default.aspx <HTML> <HEAD> <TITLE>首页</TITLE> <script language="VB" runat="server"> Sub Page_Load(Sender As Object, e As EventArgs) Message.Text = String.Format("你好,{0}", Context.User.Identity.Name) End Sub sub btnSignout_Click(Sender as Object, E as EventArgs) FormsAuthentication.SignOut() Response.Redirect("login.aspx") end sub </script> </HEAD> <BODY> <asp:label id="Message" runat="server"/> <br> <form method="post" runat="server"> <asp:button id="btnSignout" Text="退出登录" runat="server" OnClick="btnSignout_Click"/> </form> </BODY> </HTML> login.aspx <HEAD> <TITLE>首页</TITLE> <script lanugage="c#" runat="server"> private void Page_Load(object sender, EventArgs e) { if (Request.IsAuthenticated) Response.Redirect("default.aspx"); } void btnLogin_Click(Object sender, EventArgs e) { if (txtUsername.Text != null && txtUsername.Text != String.Empty && txtPassword.Text != null && txtPassword.Text != String.Empty) FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true); else lblError.Text = "错误的用户名/密码"; } </script> </HEAD> <BODY> <form method="post" runat="server"> <asp:Label id="lblUsername" runat="server" Text="用户名:"/> <asp:Textbox id="txtUsername" runat="server"/> <br> <br> <asp:Label id="lblPassword" runat="server" Text="密 码:"/> <asp:Textbox id="txtPassword" runat="server" TextMode="password"/> <br> <asp:button id="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" /> </form> <hr> <br> <asp:Label id="lblError" forecolor="red" runat="server"/> </BODY> </HTML> C#做的ASP.NET登錄篇一、新建一个数据库 新建一个access数据user.mdb。 新建一个user表,添加:UserId(文本类型)及Password(文本类型)两个字段。二、新建一个default.aspx文件。 在Web Form里: 加入两个Label控件,Text属性分别为“登录名”和“密码”; 加入两个TextBox控件,ID属性分别为“Userid”和“Pwd”,Text属性均为空; 加入两个RequiredFieldValidato控件,ID属性分别为“rfvUserid”和“rfvPwd”,Text属性分别为“请输入登录名!”和“请输入登录密码!”,ControlToValidate属性分别为"Userid"和"Pwd"; 加入一个Button控件,ID属性为“LogButton”,Text属性别为“登录”; 最后加入一个Label控件,ID属性为“Msg”。 Default.aspx源代码如下:<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="lsj.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML><HEAD><meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"><meta name="CODE_LANGUAGE" Content="C#"><meta name="vs_defaultClientScript" content="JavaScript (ECMAScript)"><meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"></HEAD><body MS_POSITIONING="GridLayout"><FONT face="宋体"><form runat="server" ID="Form1"><asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 82px; POSITION: absolute; TOP: 39px" runat="server" Width="55px" Height="26px">登录名</asp:Label><asp:Label id="Label2" style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 84px" runat="server" Width="63px" Height="24px">密 码</asp:Label><asp:TextBox id="Userid" style="Z-INDEX: 103; LEFT: 161px; POSITION: absolute; TOP: 39px" runat="server" Width="109px" Height="25px"></asp:TextBox><asp:TextBox id="Pwd" style="Z-INDEX: 104; LEFT: 162px; POSITION: absolute; TOP: 81px" runat="server" Width="109px" Height="22px" TextMode="Password"></asp:TextBox><asp:Button id="LogButton" style="Z-INDEX: 105; LEFT: 79px; POSITION: absolute; TOP: 125px" runat="server" Width="59px" Height="25px" Text="登 录"></asp:Button><asp:Label id="Msg" style="Z-INDEX: 106; LEFT: 161px; POSITION: absolute; TOP: 130px" runat="server" Width="117px" Height="26px"></asp:Label><asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 107; LEFT: 290px; POSITION: absolute; TOP: 43px" runat="server" Width="162px" Height="18px" ErrorMessage="RequiredFieldValidator" ControlToValidate="Userid">请输入登录名!</asp:RequiredFieldValidator><asp:RequiredFieldValidator id="RequiredFieldValidator2" style="Z-INDEX: 108; LEFT: 292px; POSITION: absolute; TOP: 83px" runat="server" Width="175px" Height="22px" ErrorMessage="RequiredFieldValidator" ControlToValidate="Pwd">请输入登录密码!</asp:RequiredFieldValidator></form></FONT></body></HTML> 三、编写default.aspx.cs文件。 双击LogButton, 1、加入using System.Data.OleDb; 2、先在class中声明: public string strConnection; OleDbConnection myConn; 3、加入数据库链接: 把下面代码加入“Page_Init(object sender, EventArgs e)”的“InitializeComponent();”后面. string strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(".")+"..\\user.mdb;"; myConn=new OleDbConnection(strConnection); 4、在LogButton_Click(object sender, System.EventArgs e)事件中加入下面的代码:string userid,pwd;userid=Userid.Text;pwd=Pwd.Text; string mySel="SELECT count(*) as iCount from user where UserID=""+userid+"""; OleDbCommand myCmd1=new OleDbCommand(mySel,myConn);myCmd1.Connection.Open();OleDbDataReader Dr1;Dr1=myCmd1.ExecuteReader();Dr1.Read();string Count=Dr1["iCount"].ToString();Dr1.Close();myCmd1.Connection.Close();string DrPwd,DrRoles;if(Count!="0"){ mySel="SELECT * from user where UserID=""+userid+"""; OleDbCommand myCmd=new OleDbCommand(mySel,myConn); myCmd.Connection.Open(); OleDbDataReader Dr; Dr=myCmd.ExecuteReader(); Dr.Read(); DrPwd=Dr["Password"].ToString(); Dr.Close(); if(DrPwd==pwd) { Session["logid"]=userid; Response.Redirect("main.aspx"); } else Msg.Text="登录密码错.";}else Msg.Text="没有这个用户."; 好了,全部工作已经完成,default.aspx.cs源代码如下:using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;using System.Data.OleDb; namespace lsj{ /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.TextBox Userid; protected System.Web.UI.WebControls.Button LogButton; protected System.Web.UI.WebControls.TextBox Pwd; protected System.Web.UI.WebControls.Label Msg; protected System.Web.UI.HtmlControls.HtmlForm Form1; protected System.Web.UI.WebControls.RequiredFieldValidator rfvUserid; protected System.Web.UI.WebControls.RequiredFieldValidator rfvPwd; public string strConnection; OleDbConnection myConn; public WebForm1() { Page.Init += new System.EventHandler(Page_Init); } private void Page_Load(object sender, System.EventArgs e) { } private void Page_Init(object sender, EventArgs e) {InitializeComponent();string strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(".")+"..\\user.mdb;";//user.mdb放在与aspx文件同一目录下myConn=new OleDbConnection(strConnection); } private void InitializeComponent() { this.LogButton.Click += new System.EventHandler(this.LogButton_Click);this.Load += new System.EventHandler(this.Page_Load); } private void LogButton_Click(object sender, System.EventArgs e) { string userid,pwd;userid=Userid.Text;pwd=Pwd.Text; string mySel="SELECT count(*) as iCount from user where UserID=""+userid+"""; OleDbCommand myCmd1=new OleDbCommand(mySel,myConn);myCmd1.Connection.Open();OleDbDataReader Dr1;Dr1=myCmd1.ExecuteReader();Dr1.Read();string Count=Dr1["iCount"].ToString();Dr1.Close();myCmd1.Connection.Close();string DrPwd,DrRoles;if(Count!="0"){ mySel="SELECT * from user where UserID=""+userid+"""; OleDbCommand myCmd=new OleDbCommand(mySel,myConn); myCmd.Connection.Open(); OleDbDataReader Dr; Dr=myCmd.ExecuteReader(); Dr.Read(); DrPwd=Dr["Password"].ToString(); Dr.Close(); if(DrPwd==pwd) { Session["logid"]=userid;//新建一个Session Response.Redirect("main.aspx"); } else Msg.Text="登录密码错.";}else Msg.Text="没有这个用户."; } }} IIS 身份验证 IIS 身份验证ASP.NET 窗体身份验证 ASP.NET 窗体身份验证Cookieless 窗体身份验证 Cookieless 窗体身份验证成员身份和登录控件 成员身份和登录控件Web 场方案 Web 场方案其他资源 其他资源反馈 反馈技术支持 技术支持社区和新闻组 社区和新闻组投稿人与审阅者 投稿人与审阅者目标窗体身份验证使用用户登录到站点时创建的身份验证票,然后在整个站点内跟踪该用户。窗体身份验证票通常包含在一个 Cookie 中。然而,ASP.NET 2.0 版支持无 Cookie 窗体身份验证,结果是将票证传入查询字符串中。如果用户请求一个需要经过身份验证的访问的页,且该用户以前没有登录过该站点,则该用户重定向到一个配置好的登录页。该登录页提示用户提供凭据(通常是用户名和密码)。然后,将这些凭据传递给服务器并针对用户存储(如 SQL Server 数据库)进行验证。在 ASP.NET 2.0 中,用户存储访问可由成员身份提供程序处理。对用户的凭据进行身份验证后,用户重定向到原来请求的页面。窗体身份验证处理由 FormsAuthenticationModule 类实现,该类是一个参与常规 ASP.NET 页处理循环的 HTTP 模块。本文阐释 ASP.NET 2.0 中窗体身份验证的工作机制。返回页首IIS 身份验证ASP.NET 身份验证分为两个步骤。首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户。IIS 通过查看 IIS 元数据库设置,确定应该对特定应用程序使用的身份验证模式。如果 IIS 配置为使用匿名身份验证,则为 IUSR_MACHINE 帐户生成一个令牌并用它表示匿名用户。然后,IIS 将该令牌传递给 ASP.NET。其次,ASP.NET 执行自己的身份验证。所使用的身份验证方法由 authentication 元素的 mode 属性指定。以下身份验证配置指定 ASP.NET 使用 FormsAuthenticationModule 类:<authentication mode="Forms" />注 由于窗体身份验证不依赖于 IIS 身份验证,因此如果要在 ASP.NET 应用程序中使用窗体身份验证,则应该在 IIS 中为应用程序配置匿名访问。返回页首ASP.NET 窗体身份验证ASP.NET 窗体身份验证在 IIS 身份验证完成后发生。可以使用 forms 元素配置窗体身份验证。窗体身份验证配置以下配置文件片段显示窗体身份验证的默认属性值。<system.web> <authentication mode="Forms"> <forms loginUrl="Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="true" defaultUrl="default.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false" /> </authentication></system.web>下面是对默认属性值的描述: * loginUrl 指向应用程序的自定义登录页。应该将登录页放在需要安全套接字层 (SSL) 的文件夹中。这有助于确保凭据从浏览器传到 Web 服务器时的完整性。 * protection 设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是 machineKey 元素上指定的哈希算法进行签名。 * timeout 用于指定窗体身份验证会话的有限生存期。默认值为 30 分钟。如果颁发持久的窗体身份验证 Cookie,timeout 属性还用于设置持久 Cookie 的生存期。 * name 和 path 设置为应用程序的配置文件中定义的值。 * requireSSL 设置为 false。该配置意味着身份验证 Cookie 可通过未经 SSL 加密的信道进行传输。如果担心会话窃取,应考虑将 requireSSL 设置为 true。 * slidingExpiration 设置为 true 以执行变化的会话生存期。这意味着只要用户在站点上处于活动状态,会话超时就会定期重置。 * defaultUrl 设置为应用程序的 Default.aspx 页。 * cookieless 设置为 UseDeviceProfile,以指定应用程序对所有支持 Cookie 的浏览器都使用 Cookie。如果不支持 Cookie 的浏览器访问该站点,窗体身份验证在 URL 上打包身份验证票。 * enableCrossAppRedirects 设置为 false,以指明窗体身份验证不支持自动处理在应用程序之间传递的查询字符串上的票证以及作为某个窗体 POST 的一部分传递的票证。授权配置在 IIS 中,对所有使用窗体身份验证的应用程序启用异步访问。UrlAuthorizationModule 类用于帮助确保只有经过身份验证的用户才能访问页。可以使用 authorization 元素配置 UrlAuthorizationModule,如以下示例所示。<system.web> <authorization> <deny users="?" /> </authorization></system.web>使用该设置将拒绝所有未经过身份验证的用户访问应用程序中的任何页。如果未经身份验证的用户试图访问某页,窗体身份验证模块将该用户重定向到 forms 元素的 loginUrl 属性指定的登录页。窗体身份验证控制流图 1 显示窗体身份验证期间出现的事件顺序。图 1. 窗体身份验证控制流 * 用户请求应用程序的虚拟目录下的 Default.aspx 文件。因为 IIS 元数据库中启用了匿名访问,因此 IIS 允许该请求。ASP.NET 确认 authorization 元素包括 <deny users="?" /> 标记。 * 服务器查找一个身份验证 Cookie。如果找不到该身份验证 Cookie,则用户重定向到配置好的登录页 (Login.aspx),该页由 forms 元素的 LoginUrl 属性。用户通过该窗体提供和提交凭据。有关起始页的信息存放在使用 RETURNURL 作为密钥的查询字符串中。服务器 HTTP 应答如下所示: 302 Found Location: http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx * 浏览器请求 Login.aspx 页,并在查询字符串中包括 RETURNURL 参数。 * 服务器返回登录页以及 200 OK HTTP 状态代码。 * 用户在登录页输入凭据,并将该页(包括来自查询字符串的 RETURNURL 参数)发送回服务器。 * 服务器根据某个存储(如 SQL Server 数据库或 Active Directory 用户存储)验证用户凭据。登录页中的代码创建一个包含为该会话设置的窗体身份验证票的 Cookie。 在 ASP.NET 2.0 中,可以通过成员身份系统执行对用户凭据的验证。Membership 类为此提供了 ValidateUser 方法,如下所示: if (Membership.ValidateUser(userName.Text, password.Text)) { if (Request.QueryString["ReturnUrl"] != null) { FormsAuthentication.RedirectFromLoginPage(userName.Text, false); } else { FormsAuthentication.SetAuthCookie(userName.Text, false); } } else { Response.Write("Invalid UserID and Password"); } 注 使用 Login Web 服务器控件时,它自动为您执行以下步骤。下文使用了前面提供的代码。 * 对于经过身份验证的用户,服务器将浏览器重定向到查询字符串中的 RETURNURL 参数指定的原始 URL。服务器 HTTP 应答如下所示: 302 Found Location: http://localhost/TestSample/default.aspx * 重定向之后,浏览器再次请求 Default.aspx 页。该请求包括身份验证 Cookie。 * FormsAuthenticationModule 类检测窗体身份验证 Cookie 并对用户进行身份验证。身份验证成功后,FormsAuthenticationModule 类使用有关经过身份验证的用户的信息填充当前的 User 属性(由 HttpContext 对象公开)。 * 由于服务器已经验证了身份验证 Cookie,因此它允许访问并返回 Default.aspx 页。FormsAuthenticationModuleASP.NET 2.0 在计算机级 Web.config 文件中定义了一组 HTTP 模块,包括大量身份验证模块,如下所示:<httpModules> ... <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" /> <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" /> ...</httpModules>每个请求只能使用一个身份验证模块。所使用的身份验证模块取决于 authentication 元素(通常位于应用程序的虚拟目录中的 Web.config 文件中)指定了哪种身份验证模式。当 Web.config 文件中包含以下元素时,激活 FormsAuthenticationModule 类。<authentication mode="Forms" />FormsAuthenticationModule 类构造一个 GenericPrincipal 对象并将其存储在 HTTP 上下文中。GenericPrincipal 对象保存对一个 FormsIdentity 实例的引用,该实例代表当前经过身份验证的用户。应该允许窗体身份验证为您管理这些任务。如果应用程序有特定要求(例如,将 User 属性设置为一个实现 IPrincipal 接口的自定义类),则该应用程序应该处理 PostAuthenticate 事件。FormsAuthenticationModule 验证了窗体身份验证 Cookie 并创建了 GenericPrincipal 和 FormsIdentity 对象之后,会发生 PostAuthenticate 事件。在该代码中,可以构造一个包装 FormsIdentity 对象的自定义 IPrincipal 对象,然后将它存储在 HttpContext. User 属性中。注 如果执行了这一操作,还需要设置 Thread.CurrentPrincipal 属性上的 IPrincipal 引用,以确保 HttpContext 对象和该线程指向相同的身份验证信息。窗体身份验证 Cookie调用 FormsAuthentication.SetAuthCookie 或FormsAuthentication.RedirectFromLoginPage 方法时,FormsAuthentication 类自动创建身份验证 Cookie。典型的窗体身份验证 Cookie 中包括以下属性: * Name。该属性指定 Cookie 的名称。 * Value。该属性指定 Cookie 的值。 在典型的窗体身份验证 Cookie 中,该值包含一个经过加密和签名的 FormsAuthenticationTicket 对象的字符串表示形式。该 Cookie 包含以下属性: * Expires。该属性指定 Cookie 的到期日期和时间。仅当代码指示应该颁发一个持久的窗体身份验证 Cookie,窗体身份验证才设置该值。 * Domain。该属性指定与 Cookie 关联的域。默认值为 null。 o HasKeys。该属性指出 Cookie 是否有子项。 * HttpOnly。该属性指定是否可以通过客户端脚本访问该 Cookie。在 ASP.NET 2.0 中,该值始终设置为 true。Internet Explorer 6 Service Pack 1 支持该 Cookie 属性,从而防止客户端脚本从 document.cookie 属性访问该 Cookie。如果尝试从客户端脚本访问该 Cookie,则返回一个空字符串。无论何时用户浏览到当前域中的 Web 站点,该 Cookie 仍然发送至服务器。 注 不支持 HttpOnly Cookie 属性的 Web 浏览器要么忽略该 Cookie,要么忽略该属性,这意味着会话仍然容易受到跨站点脚本的攻击。 * Path。该属性指定 Cookie 的虚拟路径。默认值为"/",代表根目录。 * Secure。该属性指出 Cookie 是否应该仅通过 HTTPS 连接传输。Secure 属性应设置为 true,以便该 Cookie 可以受 SSL 加密的保护。 * Version。该属性指定 Cookie 的版本号。创建身份验证 Cookie通过 FormsAuthentication 类创建身份验证 Cookie,如下所示。用户经过验证后,FormsAuthentication 类在内部创建一个 FormsAuthenticationTicket 对象,方法是指定 Cookie 名、Cookie 版本、目录路径、Cookie 颁发日期;Cookie 到期日期、是否应该保留 Cookie,以及用户定义的数据(可选)。FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "userName", DateTime.Now, DateTime.Now.AddMinutes(30), // value of time out property false, // Value of IsPersistent property String.Empty, FormsAuthentication.FormsCookiePath); 接下来,如果 forms 元素的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。string encryptedTicket = FormsAuthentication.Encrypt(ticket); 以下文本显示了当 protection 属性设置为 All 时使用的过程: * 创建序列化窗体身份验证票。创建票证的字节数组表示形式。 * 对窗体身份验证票进行签名。字节数组的消息身份验证代码 (MAC) 的值,由使用 machineKey 元素的 validation 和 validationKey 属性指定的算法和密钥进行计算。默认情况下,使用 SHA1 算法。 * 对窗体身份验证票进行加密。已经创建的第二个字节数组使用 FormsAuthentication 类的 Encrypt 方法进行加密。该 Encrypt 方法在内部使用由 machineKey 元素上的 decryption 和 decryptionKey 属性指定的算法和密钥。ASP.NET 1.1 版在默认情况下使用 3DES 算法。ASP.NET 2.0 版在默认情况下使用 Rinjdael (AES) 算法。 * 根据需要创建 HTTP Cooki e 或查询字符串。然后,如果窗体身份验证针对 cookieless 身份验证进行了配置,则加密的身份验证票添加到 HttpCookie 对象。使用以下代码创建该 Cookie 对象: HttpCookie authCookie = new HttpCookie( FormsAuthentication.FormsCookieName, encryptedTicket); * 将窗体身份验证 Cookie 设置为安全的。如果窗体身份验证票配置为使用 SSL,则 HttpCookie. Secure 属性设置为 true。这表明浏览器仅通过 HTTPS 连接发送 Cookie。 authCookie.Secure = true; * 设置 HttpOnly 位。在 ASP.NET 2.0 中,始终设置该位。 * 设置适当的 Cookie 属性。如果需要,设置 Cookie 的 path、domain 和 expires 属性。 * 将 Cookie 添加到 Cookie 集合。将身份验证 Cookie 添加到要返回给客户端浏览器的 Cookie 集合。 Response.Cookies.Add(authCookie);每次在身份验证之后接收一个后续请求时,FormsAuthenticationModule 类都会从身份验证 Cookie 中检索身份验证票,对其进行解密,计算哈希值,并比较该 MAC 值,以帮助确保该 Cookie 未被篡改。最后,验证该窗体身份验证票中包含的到期时间。注 ASP.NET 并不依赖于 Cookie 的到期日期,因为该时间很容易伪造。角色授权在 ASP.NET 2.0 中,角色授权已经得到简化。对用户进行身份验证或者将角色细节添加到身份验证 Cookie 时,不再需要检索角色信息。.NET Framework 2.0 包括一个角色管理 API,它使您能够创建和删除角色,将用户添加到角色以及从角色删除用户。该角色管理 API 将其数据存储在一个基础数据存储中,它通过针对该数据存储的适当角色提供程序访问该存储。以下角色提供程序为 .NET Framework 2.0 附带,可以与窗体身份验证一起使用: * SQL Server。它是默认的提供程序,将角色信息存储在 SQL Server 数据库。 * 授权管理器 (AzMan)。该提供程序使用 XML 文件、Active Directory 或 Active Directory 应用程序模式 (ADAM) 中的一个 AzMan 策略存储作为其角色存储。它通常用于 Intranet 或 Extranet 方案中,其中 Windows 身份验证和 Active Directory 用于进行身份验证。有关如何使用角色管理 API 的详细信息,请参阅 How To: Use Role Manager in ASP.NET 2.0。返回页首Cookieless 窗体身份验证ASP.NET 2.0 支持 cookieless 窗体身份验证。该功能由 forms 元素的 cookieless 属性控制。该属性可以设置为以下四个值之一: * UseCookies。该值强制 FormsAuthenticationModule 类使用 Cookie 传输身份验证票。 * UseUri。该值指示 FormsAuthenticationModule 类重写 URL 来传输身份验证票。 * UseDeviceProfile。该值指示 FormsAuthenticationModule 类查看浏览器功能。如果浏览器支持 Cookie,则使用 Cookie;否则,重写 URL。 * AutoDetect。该值通过一个动态检测机制指示 FormsAuthenticationModule 类检测浏览器是否支持 Cookie。如果检测逻辑表明不支持 Cookie,则重写 URL。如果应用程序配置为使用 cookieless 窗体身份验证,并且正在使用 FormsAuthentication.RedirectFromLoginPage 方法,则 FormsAuthenticationModule 类自动设置 URL 中的窗体身份验证票。以下代码示例显示了典型 URL 在重写后的外观:http://localhost/CookielessFormsAuthTest/(F(-k9DcsrIY4CAW81Rbju8KRnJ5o_gOQe0I1E_jNJLYm74izyOJK8GWdfoebgePJTEws0Pci7fHgTOUFTJe9jvgA2))/Test.aspx括号中的 URL 部分包含 Cookie 通常将包含的数据。该数据在请求处理过程中由 ASP.NET 删除。该步骤由 ASP.NET ISAPI 筛选器执行,而不是在 HttpModule 类中执行。如果从一个 .aspx 页读取 Request.Path 属性,您在 URL 中不会看到任何额外的信息。如果重定向请求,URL 将自动重写。注 难以保证 URL 中包含的身份验证票的安全。当安全性极为重要时,您应该使用 Cookie 存储身份验证票。返回页首成员身份和登录控件ASP.NET 2.0 引入了成员身份功能和一组登录 Web 服务器控件,它们简化了使用窗体身份验证的应用程序的实现。成员身份为应用程序用户提供凭据存储和管理。它还提供一个成员身份 API,可以在使用窗体身份验证时简化用户凭据的验证任务。该成员身份功能构建于提供程序模型之上。该模型允许实现和配置指向不同用户存储的不同提供程序。ASP.NET 2.0 包括以下成员关系提供程序: * Active Directory 成员关系提供程序。该提供程序使用 Active Directory 或 Active Directory 应用程序模式 (ADAM) 用户存储。 * SQL Server 成员关系提供程序。该提供程序使用 SQL Server 用户存储。还可以添加对自定义用户存储的支持。例如,可以添加对其他轻量级目录访问协议 (LDAP) 目录或其他现有公共标识存储的支持。为此,创建一个从 MembershipProvider 抽象基类继承的自定义提供程序。ASP.NET 登录控件自动使用成员身份和窗体身份验证,并封装提示用户输入凭据,验证用户,恢复或替换密码等所需的逻辑。实际上,ASP.NET 登录控件在窗体身份验证和成员身份上提供一个抽象层,并且取代了您使用窗体身份验证时通常必须进行的大多数或全部工作。有关使用成员身份功能和登录控件的详细信息,请参阅 How To: Use Membership in ASP.NET 2.0。返回页首Web 场方案在 Web 场中,无法确保哪个服务器将处理连续请求。如果用户在一台服务器上经过身份验证,但下一个请求在另一台服务器上进行,则身份验证票将导致验证失败并请求用户重新进行身份验证。machineKey 元素中的 validationKey 和 decryptionKey 属性用于对窗体身份验证票进行哈希操作和加密。这些属性的默认值为 AutoGenerate.IsolateApps。这些密钥是针对每个应用程序自动生成的,在每台服务器上都不同。因此,在一台计算机上加密的身份验证票无法在 Web 场中的另一台计算机或者同一台 Web 服务器上的另一个应用程序中进行解密和验证。为了解决该问题, Web 场中所有计算机上的 validationKey 和 decryptionKey 值都必须相同。有关配置 machineKey 元素的详细信息,请参阅 How To: Configure MachineKey in ASP.NET 2.0。 C#获取文件sha1总是与网上工具获取的结果不一样 Winform用按钮控制控件滚动条进度 python一个加密算法怎么改写成对应的c#算法.....盼高手指教 <br>加进去没变化 调用ExecuteNonQuery的时候如果是多行sql如何获得所有的返回值 ^ō^ 寻求(反射).FieldInfo取值的优化方案... 自己新建一个类,调用Response.write()方法老是报错,搞不定了!!! 请问:如何控制RichTextBox的垂直滚动条滚动? 一个关于控件的问题 我是新手,请大虾帮忙。谢谢! reportview报表的应用 C#程序中的几个疑问
_conn.Open();
SqlCommand _cmd =new SqlCommand("select count(*) from 表 where Uid ='"+this.txtUid.Text+"' and Pwd = '"+this.txtPwd.Text+"'",_conn);
if((int)_cmd.ExecuteScalar()>0)
{
表示用户验证成功
Response.Redirect(新的网页);
}
else
{
不成功
}
这个用Form验证就可以了
很方便,找一下这方面的资料参考下吧
第一步,假设用户访问了Shop或Office的任何一个页面Any。该页面所在的网站将会检查用户的即时状态。如果用户已经登录了,则将Any页面的信息返回给用户。如果用户还没有登录,则自动转到Service的Validate页面,验证用户在Service状态。即Shop或Office向 Service发出请求,要求Service返回用户的即时状态。 第二步,Validate验证用户的即时状态,如果用户已经登录了,则Service将用户的即时状态返回给Shop或Office的同步页面Synchronous,通知Shop或Office同步用户状态。如果用户没有登录,则自动转向Customer页面,提示用户登录。 第三步,用户完成登录过程,当用户成功登录后,自动转回Validate页面,通知Shop或Office的Synchronous进行用户状态的同步。 第四步,在用户状态同步完成后,在本地站点,用户状态成为在线状态,即可访问Any页面。 在上面的流程中。我们知道,不管用户访问哪个站点,用户只需要一次登录,就保证用户在Service的即时状态都是在线的,不会再需要进行第二次登录的过程。 现在我们的思路已经清楚,具体的实现我们将在代码分析中完成。
<configuration>
<system.web>
<compilation debug="true"/>
<authentication mode="Forms">
<forms loginUrl="login.aspx" name = ".ASPXFORMSAUTH" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration> default.aspx
<HTML>
<HEAD>
<TITLE>首页</TITLE>
<script language="VB" runat="server">
Sub Page_Load(Sender As Object, e As EventArgs)
Message.Text = String.Format("你好,{0}", Context.User.Identity.Name)
End Sub
sub btnSignout_Click(Sender as Object, E as EventArgs)
FormsAuthentication.SignOut()
Response.Redirect("login.aspx")
end sub </script>
</HEAD>
<BODY>
<asp:label id="Message" runat="server"/>
<br>
<form method="post" runat="server">
<asp:button id="btnSignout" Text="退出登录" runat="server" OnClick="btnSignout_Click"/>
</form>
</BODY>
</HTML> login.aspx
<HEAD>
<TITLE>首页</TITLE>
<script lanugage="c#" runat="server">
private void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
Response.Redirect("default.aspx");
}
void btnLogin_Click(Object sender, EventArgs e)
{
if (txtUsername.Text != null && txtUsername.Text != String.Empty && txtPassword.Text != null && txtPassword.Text != String.Empty)
FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);
else
lblError.Text = "错误的用户名/密码";
}
</script>
</HEAD>
<BODY>
<form method="post" runat="server"> <asp:Label id="lblUsername" runat="server" Text="用户名:"/>
<asp:Textbox id="txtUsername" runat="server"/>
<br>
<br>
<asp:Label id="lblPassword" runat="server" Text="密 码:"/>
<asp:Textbox id="txtPassword" runat="server" TextMode="password"/>
<br>
<asp:button id="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" /> </form>
<hr>
<br>
<asp:Label id="lblError" forecolor="red" runat="server"/>
</BODY>
</HTML>
一、新建一个数据库
新建一个access数据user.mdb。
新建一个user表,添加:UserId(文本类型)及Password(文本类型)两个字段。
二、新建一个default.aspx文件。
在Web Form里:
加入两个Label控件,Text属性分别为“登录名”和“密码”;
加入两个TextBox控件,ID属性分别为“Userid”和“Pwd”,Text属性均为空;
加入两个RequiredFieldValidato控件,ID属性分别为“rfvUserid”和“rfvPwd”,Text属性分别为“请输入登录名!”和“请输入登录密码!”,ControlToValidate属性分别为"Userid"和"Pwd";
加入一个Button控件,ID属性为“LogButton”,Text属性别为“登录”;
最后加入一个Label控件,ID属性为“Msg”。
Default.aspx源代码如下:
<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="lsj.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript (ECMAScript)">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<FONT face="宋体">
<form runat="server" ID="Form1">
<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 82px; POSITION: absolute; TOP: 39px" runat="server" Width="55px" Height="26px">登录名</asp:Label>
<asp:Label id="Label2" style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 84px" runat="server" Width="63px" Height="24px">密 码</asp:Label>
<asp:TextBox id="Userid" style="Z-INDEX: 103; LEFT: 161px; POSITION: absolute; TOP: 39px" runat="server" Width="109px" Height="25px"></asp:TextBox>
<asp:TextBox id="Pwd" style="Z-INDEX: 104; LEFT: 162px; POSITION: absolute; TOP: 81px" runat="server" Width="109px" Height="22px" TextMode="Password"></asp:TextBox>
<asp:Button id="LogButton" style="Z-INDEX: 105; LEFT: 79px; POSITION: absolute; TOP: 125px" runat="server" Width="59px" Height="25px" Text="登 录"></asp:Button>
<asp:Label id="Msg" style="Z-INDEX: 106; LEFT: 161px; POSITION: absolute; TOP: 130px" runat="server" Width="117px" Height="26px"></asp:Label>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 107; LEFT: 290px; POSITION: absolute; TOP: 43px" runat="server" Width="162px" Height="18px" ErrorMessage="RequiredFieldValidator" ControlToValidate="Userid">请输入登录名!</asp:RequiredFieldValidator>
<asp:RequiredFieldValidator id="RequiredFieldValidator2" style="Z-INDEX: 108; LEFT: 292px; POSITION: absolute; TOP: 83px" runat="server" Width="175px" Height="22px" ErrorMessage="RequiredFieldValidator" ControlToValidate="Pwd">请输入登录密码!</asp:RequiredFieldValidator>
</form>
</FONT>
</body>
</HTML> 三、编写default.aspx.cs文件。
双击LogButton,
1、加入using System.Data.OleDb;
2、先在class中声明:
public string strConnection;
OleDbConnection myConn;
3、加入数据库链接:
把下面代码加入“Page_Init(object sender, EventArgs e)”的“InitializeComponent();”后面.
string strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(".")+"..\\user.mdb;";
myConn=new OleDbConnection(strConnection);
4、在LogButton_Click(object sender, System.EventArgs e)事件中加入下面的代码:
string userid,pwd;
userid=Userid.Text;
pwd=Pwd.Text;
string mySel="SELECT count(*) as iCount from user where UserID=""+userid+"""; OleDbCommand myCmd1=new OleDbCommand(mySel,myConn);
myCmd1.Connection.Open();
OleDbDataReader Dr1;
Dr1=myCmd1.ExecuteReader();
Dr1.Read();
string Count=Dr1["iCount"].ToString();
Dr1.Close();
myCmd1.Connection.Close();
string DrPwd,DrRoles;
if(Count!="0")
{
mySel="SELECT * from user where UserID=""+userid+""";
OleDbCommand myCmd=new OleDbCommand(mySel,myConn);
myCmd.Connection.Open();
OleDbDataReader Dr;
Dr=myCmd.ExecuteReader();
Dr.Read();
DrPwd=Dr["Password"].ToString();
Dr.Close();
if(DrPwd==pwd)
{
Session["logid"]=userid;
Response.Redirect("main.aspx");
}
else
Msg.Text="登录密码错.";
}
else
Msg.Text="没有这个用户."; 好了,全部工作已经完成,default.aspx.cs源代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.OleDb; namespace lsj
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.TextBox Userid;
protected System.Web.UI.WebControls.Button LogButton;
protected System.Web.UI.WebControls.TextBox Pwd;
protected System.Web.UI.WebControls.Label Msg;
protected System.Web.UI.HtmlControls.HtmlForm Form1;
protected System.Web.UI.WebControls.RequiredFieldValidator rfvUserid;
protected System.Web.UI.WebControls.RequiredFieldValidator rfvPwd;
public string strConnection;
OleDbConnection myConn; public WebForm1()
{
Page.Init += new System.EventHandler(Page_Init);
} private void Page_Load(object sender, System.EventArgs e)
{
} private void Page_Init(object sender, EventArgs e)
{
InitializeComponent();
string strConnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(".")+"..\\user.mdb;";
//user.mdb放在与aspx文件同一目录下
myConn=new OleDbConnection(strConnection);
} private void InitializeComponent()
{
this.LogButton.Click += new System.EventHandler(this.LogButton_Click);
this.Load += new System.EventHandler(this.Page_Load);
} private void LogButton_Click(object sender, System.EventArgs e)
{
string userid,pwd;
userid=Userid.Text;
pwd=Pwd.Text;
string mySel="SELECT count(*) as iCount from user where UserID=""+userid+""";
OleDbCommand myCmd1=new OleDbCommand(mySel,myConn);
myCmd1.Connection.Open();
OleDbDataReader Dr1;
Dr1=myCmd1.ExecuteReader();
Dr1.Read();
string Count=Dr1["iCount"].ToString();
Dr1.Close();
myCmd1.Connection.Close();
string DrPwd,DrRoles;
if(Count!="0")
{
mySel="SELECT * from user where UserID=""+userid+""";
OleDbCommand myCmd=new OleDbCommand(mySel,myConn);
myCmd.Connection.Open();
OleDbDataReader Dr;
Dr=myCmd.ExecuteReader();
Dr.Read();
DrPwd=Dr["Password"].ToString();
Dr.Close();
if(DrPwd==pwd)
{
Session["logid"]=userid;//新建一个Session
Response.Redirect("main.aspx");
}
else
Msg.Text="登录密码错.";
}
else
Msg.Text="没有这个用户.";
}
}
}
ASP.NET 窗体身份验证 ASP.NET 窗体身份验证
Cookieless 窗体身份验证 Cookieless 窗体身份验证
成员身份和登录控件 成员身份和登录控件
Web 场方案 Web 场方案
其他资源 其他资源
反馈 反馈
技术支持 技术支持
社区和新闻组 社区和新闻组
投稿人与审阅者 投稿人与审阅者
目标窗体身份验证使用用户登录到站点时创建的身份验证票,然后在整个站点内跟踪该用户。窗体身份验证票通常包含在一个 Cookie 中。然而,ASP.NET 2.0 版支持无 Cookie 窗体身份验证,结果是将票证传入查询字符串中。如果用户请求一个需要经过身份验证的访问的页,且该用户以前没有登录过该站点,则该用户重定向到一个配置好的登录页。该登录页提示用户提供凭据(通常是用户名和密码)。然后,将这些凭据传递给服务器并针对用户存储(如 SQL Server 数据库)进行验证。在 ASP.NET 2.0 中,用户存储访问可由成员身份提供程序处理。对用户的凭据进行身份验证后,用户重定向到原来请求的页面。窗体身份验证处理由 FormsAuthenticationModule 类实现,该类是一个参与常规 ASP.NET 页处理循环的 HTTP 模块。本文阐释 ASP.NET 2.0 中窗体身份验证的工作机制。
返回页首
IIS 身份验证ASP.NET 身份验证分为两个步骤。首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户。IIS 通过查看 IIS 元数据库设置,确定应该对特定应用程序使用的身份验证模式。如果 IIS 配置为使用匿名身份验证,则为 IUSR_MACHINE 帐户生成一个令牌并用它表示匿名用户。然后,IIS 将该令牌传递给 ASP.NET。其次,ASP.NET 执行自己的身份验证。所使用的身份验证方法由 authentication 元素的 mode 属性指定。以下身份验证配置指定 ASP.NET 使用 FormsAuthenticationModule 类:<authentication mode="Forms" />注 由于窗体身份验证不依赖于 IIS 身份验证,因此如果要在 ASP.NET 应用程序中使用窗体身份验证,则应该在 IIS 中为应用程序配置匿名访问。
返回页首
ASP.NET 窗体身份验证ASP.NET 窗体身份验证在 IIS 身份验证完成后发生。可以使用 forms 元素配置窗体身份验证。窗体身份验证配置以下配置文件片段显示窗体身份验证的默认属性值。<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
protection="All"
timeout="30"
name=".ASPXAUTH"
path="/"
requireSSL="false"
slidingExpiration="true"
defaultUrl="default.aspx"
cookieless="UseDeviceProfile"
enableCrossAppRedirects="false" />
</authentication>
</system.web>下面是对默认属性值的描述: * loginUrl 指向应用程序的自定义登录页。应该将登录页放在需要安全套接字层 (SSL) 的文件夹中。这有助于确保凭据从浏览器传到 Web 服务器时的完整性。
* protection 设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是 machineKey 元素上指定的哈希算法进行签名。
* timeout 用于指定窗体身份验证会话的有限生存期。默认值为 30 分钟。如果颁发持久的窗体身份验证 Cookie,timeout 属性还用于设置持久 Cookie 的生存期。
* name 和 path 设置为应用程序的配置文件中定义的值。
* requireSSL 设置为 false。该配置意味着身份验证 Cookie 可通过未经 SSL 加密的信道进行传输。如果担心会话窃取,应考虑将 requireSSL 设置为 true。
* slidingExpiration 设置为 true 以执行变化的会话生存期。这意味着只要用户在站点上处于活动状态,会话超时就会定期重置。
* defaultUrl 设置为应用程序的 Default.aspx 页。
* cookieless 设置为 UseDeviceProfile,以指定应用程序对所有支持 Cookie 的浏览器都使用 Cookie。如果不支持 Cookie 的浏览器访问该站点,窗体身份验证在 URL 上打包身份验证票。
* enableCrossAppRedirects 设置为 false,以指明窗体身份验证不支持自动处理在应用程序之间传递的查询字符串上的票证以及作为某个窗体 POST 的一部分传递的票证。授权配置在 IIS 中,对所有使用窗体身份验证的应用程序启用异步访问。UrlAuthorizationModule 类用于帮助确保只有经过身份验证的用户才能访问页。可以使用 authorization 元素配置 UrlAuthorizationModule,如以下示例所示。<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>使用该设置将拒绝所有未经过身份验证的用户访问应用程序中的任何页。如果未经身份验证的用户试图访问某页,窗体身份验证模块将该用户重定向到 forms 元素的 loginUrl 属性指定的登录页。窗体身份验证控制流图 1 显示窗体身份验证期间出现的事件顺序。图 1. 窗体身份验证控制流 * 用户请求应用程序的虚拟目录下的 Default.aspx 文件。因为 IIS 元数据库中启用了匿名访问,因此 IIS 允许该请求。ASP.NET 确认 authorization 元素包括 <deny users="?" /> 标记。
* 服务器查找一个身份验证 Cookie。如果找不到该身份验证 Cookie,则用户重定向到配置好的登录页 (Login.aspx),该页由 forms 元素的 LoginUrl 属性。用户通过该窗体提供和提交凭据。有关起始页的信息存放在使用 RETURNURL 作为密钥的查询字符串中。服务器 HTTP 应答如下所示: 302 Found Location:
http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx * 浏览器请求 Login.aspx 页,并在查询字符串中包括 RETURNURL 参数。
* 服务器返回登录页以及 200 OK HTTP 状态代码。
* 用户在登录页输入凭据,并将该页(包括来自查询字符串的 RETURNURL 参数)发送回服务器。
* 服务器根据某个存储(如 SQL Server 数据库或 Active Directory 用户存储)验证用户凭据。登录页中的代码创建一个包含为该会话设置的窗体身份验证票的 Cookie。 在 ASP.NET 2.0 中,可以通过成员身份系统执行对用户凭据的验证。Membership 类为此提供了 ValidateUser 方法,如下所示: if (Membership.ValidateUser(userName.Text, password.Text))
{
if (Request.QueryString["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
}
else
{
FormsAuthentication.SetAuthCookie(userName.Text, false);
}
}
else
{
Response.Write("Invalid UserID and Password");
} 注 使用 Login Web 服务器控件时,它自动为您执行以下步骤。下文使用了前面提供的代码。
* 对于经过身份验证的用户,服务器将浏览器重定向到查询字符串中的 RETURNURL 参数指定的原始 URL。服务器 HTTP 应答如下所示: 302 Found Location:
http://localhost/TestSample/default.aspx * 重定向之后,浏览器再次请求 Default.aspx 页。该请求包括身份验证 Cookie。
*
FormsAuthenticationModule 类检测窗体身份验证 Cookie 并对用户进行身份验证。身份验证成功后,FormsAuthenticationModule 类使用有关经过身份验证的用户的信息填充当前的 User 属性(由 HttpContext 对象公开)。
* 由于服务器已经验证了身份验证 Cookie,因此它允许访问并返回 Default.aspx 页。FormsAuthenticationModuleASP.NET 2.0 在计算机级 Web.config 文件中定义了一组 HTTP 模块,包括大量身份验证模块,如下所示:<httpModules>
...
<add name="WindowsAuthentication"
type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication"
type="System.Web.Security.PassportAuthenticationModule" />
...
</httpModules>每个请求只能使用一个身份验证模块。所使用的身份验证模块取决于 authentication 元素(通常位于应用程序的虚拟目录中的 Web.config 文件中)指定了哪种身份验证模式。当 Web.config 文件中包含以下元素时,激活 FormsAuthenticationModule 类。<authentication mode="Forms" />FormsAuthenticationModule 类构造一个 GenericPrincipal 对象并将其存储在 HTTP 上下文中。GenericPrincipal 对象保存对一个 FormsIdentity 实例的引用,该实例代表当前经过身份验证的用户。应该允许窗体身份验证为您管理这些任务。如果应用程序有特定要求(例如,将 User 属性设置为一个实现 IPrincipal 接口的自定义类),则该应用程序应该处理 PostAuthenticate 事件。FormsAuthenticationModule 验证了窗体身份验证 Cookie 并创建了 GenericPrincipal 和 FormsIdentity 对象之后,会发生 PostAuthenticate 事件。在该代码中,可以构造一个包装 FormsIdentity 对象的自定义 IPrincipal 对象,然后将它存储在 HttpContext. User 属性中。注 如果执行了这一操作,还需要设置 Thread.CurrentPrincipal 属性上的 IPrincipal 引用,以确保 HttpContext 对象和该线程指向相同的身份验证信息。窗体身份验证 Cookie调用 FormsAuthentication.SetAuthCookie 或FormsAuthentication.RedirectFromLoginPage 方法时,FormsAuthentication 类自动创建身份验证 Cookie。典型的窗体身份验证 Cookie 中包括以下属性: * Name。该属性指定 Cookie 的名称。
* Value。该属性指定 Cookie 的值。 在典型的窗体身份验证 Cookie 中,该值包含一个经过加密和签名的 FormsAuthenticationTicket 对象的字符串表示形式。该 Cookie 包含以下属性:
* Expires。该属性指定 Cookie 的到期日期和时间。仅当代码指示应该颁发一个持久的窗体身份验证 Cookie,窗体身份验证才设置该值。
* Domain。该属性指定与 Cookie 关联的域。默认值为 null。
o HasKeys。该属性指出 Cookie 是否有子项。
* HttpOnly。该属性指定是否可以通过客户端脚本访问该 Cookie。在 ASP.NET 2.0 中,该值始终设置为 true。Internet Explorer 6 Service Pack 1 支持该 Cookie 属性,从而防止客户端脚本从 document.cookie 属性访问该 Cookie。如果尝试从客户端脚本访问该 Cookie,则返回一个空字符串。无论何时用户浏览到当前域中的 Web 站点,该 Cookie 仍然发送至服务器。 注 不支持 HttpOnly Cookie 属性的 Web 浏览器要么忽略该 Cookie,要么忽略该属性,这意味着会话仍然容易受到跨站点脚本的攻击。
* Path。该属性指定 Cookie 的虚拟路径。默认值为"/",代表根目录。
* Secure。该属性指出 Cookie 是否应该仅通过 HTTPS 连接传输。Secure 属性应设置为 true,以便该 Cookie 可以受 SSL 加密的保护。
* Version。该属性指定 Cookie 的版本号。创建身份验证 Cookie通过 FormsAuthentication 类创建身份验证 Cookie,如下所示。用户经过验证后,FormsAuthentication 类在内部创建一个 FormsAuthenticationTicket 对象,方法是指定 Cookie 名、Cookie 版本、目录路径、Cookie 颁发日期;Cookie 到期日期、是否应该保留 Cookie,以及用户定义的数据(可选)。FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
"userName",
DateTime.Now,
DateTime.Now.AddMinutes(30), // value of time out property
false, // Value of IsPersistent property
String.Empty,
FormsAuthentication.FormsCookiePath);
接下来,如果 forms 元素的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。string encryptedTicket = FormsAuthentication.Encrypt(ticket);
以下文本显示了当 protection 属性设置为 All 时使用的过程: * 创建序列化窗体身份验证票。创建票证的字节数组表示形式。
* 对窗体身份验证票进行签名。字节数组的消息身份验证代码 (MAC) 的值,由使用 machineKey 元素的 validation 和 validationKey 属性指定的算法和密钥进行计算。默认情况下,使用 SHA1 算法。
* 对窗体身份验证票进行加密。已经创建的第二个字节数组使用 FormsAuthentication 类的 Encrypt 方法进行加密。该 Encrypt 方法在内部使用由 machineKey 元素上的 decryption 和 decryptionKey 属性指定的算法和密钥。ASP.NET 1.1 版在默认情况下使用 3DES 算法。ASP.NET 2.0 版在默认情况下使用 Rinjdael (AES) 算法。
* 根据需要创建 HTTP Cooki e 或查询字符串。然后,如果窗体身份验证针对 cookieless 身份验证进行了配置,则加密的身份验证票添加到 HttpCookie 对象。使用以下代码创建该 Cookie 对象: HttpCookie authCookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
encryptedTicket); * 将窗体身份验证 Cookie 设置为安全的。如果窗体身份验证票配置为使用 SSL,则 HttpCookie. Secure 属性设置为 true。这表明浏览器仅通过 HTTPS 连接发送 Cookie。 authCookie.Secure = true; * 设置 HttpOnly 位。在 ASP.NET 2.0 中,始终设置该位。
* 设置适当的 Cookie 属性。如果需要,设置 Cookie 的 path、domain 和 expires 属性。
* 将 Cookie 添加到 Cookie 集合。将身份验证 Cookie 添加到要返回给客户端浏览器的 Cookie 集合。 Response.Cookies.Add(authCookie);每次在身份验证之后接收一个后续请求时,FormsAuthenticationModule 类都会从身份验证 Cookie 中检索身份验证票,对其进行解密,计算哈希值,并比较该 MAC 值,以帮助确保该 Cookie 未被篡改。最后,验证该窗体身份验证票中包含的到期时间。注 ASP.NET 并不依赖于 Cookie 的到期日期,因为该时间很容易伪造。角色授权在 ASP.NET 2.0 中,角色授权已经得到简化。对用户进行身份验证或者将角色细节添加到身份验证 Cookie 时,不再需要检索角色信息。.NET Framework 2.0 包括一个角色管理 API,它使您能够创建和删除角色,将用户添加到角色以及从角色删除用户。该角色管理 API 将其数据存储在一个基础数据存储中,它通过针对该数据存储的适当角色提供程序访问该存储。以下角色提供程序为 .NET Framework 2.0 附带,可以与窗体身份验证一起使用: * SQL Server。它是默认的提供程序,将角色信息存储在 SQL Server 数据库。
* 授权管理器 (AzMan)。该提供程序使用 XML 文件、Active Directory 或 Active Directory 应用程序模式 (ADAM) 中的一个 AzMan 策略存储作为其角色存储。它通常用于 Intranet 或 Extranet 方案中,其中 Windows 身份验证和 Active Directory 用于进行身份验证。有关如何使用角色管理 API 的详细信息,请参阅 How To: Use Role Manager in ASP.NET 2.0。
返回页首
Cookieless 窗体身份验证ASP.NET 2.0 支持 cookieless 窗体身份验证。该功能由 forms 元素的 cookieless 属性控制。该属性可以设置为以下四个值之一: * UseCookies。该值强制 FormsAuthenticationModule 类使用 Cookie 传输身份验证票。
* UseUri。该值指示 FormsAuthenticationModule 类重写 URL 来传输身份验证票。
* UseDeviceProfile。该值指示 FormsAuthenticationModule 类查看浏览器功能。如果浏览器支持 Cookie,则使用 Cookie;否则,重写 URL。
* AutoDetect。该值通过一个动态检测机制指示 FormsAuthenticationModule 类检测浏览器是否支持 Cookie。如果检测逻辑表明不支持 Cookie,则重写 URL。如果应用程序配置为使用 cookieless 窗体身份验证,并且正在使用 FormsAuthentication.RedirectFromLoginPage 方法,则 FormsAuthenticationModule 类自动设置 URL 中的窗体身份验证票。以下代码示例显示了典型 URL 在重写后的外观:http://localhost/CookielessFormsAuthTest/(F(-k9DcsrIY4CAW81Rbju8KRnJ5o_gOQe0I1E_jNJLYm74izyOJK8GWdfoebgePJTEws0Pci7fHgTOUFTJe9jvgA2))/Test.aspx括号中的 URL 部分包含 Cookie 通常将包含的数据。该数据在请求处理过程中由 ASP.NET 删除。该步骤由 ASP.NET ISAPI 筛选器执行,而不是在 HttpModule 类中执行。如果从一个 .aspx 页读取 Request.Path 属性,您在 URL 中不会看到任何额外的信息。如果重定向请求,URL 将自动重写。注 难以保证 URL 中包含的身份验证票的安全。当安全性极为重要时,您应该使用 Cookie 存储身份验证票。
返回页首
成员身份和登录控件ASP.NET 2.0 引入了成员身份功能和一组登录 Web 服务器控件,它们简化了使用窗体身份验证的应用程序的实现。成员身份为应用程序用户提供凭据存储和管理。它还提供一个成员身份 API,可以在使用窗体身份验证时简化用户凭据的验证任务。该成员身份功能构建于提供程序模型之上。该模型允许实现和配置指向不同用户存储的不同提供程序。ASP.NET 2.0 包括以下成员关系提供程序: * Active Directory 成员关系提供程序。该提供程序使用 Active Directory 或 Active Directory 应用程序模式 (ADAM) 用户存储。
* SQL Server 成员关系提供程序。该提供程序使用 SQL Server 用户存储。还可以添加对自定义用户存储的支持。例如,可以添加对其他轻量级目录访问协议 (LDAP) 目录或其他现有公共标识存储的支持。为此,创建一个从 MembershipProvider 抽象基类继承的自定义提供程序。ASP.NET 登录控件自动使用成员身份和窗体身份验证,并封装提示用户输入凭据,验证用户,恢复或替换密码等所需的逻辑。实际上,ASP.NET 登录控件在窗体身份验证和成员身份上提供一个抽象层,并且取代了您使用窗体身份验证时通常必须进行的大多数或全部工作。有关使用成员身份功能和登录控件的详细信息,请参阅 How To: Use Membership in ASP.NET 2.0。
返回页首
Web 场方案在 Web 场中,无法确保哪个服务器将处理连续请求。如果用户在一台服务器上经过身份验证,但下一个请求在另一台服务器上进行,则身份验证票将导致验证失败并请求用户重新进行身份验证。machineKey 元素中的 validationKey 和 decryptionKey 属性用于对窗体身份验证票进行哈希操作和加密。这些属性的默认值为 AutoGenerate.IsolateApps。这些密钥是针对每个应用程序自动生成的,在每台服务器上都不同。因此,在一台计算机上加密的身份验证票无法在 Web 场中的另一台计算机或者同一台 Web 服务器上的另一个应用程序中进行解密和验证。为了解决该问题, Web 场中所有计算机上的 validationKey 和 decryptionKey 值都必须相同。有关配置 machineKey 元素的详细信息,请参阅 How To: Configure MachineKey in ASP.NET 2.0。