在ASP.NET2.0中为登陆控件编写一个定制的Membership Provider
在ASP.NET 2.0的VS 2005中,你使用Membership提供的登陆控件来快速地定制认证页面。这些控件可以在VS 2005的工具箱中找到,在其登陆的段下面包含了:Pointer, Login, LoginView, PasswordRecovery, LoginStatus, LoginName, CreateUserWizard, and ChangePassword。这些控件可以在System.Web.Security 命名空间里找到,而它作为.NET Framework Library的一部分。这篇文章会以登陆控件为焦点。
这篇文章涵盖了什么内容
这篇文章以使用一个定制的SQL Server membership 数据库的登陆控件为焦点。没有任何其他的控件会被讨论,没有基于web的Membership管理的功能会被涉及。为了功能性与简洁性的,这篇文章提供最低的需求来连接使用定制Membership Provider的登陆控件。你应该探索control和MembershipProvider类两者在Framework的关系来确定你的选择。
The Login Control and the Membership Provider
一个Membership Provider是登陆控件与Membership 数据库两者之间的提供者(关系密切)。如果Membership Provider是一个定制的Provider或者一个微软的Provider的话,而登陆控件并不关心。登陆控件知道哪个Provider去实例化基于web.config 文件里面的实体。这个定制的Provider行为像微软供应的Provider,因为它继承并且重置MembershipProvider类。
Membership Providers
一个登陆控件至少包含两个微软供应的Provider :活动目录和SQL Server。这两个Provider使用定制的数据模式。这对于一个认证模式还没有成立的新网站来说,是一个很大的进步,因为你能够通过这些类型的认证中的一个以及拥有设计与编程已经为你完成了大多数的功能。然而,如果你工作于一个存在的数据库结构,你能够容易地编写一个定制的Provider来获得这些同你的旧有的数据结构交流的新登陆控件。
当使用一个与登陆控件一起的定制的Provider所参与的步骤
这需要三步主要的需求来使用一个与登陆控件一起的定制的Provider
1.将登陆控件拖放在.aspx页面的上面(login.aspx)。
2.定制的Provider类需要继承MembershipProvider以及重置某些方法。
3.web.config文件需要修改来使用一个定制的Provider。
登陆控件怎样工作
登陆控件为一个用户电子邮件以及一个用户密码提供两个文本框,还有一个提交按钮(submit button)。首先用户提供信息和单击提交按钮,这时定制的Membership provider 类被调用来认证用户。首先用户已经被验证了,这时Context.User.Identity.IsAuthenticated属性设置为true。用户控件的DestinationPageURL属性告诉网站来指导用户验证是否成功。
登陆控件在System.Web.UI.WebControls命名空间作为Login类找到,而其作为Framework的一部分。这个类包含登陆控件的功能函数。功能函数的大多数处理可见的样式以及事件处理。
<asp:Login ID="Login1" runat="server" DestinationPageURL="support.aspx" ></asp:Login>
你不需要在Login.aspx.cs代码文件中书写任何代码。控件知道怎样调用全部工作的定制的provider,因为Provider在web.config被列出来。如果你想要第一时间在你的页面或者post back来改变控件的外观和感觉的话,你可以在code behind中操作属性,方法,以及事件。但同样,这是可选的。
对于这篇文章,login.aspx.cs code behind的页面是一个通过没有变化的Visual Studio提供的命令解释程序页面。
你需要提供的类
1、一个定制的类继承System.Web.Security.MembershipProvider。在这篇文章中,它将会被MyCustomMembershipProvider调用。这是一个定制的membership provider。
2、以上这个顶制类通过胶合(glue)一个类或者多个类到你的数据库。在这篇文章中,这些类被称为MyCustomUser和MyCustomUserProvider。这两个类可以很容易合并成一个单一的类。作为你,你可以确定一个选择来书写你自己Provider的实现。指示:如果你正在在为AD或者SQL Server提供的framework里面实现一个标准的Providers,你可以使用来自framework的MembershipUser类。
MyCustomMembershipProvider : MembershipProvider
这个类是由用来验证用户的电子邮件和用户的密码的登陆控件来调用的。这个类包含几个属性和方法,而这些方法使登陆控件和定制的Provider(继承MembershipProvider)两者之间变得紧密。你将会看见被提供的MyCustomMembershipProvider类但抛出"not implemented exceptions(还没有实现的异常)"。
这两个在MyCustomMembershipProvider中的重要的方法是Initialize和ValidateUser。除了web.config文件,Initialize(初始化)方法为定制的Provider设置属性的另外一个地方(方法)。ValidateUser方法作为登陆控件来验证用户和密码的主要功能函数。
public override bool ValidateUser(string strName, string strPassword)
{
//This is the custom function you need to write. It can do anything you want.
//The code below is just one example.
// strName is really an email address in this implementation
bool boolReturn = false;
// Here is your custom user object connecting to your custom membership database
MyUserProvider oUserProvider = new MyUserProvider();
MyUser oUser = oUserProvider.FindUser(strName);
if (oUser == null)
return boolReturn;
// Here is your custom validation of the user and password
boolReturn = oUser.ValidateUsersPasswordForLogon(strPassword);
return boolReturn;
}
ValidateUser方法采用两个参数,这些参数是用户的名称和密码。对于许多的web站点来说,名称将会是用户的电子邮件地址。这个方法靠验证的结果来返回true 或者 false。在这个方法里面的所有的代码很快提供给你。在上面的例子中,这些被提供的代码仅仅是一种可能性。
登陆控件的成功验证
对于上面成功验证,登陆控件会在DestinationPageURL属性中转向参考的页面,调用该页面hello.aspx。这个验证的用户现在在一个上下文的变量中,以及检索Context.User.Indentity属性。
登陆控件的失败验证
登陆控件包含许多属性、方法、和事件来管理控件的外观和感观,包括一回送,就第一次实例化页面。如果验证不成功的话,一个缺省的失败信息被提供以及会呈现给登陆控件。
Web.Config
web.config文件将会需要几个新的片段。为了将登陆控件与你定制的membership provider建立联系,你将会需要一个节叫做<membership>。你在这个节里面可以设置定制的provider的属性。你也可以由这个定制的provider类控制这些属性。对于这篇文章使用的web.config文件,假设登陆被验证后一些aspx文件应该被存取。以及一些文件应该常常有效。这两个类型的文件被安放在'support'和support unrestricted'使用<location>标签的目录里面。
<?xml version="1.0"?>
<configuration >
<appSettings>
<add key="ConnectionString" value="server=XXX;database=XXX;uid=XXX;password=XXX;"/>
</appSettings>
<system.web>
<compilation debug="true"/>
<authorization>
<allow users="*" />
</authorization>
<authentication mode="Forms">
<forms name=".ASPXAUTH"
loginUrl="~/support/Login.aspx"
protection="Validation"
timeout="999999"
/>
</authentication>
<membership defaultProvider="MyCustomMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<add name="MyCustomMembershipProvider"
type="PostPointSoftware.MyCustomMembershipProvider"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="true"
passwordFormat="Clear"
description="Stores and retrieves membership data from SQL Server"
decryptionKey="68d
validationKey="
4fff3e1aef13be438505b
6fd2b7702b46ff63fdc9ea
/>
</providers>
</membership>
</system.web>
<location path="images">
<system.web>
<compilation debug="true"/>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="support">
<system.web>
<compilation debug="true"/>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
<location path="support_unrestricted">
<system.web>
<compilation debug="true"/>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
</configuration>
需要Config.Web区段
1.授权:这个区段指定谁可以存取本地(目录)。
2.认证:这个区段指定该本地怎样被存取。在上面的例子中这个<authentication>区段对于整个站点以及使用~/support/login.aspx文件作为认证文件是被指定的。这是登陆控件的位置文件将会被使用。
3.Membership:这个区段绑定登陆控件到定制的Membership Provider。
为什么在所有的ASP.NET 2.0 Membership控件当中使用新的?
既然有一些编程工作来获得新的控件来与你的旧数据库结构交流,你可以问自己是否值得麻烦?这个答案显然是一个在几个讨论版面当中积极的辩论。
这个方法的好处是:
1.你可以编写定制的provider来提供你需要的少或者多。如果你仅仅想要登陆控件与你定制的membership database工作的话,你不必写许多的代码。在你的前期设计中,你将不得不更多思考来确定你仅仅覆盖你需要什么东西。
2.在ASP.NET 2.0,新的基于Membership管理功能的web将使用你定制的provider。因此你获得使用新控件与新的基于管理特性的web两者的能力。
3.假设Microsoft将超时增加这方面功能,你可以继续使用你原来的工作。
这个方法的缺点是:
1.对于你的web站点,新的登陆控件会比你需要的变得更多,更少,或者不同。大多数网站已经有这样的成员身份认证功能,所以只是重写获得成asp.net 2.0可能是一个不好的决定。
2.如果你拥有自己web站点管理或者为你的membership编程,写额外的代码来使用新的基于Membership 管理功能的web是不必要的。仅仅不要写那些片段。这很容易去分辨哪个片段滑过,因为对于基于管理的web来说所有需要的功能处理用户的集合,而登陆控件的功能处理单一的用户。
3.Microsoft可以放弃这些功能,这不相似但有可能的。
结论
ASP.NET 2.0提供新的登陆控件为你的web站点实现验证是一种简单的方法。开发一个定制的provider来与你自己的membership database互动是很容易的。
P.S.翻译文章的引用地址:http://www.15seconds.com/issue/050216.htm,本文翻译得不怎么好,不过大概意思都应该知道吧。希望能够反馈意见给我!Thx!
评论