首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承SqlMembershipProvider并禁用CreateUser()和DeleteUser()

继承SqlMembershipProvider并禁用CreateUser()和DeleteUser()
EN

Stack Overflow用户
提问于 2011-03-03 06:01:58
回答 3查看 1.6K关注 0票数 1

我希望继承SqlMembershipProvider,设置成员资格设置以使用派生的自定义提供程序,并禁止任何人调用Membership.CreateUser()Membership.DeleteUser()

我有一个外部应用程序,它将提供一个用户添加/删除机制,它比内置的成员功能做得更多。

我能够覆盖CreateUser()和DeleteUser()来在调用Membership.CreateUser()或Membership.DeleteUser()时抛出NotSupportedExceptions

然后,我尝试了两个自定义方法,让每个方法都调用base.CreateUser()base.DeleteUser(),但都得到了空异常。我认为问题是基本方法只能通过被覆盖的函数访问,而不是自定义函数。

我的代码如下:

代码语言:javascript
复制
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();
    }
}

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-04-03 16:57:47

Web.config:

代码语言:javascript
复制
<membership defaultProvider="Custom">
    <providers>
        <clear /> <!-- remove the built-in -->
        <add name="Custom" ... /> <!-- your own only -->
    </providers>
</membership>

代码:

代码语言:javascript
复制
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
    }
}

用法:

代码语言:javascript
复制
Membership.CreateUser(); // will call Membeship.Provider.Create(), i.e. - yours
票数 1
EN

Stack Overflow用户

发布于 2011-03-03 06:30:34

您需要在自己的Initialize方法中初始化基类:

代码语言:javascript
复制
public override void Initialize(string name, NameValueCollection config)
{
    [...] // your own initialization stuff

    base.Initialize(name, config);
}
票数 0
EN

Stack Overflow用户

发布于 2011-04-03 16:44:43

这可能是因为您没有在abatishchev提到的system.web\membership配置节点的Providers部分中指定它。从here下载ASP.Net提供者模型的源代码。从SqlMembershipProvider示例类继承,看看SqlMembershipProvider内部是如何工作的。由于PasswordStrengthRegularExpression属性未初始化,因此引发了NullReference异常。包含您的提供程序是唯一的解决方案,因为如果您不这样做,CreateUser方法仍然会失败,因为您的自定义提供程序不在“批准的”提供程序列表中。当然,您可以通过在调用自定义成员资格提供程序的构造函数中调用base.Initialize方法时指定一个认可的提供程序名称来绕过这一点,但我不认为这是正确的。此外,您不能在配置文件中包含您的提供程序,因为您的提供程序将被初始化两次,这将抛出异常。再次检查源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5174097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档