我希望继承SqlMembershipProvider,设置成员资格设置以使用派生的自定义提供程序,并禁止任何人调用Membership.CreateUser()和Membership.DeleteUser()。
我有一个外部应用程序,它将提供一个用户添加/删除机制,它比内置的成员功能做得更多。
我能够覆盖CreateUser()和DeleteUser()来在调用Membership.CreateUser()或Membership.DeleteUser()时抛出NotSupportedExceptions。
然后,我尝试了两个自定义方法,让每个方法都调用base.CreateUser()和base.DeleteUser(),但都得到了空异常。我认为问题是基本方法只能通过被覆盖的函数访问,而不是自定义函数。
我的代码如下:
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();
}
}谢谢。
发布于 2011-04-03 16:57:47
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发布于 2011-03-03 06:30:34
您需要在自己的Initialize方法中初始化基类:
public override void Initialize(string name, NameValueCollection config)
{
[...] // your own initialization stuff
base.Initialize(name, config);
}发布于 2011-04-03 16:44:43
这可能是因为您没有在abatishchev提到的system.web\membership配置节点的Providers部分中指定它。从here下载ASP.Net提供者模型的源代码。从SqlMembershipProvider示例类继承,看看SqlMembershipProvider内部是如何工作的。由于PasswordStrengthRegularExpression属性未初始化,因此引发了NullReference异常。包含您的提供程序是唯一的解决方案,因为如果您不这样做,CreateUser方法仍然会失败,因为您的自定义提供程序不在“批准的”提供程序列表中。当然,您可以通过在调用自定义成员资格提供程序的构造函数中调用base.Initialize方法时指定一个认可的提供程序名称来绕过这一点,但我不认为这是正确的。此外,您不能在配置文件中包含您的提供程序,因为您的提供程序将被初始化两次,这将抛出异常。再次检查源代码。
https://stackoverflow.com/questions/5174097
复制相似问题