![](/img/trans.png)
[英]Transaction deadlocked SqlMembershipProvider.CreateUser()
[英]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.