在Whidbey中实现Provider

    技术2022-05-11  104

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

     

    但是在PDC Preview版本的Whidbey中,这个配置工具的功能还不是很完善。从我使用的情况来看,它目前还只能创建和连接自己的Demo用的Access数据库,不能连接SQL Server数据库进行扩展。因此,为了能够连接SQL Server,我们必须提供我们自己的Providers。这里以连接IBuySpyPortal数据库为例来说明如何实现一个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实现了IProviderIMembershipProvider接口,实际上这两个接口也是每个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控件,并指定它的MembershipPropertyMyMembershipProvider(或者也可以设置membershipdefaultProvider属性为MyMembershipProvider),打开Forms验证,试试是不是已经能够成功登陆了?J


    最新回复(0)