Whidbey是微軟工具套件的下一個版本按照微軟的計劃它將會在年底推出
AspNet (codename Whidbey)通過Provider模式為用戶驗證角色管理等方面提供了非常強大易用的框架模型Whidbey中提供了一個AspNet configuration工具通過它可以非常容易地配置用戶信息數據庫管理角色等等再與新加入的Security控件配合幾乎不用寫什麼代碼就能夠實現用戶驗證和角色管理功能關於這些控件和配置工具的具體使用可以參考這篇文章使用更精簡的代碼保證 ASPNET 應用程序的安全
但是在PDC Preview版本的Whidbey中這個配置工具的功能還不是很完善從我使用的情況來看它目前還只能創建和連接自己的Demo用的Access數據庫不能連接SQL Server數據庫進行擴展因此為了能夠連接SQL Server我們必須提供我們自己的Providers這裡以連接IBuySpy的Portal數據庫為例來說明如何實現一個Membership Provider
為了搞清楚如何實現我們自己的Membership Provider有必要先看看Whidbey默認使用的Membership Provider是如何做的在nfig配置文件中Whidbey使用類似下面這樣的配置實現:
<membership defaultProvider=AspNetAccessProvider userIsOnlineTimeWindow= >
<providers>
<add name=AspNetSqlProvider
type=SystemWebSecuritySqlMembershipProvider SystemWeb Version= Culture=neutral PublicKeyToken=bfffdaa 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=SystemWebSecurityAccessMembershipProvider SystemWeb Version= Culture=neutral PublicKeyToken=bfffdaa
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 ASPNET v 》
可以看出Whidbey默認使用SqlMembershipProvider或者AccessMembershipProvider來進行用戶驗證和管理這兩個Provider實現了IProvider和IMembershipProvider接口實際上這兩個接口也是每個MembershipProvider所必需的其中IProvider負責Provider的初始化而IMembershipProvider則實現MembershipProvider的主要功能它們的定義如下
namespace SystemConfigurationProvider
{
public interface IProvider
{
public string Name { get; }
public void Initialize(string name
SystemCollectionsSpecializedNameValueCollection config);
}
}
namespace SystemWebSecurity
{
public interface IMembershipProvider
{
public bool ChangePassword(string name string oldPwd string newPwd);
public bool ChangePasswordQuestionAndAnswer(string name string password
string newPwdQuestion string newPwdAnswer);
public SystemWebSecurityMembershipUser CreateUser(string username string password string emailout SystemWebSecurityMembershipCreateStatus status);
public bool DeleteUser(string name);
public SystemWebSecurityMembershipUserCollection GetAllUsers();
public int GetNumberOfUsersOnline();
public string GetPassword(string name string answer);
public SystemWebSecurityMembershipUser GetUser(string namebool userIsOnline);
public string GetUserNameByEmail(string email);
public string ResetPassword(string name string answer);
public void UpdateUser(SystemWebSecurityMembershipUser 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 = ConfigurationSettingsConnectionStrings[PortalData];
SqlConnection myConnection = new SqlConnection (connectStr);
SqlCommand myCommand = new SqlCommand (UserLogin myConnection);
myCommandCommandType = CommandTypeStoredProcedure;
// Add Parameters to SPROC
SqlParameter parameterEmail = new SqlParameter (@Email SqlDbTypeNVarChar );
parameterEmailValue = name;
myCommandParametersAdd (parameterEmail);
SqlParameter parameterPassword = new SqlParameter (@Password SqlDbTypeNVarChar );
parameterPasswordValue = password;
myCommandParametersAdd (parameterPassword);
SqlParameter parameterUserName = new SqlParameter (@UserName SqlDbTypeNVarChar );
parameterUserNameDirection = ParameterDirectionOutput;
myCommandParametersAdd (parameterUserName);
// Open the database connection and execute the command
myConnectionOpen ();
myCommandExecuteNonQuery ();
myConnectionClose ();
if ((parameterUserNameValue != null) && (parameterUserNameValue != SystemDBNullValue))
return true;
return false;
}
現在在nfig中可以這樣配置connectionString了
<connectionStrings>
<add name=BugDepotData connectionString=Data Source=(local);Trusted_Connection=true;Database=Portal />
</connectionStrings>
這樣我們自己的一個簡單的MembershipProvider就基本上完成了接下來需要配置nfig讓需要Provider服務的控件能夠認識它
<membership>
<providers>
<add name=MyMembershipProvider type=MyMembershipProvider appName=/ />
</providers>
</membership>
這段設置是參考nfig而來的其中type屬性的值是這樣的字符串
type=ProviderType Assembly Version Culture PublicKeyToken
由於我們的MyMembershipProvider放在/Code目錄下並不是在單獨的Assembly中因此只需要指出ProviderType就行了
這樣一個具有驗證功能的Provider就完成了現在可以在頁面上放一個新的Security控件比如Login控件並指定它的MembershipProperty為MyMembershipProvider(或者也可以設置membership的defaultProvider屬性為MyMembershipProvider)打開Forms驗證試試是不是已經能夠成功登陸了?
From:http://tw.wingwit.com/Article/program/net/201311/13139.html