当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET Whidbey中实现Provider

ASP.NET
Script:WINDOWS Script 枚举运行中进程
使用Flex结合Webservice完成域名查询
VSTS Team System 总算装好了。
用于部署数据库的 数据库初始化工具 xzSQLDeploy Tools V1.0 (for SQLServer) f...
一个将阿拉伯数字转换成中文大写的最简单算法
SCRIPT:使用Windows Script 关闭和打开指定程序
Script:使用WINDOWS脚本访问WEB SERVICES
asp.net连接Access数据库
VB中IIS Application发布可能出现的问题
VB打包后的安装问题
Nhibernate的数据分页技术(续)
使用API函数复制文件,可显示进度。
VB打包技巧
VB.NET实现DirectSound9 (9) 实现示波器
VB.NET 实现DirectSound9 (10) 均衡器
[水晶报表部署系列之一]轻松搞定水晶报表9.2打包
DataGrid 中双向排序的一种办法
利用System.EventHandler来实现两个窗体间的事件调用
多线程应用程序中调用窗体的一点心得
Smart Client之旅一:用B/S方式运行Exe应用程序

ASP.NET Whidbey中实现Provider


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 96 ::
收藏到网摘: n/a

“Whidbey”是微软工具套件的下一个版本。按照微软的计划,它将会在2004年底推出。

Asp.Net2.0(codenameWhidbey)通过Provider模式为用户验证、角色管理等方面提供了非常强大易用的框架模型。Whidbey中提供了一个Asp.Netconfiguration工具,通过它可以非常容易地配置用户信息数据库,管理角色等等,再与新加入的Security控件配合,几乎不用写什么代码就能够实现用户验证和角色管理功能。关于这些控件和配置工具的具体使用,可以参考这篇文章:使用更精简的代码保证ASP.NET应用程序的安全

但是在PDCPreview版本的Whidbey中,这个配置工具的功能还不是很完善。从我使用的情况来看,它目前还只能创建和连接自己的Demo用的Access数据库,不能连接SQLServer数据库进行扩展。因此,为了能够连接SQLServer,我们必须提供我们自己的Providers。这里以连接IBuySpy的Portal数据库为例来说明如何实现一个MembershipProvider。

为了搞清楚如何实现我们自己的MembershipProvider,有必要先看看Whidbey默认使用的MembershipProvider是如何做的。在machine.config配置文件中,Whidbey使用类似下面这样的配置实现:

<membershipdefaultProvider="AspNetAccessProvider"userIsOnlineTimeWindow="15">
<providers>
<addname="AspNetSqlProvider"
 type="System.Web.Security.SqlMembershipProvider,System.Web,Version=1.2.3400.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
description="StoresandretrievesmembershipdatafromthelocalMicrosoftSQLServerdatabase"
/>

<addname="AspNetAccessProvider"
type="System.Web.Security.AccessMembershipProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="AccessFileName"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
description="StoresandretrievesmembershipdatafromthelocalMicrosoftAccessdatabasefile"
/>

</providers>
</membership>

关于这段配置文件的更详细解说,可以参考《AFirstLookatASP.NETv.2.0》。
可以看出,Whidbey默认使用SqlMembershipProvider或者AccessMembershipProvider来进行用户验证和管理。这两个Provider实现了IProvider和IMembershipProvider接口,实际上这两个接口也是每个MembershipProvider所必需的,其中IProvider负责Provider的初始化,而IMembershipProvider则实现MembershipProvider的主要功能。它们的定义如下:

namespaceSystem.Configuration.Provider
{
 publicinterfaceIProvider
 {
publicstringName{get;}
publicvoidInitialize(stringname,
System.Collections.Specialized.NameValueCollectionconfig);
 }
}

namespaceSystem.Web.Security
{
 publicinterfaceIMembershipProvider
 {
publicboolChangePassword(stringname,stringoldPwd,stringnewPwd);
publicboolChangePasswordQuestionAndAnswer(stringname,stringpassword,
stringnewPwdQuestion,stringnewPwdAnswer);
publicSystem.Web.Security.MembershipUserCreateUser(stringusername,stringpassword,stringemail,outSystem.Web.Security.MembershipCreateStatusstatus);
publicboolDeleteUser(stringname);
publicSystem.Web.Security.MembershipUserCollectionGetAllUsers();
publicintGetNumberOfUsersOnline();
publicstringGetPassword(stringname,stringanswer);
publicSystem.Web.Security.MembershipUserGetUser(stringname,booluserIsOnline);
publicstringGetUserNameByEmail(stringemail);
publicstringResetPassword(stringname,stringanswer);
publicvoidUpdateUser(System.Web.Security.MembershipUseruser);
publicboolValidateUser(stringname,stringpassword);
publicstringApplicationName{get;set;}
publicboolEnablePasswordReset{get;}
publicboolEnablePasswordRetrieval{get;}
publicboolRequiresQuestionAndAnswer{get;}
 }
}

现在可以动手来实现我们自己的MembershipProvider了:

publicclassMyMembershipProvider:IProvider,IMembershipProvider
{
 ……
}

验证功能是必需的:

publicboolValidateUser(stringname,stringpassword)
{
 stringconnectStr=ConfigurationSettings.ConnectionStrings["PortalData"];
 SqlConnectionmyConnection=newSqlConnection(connectStr);
 SqlCommandmyCommand=newSqlCommand("UserLogin",myConnection);
 myCommand.CommandType=CommandType.StoredProcedure;

 //AddParameterstoSPROC
 SqlParameterparameterEmail=newSqlParameter("@Email",SqlDbType.NVarChar,100);
 parameterEmail.Value=name;
 myCommand.Parameters.Add(parameterEmail);

 SqlParameterparameterPassword=newSqlParameter("@Password",SqlDbType.NVarChar,20);
 parameterPassword.Value=password;
 myCommand.Parameters.Add(parameterPassword);

 SqlParameterparameterUserName=newSqlParameter("@UserName",SqlDbType.NVarChar,100);
 parameterUserName.Direction=ParameterDirection.Output;
 myCommand.Parameters.Add(parameterUserName); 

 //Openthedatabaseconnectionandexecutethecommand
 myConnection.Open();
 myCommand.ExecuteNonQuery();
 myConnection.Close();
 if((parameterUserName.Value!=null)&&(parameterUserName.Value!=System.DBNull.Value))
returntrue;
returnfalse;
}

现在在web.config中可以这样配置connectionString了:

<connectionStrings>

<addname="BugDepotData"connectionString="DataSource=(local);Trusted_Connection=true;Database=Portal"/>

</connectionStrings>

这样,我们自己的一个简单的MembershipProvider就基本上完成了。接下来需要配置web.config,让需要Provider服务的控件能够认识它:

<membership>
 <providers>
<addname="MyMembershipProvider"type="MyMembershipProvider"appName="/"/>
 </providers>
</membership>

这段设置是参考machine.config而来的,其中type属性的值是这样的字符串:

type="ProviderType,Assembly,Version,Culture,PublicKeyToken"

由于我们的MyMembershipProvider放在/Code目录下,并不是在单独的Assembly中,因此只需要指出ProviderType就行了。

这样,一个具有验证功能的Provider就完成了,现在可以在页面上放一个新的Security控件,比如Login控件,并指定它的MembershipProperty为MyMembershipProvider(或者也可以设置membership的defaultProvider属性为MyMembershipProvider),打开Forms验证,试试是不是已经能够成功登陆了?