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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET Whidbey中实现Provider


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 69 ::
收藏到网摘: 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验证,试试是不是已经能够成功登陆了?