# Login.aspx 网页

说明： 页面基于数据库鉴别顾客的用户名和口令。用户任何时间通过点击在(_Header.ascx)，里的"Sign In"按钮都可以，但是如果用户只是浏览Commerce站点的商品或者只是向购物车中添加商品的话，是不需要登录的。如果用户没有登录，通过使用临时用户ID，可以创建购物车。

用户必须登录才能完成程序限定的任务。例如，如果用户想结帐离开但是还没有登录，那么结帐页面Checkout.aspx)显示登录页面并要求用户输入用户名与口令。

在用户登录后，结帐页面从临时购物车把商品转移到用户的永久购物车，登录页面将转向到到初始页面。

基于表单的安全说明： Login.aspx 提供给客户基于窗体的登录页面，通过这一页面他们在Commerce Starter Kit application中鉴别他们的身份。 Commerce Starter Kit 鉴别使用ASP.NET基于窗体的鉴别方法。当用户身份已经被鉴别后，为当前用户的当前session创建一个保持鉴别信息的cookie。

通过在应用程序的Web.config文件中加入一个入口，可以进行基于窗体的身份鉴别。如下所示：

<system.web>
<authentication mode="Forms">
<forms name="CommerceAuth" loginUrl="login.aspx" protection="All" path="/"></forms>
</authentication>
</system.web>

Loginurl属性指定一个登录页面，无论何时，如果一个用户试图访问一个不允许匿名用户访问的应用程序资源，应用程序则会定向到该页面。

例如: Commerce Starter Kit application内,我们构建3个网页: 订单历史页面(OrderList.aspx)，订单细节页面(CheckOut.aspx)，订单校验(CheckOut.aspx)。明确限定鉴别身份的用户进入。为了创建这些约束，为Web.config的每个受约束的网页提供一个入口，正如下面的程序所示: (问号”?”代表”匿名,未鉴别的用户)。 :

<location path="OrderList.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>

<location path="OrderDetails.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>

<location path="CheckOut.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>

当用户想进入这些网页时，ASP.NET基于窗体的安全系统将自动的将他们转向登录页面，并继续阻止其进入受限制的网页,直到他们成功的按照Commerce Starter Kit application的要求验证了用户名与口令为止。

这种鉴别机制的主要特征就是完全取决于开发者。是你，而不是ASP.NET决定登录界面的外观。例如， Starter Kit里的登录页面已经创建成与其它应用程序具有相同的外观。作为应用程序的开发者，是你而不是ASP.NET决定什么样的存储方式存储用户名和口令。在Starter Kit例子中，我们将用户名与口令保存在customersDB表中.

基于窗体鉴别的优点:: 这里所用到的ASP.NET鉴别机制与IIS和ASP支持的HTTP Basid/Digest鉴别机制相比更优越。因为它允许开发者：:

1. 自定义登录的用户界面. HTTP Basic/Digest 鉴别schemes自动在浏览器上显示不太美观的POPUP对话框，不能提供应用程序的嵌入，用户为导向的帮助，以及注册页面的链接.通过使用ASP.NET基于窗体的鉴别解决方案，可以在定制鉴别页面的外观上拥有很大的灵活性。
2. 使用任何一种后台信任存储方式验证用户名和密码，IIS与ASP的HTTP Basic/Digest鉴别机制仅支持基于NT SAM或Active Directory DS(意思是你必须为每个用户提供一个NT帐户)的用户名/口令鉴别。使用基于窗体的鉴别方案的ASP.NET能在数据库,XML文档， Legacy mainframe系统,NTSAM或者Active Directory DS中存储用户名/口令

说明： : Basic/Diges鉴别仍然得到ASP.NET的全面支持。 Commerce Starter Kit的基于窗体的鉴别方案，与Passport鉴别支持一样，目前在ASP.NET中都还只是额外的可选的鉴别方案。

使用说明： The 登录页面逻辑完全封装到LoginBtn_Click事件句柄中，该句柄当用户点击客户端的"Sign In Now"图像ImageButton按钮时在服务器端调用。

LoginBtn_Click事件句柄可以通过客户在Email和Password文本服务器控件中填入的值来鉴别用户身份。这种鉴别检验使用ASPNET.StarterKit.Commerce.CustomersDB类的Login()方法来实现。此方法内部调用CustomerLogin 存储过程验证电子邮件与口令是否与存储在Commerce数据库中的数据匹配

如果登录成功(也就是说:电子邮件与口令值与存在数据库中数据匹配)， LoginBtn_Click事件句柄执行下面三个重要的步骤。

- 移动存在浏览器临时购物车的购买项到新的唯一CustomerID为主键的永久购物车里。这样可以确保如果客户浏览器失效的时候购物车内项目不会丢失。也可以使客户挂起他们的购物进程—关闭浏览器或者关机—然后几天后或者换到另一台计算机上继续购物。
- 把一个定制的包含新登录用户全名的"ASPNETCommerce_FullName"Cookie发送到客户端。 Commerce Starter Kit application的主页--Default.aspx ，在用户下一次访问该主页时,搜索cookie 随机产生一条个性化的欢迎的消息。.
- 调用FormsAuthentication类的RedirectFromLoginPage() 静态方法， 这种内置的ASP.NET类执行下面的两步：

1. 1. 这种内置的ASP.NET方法发出加密的cookie鉴别信息给浏览器客户端，以确认客户经鉴别的用户名。 Commerce Starter Kit里, 我们使用CustomersDB.Login方法返回的CustomerID作为客户端的用户名验证(它将作为第一个参数传给"RedirectFromLoginPage"方法.)在随后对应用程序的请求中，我们能通过内置的ASP.NET页面的User.Identity.Name 属性来获取CustomerID的用户标识。.
2. 2. 当向客户端发送cookie鉴别信息后，“RedirectFromLoginPage”方法将使浏览器重新定向到进入登录页面前用户想要访问的初始页面。

如果登录未成功(就是说 : 未知的电子邮件名或口令与存在商品客户数据库中的内容不匹配)， LoginBtn_Click事件句柄将发出"Login Failed"出错信息并重新显示页面。

确认用户输出: 登录页面要求用户输入姓名与邮件地址。 如果查看LoginBtn_Click事件句柄的源代码，会发现没有输入确认代码.使用内置的ASP.NETvalidation控件，可清楚的定义任何输入控件的确认约束。.

ASP.NET用内置的validation控件来处理确认要求: RequiredField, CompareValidator， RegularExpressionValidator，RangeValidator， 和 CustomValidator控件。 validation控件体系是可扩展的，以便其他特定环境控件(ZIP code validators, country code validators等)也可以由第三方来开发。

可以把validation控件放在页面的任何位置并使用validator控件的ControlToValidate属性链接到目标输入控件。 你可以为Text属性随意指定一段文本，当输入数据没有经过确认验证时，显示该文本。如果有必要的话，可以为一个控件设置多个validation控件共同验证该控件信息（例如，某个域是必须填写的，而且要符合某项指定的要求）。

如果页面在支持EcmaScript 1.2和动态HTML (DHTML) 4.0的浏览器中显示， validation控件能完成客户端的确认,提供了即时的回馈给用户。 Validator控件也能用服务器端代码来完成校验，因而如果浏览器不支持DHTML或者如果客户端的脚本失效,确认校验仍可执行。不必作代码的改动就可以实现上面的两种方式—在基本浏览器以及支持DHTML的浏览器上用于处理校验所需要的全部逻辑都建立在在控件内部了。

如果使用validation控件， 服务器端代码通过检验确认控件的IsValid属性确定是否用户的输入通过了校验，此外,可以检验网页的IsValid属性； 该属性是页面中全部validation控件的IsValid属性的集合。如果某一validation控件检验发生失败,页面的IsValid属性将设置为false。

上面的内容就是登录页面的工作原理，只有页面内的所有控件都有效，我们才可以继续并注册用户。如果其中一个输入域无效，页面只是再次显示。同时，validation控件负责自动向用户显示适当的出错信息。