分享
 
 
 

ASP.NETWhidbey中实现Provider

王朝asp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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

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

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

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

<membership defaultProvider="AspNetAccessProvider" userIsOnlineTimeWindow="15" >

<providers>

<add name="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="Stores and retrieves membership data from the local Microsoft SQL Server database"

/>

<add name="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="Stores and retrieves membership data from the local Microsoft Access database file"

/>

</providers>

</membership>

关于这段配置文件的更详细解说,可以参考《A First Look at ASP.NET v. 2.0》。

可以看出,Whidbey默认使用SqlMembershipProvider或者AccessMembershipProvider来进行用户验证和管理。这两个Provider实现了IProvider和IMembershipProvider接口,实际上这两个接口也是每个MembershipProvider所必需的,其中IProvider负责Provider的初始化,而IMembershipProvider则实现MembershipProvider的主要功能。它们的定义如下:

namespace System.Configuration.Provider

{

public interface IProvider

{

public string Name { get; }

public void Initialize(string name,

System.Collections.Specialized.NameValueCollection config);

}

}

namespace System.Web.Security

{

public interface IMembershipProvider

{

public bool ChangePassword(string name, string oldPwd, string newPwd);

public bool ChangePasswordQuestionAndAnswer(string name, string password,

string newPwdQuestion, string newPwdAnswer);

public System.Web.Security.MembershipUser CreateUser(string username, string password, string email,out System.Web.Security.MembershipCreateStatus status);

public bool DeleteUser(string name);

public System.Web.Security.MembershipUserCollection GetAllUsers();

public int GetNumberOfUsersOnline();

public string GetPassword(string name, string answer);

public System.Web.Security.MembershipUser GetUser(string name,bool userIsOnline);

public string GetUserNameByEmail(string email);

public string ResetPassword(string name, string answer);

public void UpdateUser(System.Web.Security.MembershipUser user);

public bool ValidateUser(string name, string password);

public string ApplicationName {get; set;}

public bool EnablePasswordReset { get;}

public bool EnablePasswordRetrieval { get;}

public bool RequiresQuestionAndAnswer { get;}

}

}

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

public class MyMembershipProvider : IProvider, IMembershipProvider

{

……

}

验证功能是必需的:

public bool ValidateUser (string name, string password)

{

string connectStr = ConfigurationSettings.ConnectionStrings["PortalData"];

SqlConnection myConnection = new SqlConnection (connectStr);

SqlCommand myCommand = new SqlCommand ("UserLogin", myConnection);

myCommand.CommandType = CommandType.StoredProcedure;

// Add Parameters to SPROC

SqlParameter parameterEmail = new SqlParameter ("@Email", SqlDbType.NVarChar, 100);

parameterEmail.Value = name;

myCommand.Parameters.Add (parameterEmail);

SqlParameter parameterPassword = new SqlParameter ("@Password", SqlDbType.NVarChar, 20);

parameterPassword.Value = password;

myCommand.Parameters.Add (parameterPassword);

SqlParameter parameterUserName = new SqlParameter ("@UserName", SqlDbType.NVarChar, 100);

parameterUserName.Direction = ParameterDirection.Output;

myCommand.Parameters.Add (parameterUserName);

// Open the database connection and execute the command

myConnection.Open ();

myCommand.ExecuteNonQuery ();

myConnection.Close ();

if ((parameterUserName.Value != null) && (parameterUserName.Value != System.DBNull.Value))

return true;

return false;

}

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

<connectionStrings>

<add name="BugDepotData" connectionString="Data Source=(local);Trusted_Connection=true;Database=Portal" />

</connectionStrings>

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

<membership>

<providers>

<add name="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验证,试试是不是已经能够成功登陆了?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有