簡體   English   中英

繼承SqlMembershipProvider並禁用CreateUser()和DeleteUser()

[英]Inherit SqlMembershipProvider and disable CreateUser() and DeleteUser()

我想繼承SqlMembershipProvider,將成員資格設置設置為使用派生的自定義提供程序,並禁止某人調用Membership.CreateUser()Membership.DeleteUser()

我有一個外部應用程序,該應用程序將提供用戶添加/刪除機制,其作用比內置成員資格要多。

當調用Membership.CreateUser()或Membership.DeleteUser()時,我能夠重寫CreateUser()和DeleteUser()引發NotSupportedExceptions

然后,我嘗試了2種自定義方法,並分別調用了base.CreateUser()base.DeleteUser()但得到了null異常。 我認為問題在於基本方法只能由重寫的函數訪問,而不能由自定義函數訪問。

我的代碼如下:

public class UserMembershipSQL : SqlMembershipProvider
{
    internal MembershipUser CreateUserCustom(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        //do stuff here -- not accessible by Membership.CreateUser

        //currently throws a null exception even though all parameters are set properly
        return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
    }

    internal bool DeleteUserCustom(string username, bool deleteAllRelatedData)
    {   
        //do stuff here -- not accessible by Membership.DeleteUser
        return base.DeleteUser(username, deleteAllRelatedData);
    }

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        throw new NotSupportedException();
    }

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        throw new NotSupportedException();
    }
}

謝謝。

Web.config:

<membership defaultProvider="Custom">
    <providers>
        <clear /> <!-- remove the built-in -->
        <add name="Custom" ... /> <!-- your own only -->
    </providers>
</membership>

碼:

public class UserMembershipSQL : SqlMembershipProvider
{
    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        // do your stuff, don't call base
    }

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        // do your stuff, don't call base
    }
}

用法:

Membership.CreateUser(); // will call Membeship.Provider.Create(), i.e. - yours

您需要使用自己的Initialize方法初始化基類:

public override void Initialize(string name, NameValueCollection config)
{
    [...] // your own initialization stuff

    base.Initialize(name, config);
}

這可能是因為您沒有在system.web \\ membership config節點的Providers部分中指定它,正如abatishchev所提到的那樣 此處下載ASP.Net Provider Model的源代碼。 從SqlMembershipProvider示例類繼承,並查看SqlMembershipProvider內部如何工作。 因為未初始化PasswordStrengthRegularExpression屬性,所以將引發NullReference異常。 包括提供程序是唯一的解決方案,因為如果您不這樣做,則CreateUser方法仍然會失敗,因為您的自定義提供程序不在“批准的”提供程序列表中。 當然,您可以在調用base.Initialize方法(例如,自定義成員資格提供程序的構造函數)時指定批准的提供程序名稱來繞過此操作,但我認為這是不正確的。 此外,您將無法在配置文件中包含您的提供程序,因為您的提供程序將被初始化兩次,這將引發異常。 再次,檢查源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM