ASP.NET Whidbey中完成Provider
發(fā)表時(shí)間:2024-06-09 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Asp.Net 2.0(codename Whidbey)通過(guò)Provider模式為用戶驗(yàn)證、角色管理等方面提供了非常強(qiáng)大易用的框架模型。Whidbey中提供了一個(gè)Asp.Net configuration工具,通過(guò)它可以非常容易地配置用戶信息數(shù)據(jù)庫(kù),管理角色等等,再與新加入的Security控件...
Asp.Net 2.0(codename Whidbey)通過(guò)Provider模式為用戶驗(yàn)證、角色管理等方面提供了非常強(qiáng)大易用的框架模型。Whidbey中提供了一個(gè)Asp.Net configuration工具,通過(guò)它可以非常容易地配置用戶信息數(shù)據(jù)庫(kù),管理角色等等,再與新加入的Security控件配合,幾乎不用寫(xiě)什么代碼就能夠?qū)崿F(xiàn)用戶驗(yàn)證和角色管理功能。關(guān)于這些控件和配置工具的具體使用,可以參考這篇文章:使用更精簡(jiǎn)的代碼保證 ASP.NET 應(yīng)用程序的安全
但是在PDC Preview版本的Whidbey中,這個(gè)配置工具的功能還不是很完善。從我使用的情況來(lái)看,它目前還只能創(chuàng)建和連接自己的Demo用的Access數(shù)據(jù)庫(kù),不能連接SQL Server數(shù)據(jù)庫(kù)進(jìn)行擴(kuò)展。因此,為了能夠連接SQL Server,我們必須提供我們自己的Providers。這里以連接IBuySpy的Portal數(shù)據(jù)庫(kù)為例來(lái)說(shuō)明如何實(shí)現(xiàn)一個(gè)Membership Provider。
為了搞清楚如何實(shí)現(xiàn)我們自己的Membership Provider,有必要先看看Whidbey默認(rèn)使用的Membership Provider是如何做的。在machine.config配置文件中,Whidbey使用類(lèi)似下面這樣的配置實(shí)現(xiàn):
<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>
[page_break]
可以看出,Whidbey默認(rèn)使用SqlMembershipProvider或者AccessMembershipProvider來(lái)進(jìn)行用戶驗(yàn)證和管理。這兩個(gè)Provider實(shí)現(xiàn)了IProvider和IMembershipProvider接口,實(shí)際上這兩個(gè)接口也是每個(gè)MembershipProvider所必需的,其中IProvider負(fù)責(zé)Provider的初始化,而IMembershipProvider則實(shí)現(xiàn)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;}
}
}
現(xiàn)在可以動(dòng)手來(lái)實(shí)現(xiàn)我們自己的MembershipProvider了:
public class MyMembershipProvider : IProvider, IMembershipProvider
{
……
}
驗(yàn)證功能是必需的:
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;
}
現(xiàn)在在web.config中可以這樣配置connectionString了:
<connectionStrings>
<add name="BugDepotData" connectionString="Data Source=(local);Trusted_Connection=true;Database=Portal" />
</connectionStrings>
這樣,我們自己的一個(gè)簡(jiǎn)單的MembershipProvider就基本上完成了。接下來(lái)需要配置web.config,讓需要Provider服務(wù)的控件能夠認(rèn)識(shí)它:
<membership>
。紁roviders>
。糰dd name="MyMembershipProvider" type="MyMembershipProvider" appName="/" />
</providers>
</membership>
這段設(shè)置是參考machine.config而來(lái)的,其中type屬性的值是這樣的字符串:
<membership>
。紁roviders>
。糰dd name="MyMembershipProvider" type="MyMembershipProvider" appName="/" />
。/providers>
</membership>
由于我們的MyMembershipProvider放在/Code目錄下,并不是在單獨(dú)的Assembly中,因此只需要指出ProviderType就行了。
這樣,一個(gè)具有驗(yàn)證功能的Provider就完成了,現(xiàn)在可以在頁(yè)面上放一個(gè)新的Security控件,比如Login控件,并指定它的MembershipProperty為MyMembershipProvider(或者也可以設(shè)置membership的defaultProvider屬性為MyMembershipProvider),打開(kāi)Forms驗(yàn)證,試試是不是已經(jīng)能夠成功登陸了?