程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET Whidbey中實現Provider

ASP.NET Whidbey中實現Provider

編輯:.NET實例教程

     “Whidbey”是微軟工具套件的下一個版本。按照微軟的計劃,它將會在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= 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驗證,試試是不是已經能夠成功登陸了?
  
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved