ASP.NET MVC3自定义成员资格提供程序 - 指定的成员资格提供程序名称无效。

3
我正在实现一个自定义的会员提供程序,一切看起来都很顺利,直到我创建了一个MembershipUser对象。此时,我收到错误消息:

指定的成员资格提供程序名称无效。参数名:providerName

在web.config文件中,成员资格密钥为:
<membership defaultProvider="MembersProvider">
  <providers>
    <clear/>
    <add name="MembersProvider" type="Members.Providers.MembersProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="DeviceDatabase" />
  </providers>
</membership>

从我的自定义用户类创建MembershipUser对象时:
    public static MembershipUser ToMembershipUser(User user)
    {
        MembershipUser member = new MembershipUser
            ("MembersProvider"
            , user.Name
            , user.Id
            , user.EmailAddress
            , user.PasswordQuestion
            , user.Comment
            , user.IsApproved
            , user.IsLockedOut
            , user.DateCreated
            , user.LastLoginDate ?? DateTime.MinValue
            , user.LastActivityDate ?? DateTime.MinValue
            , user.LastPasswordChangedDate ?? DateTime.MinValue
            , user.LastLockoutDate ?? DateTime.MinValue
            );

        return member;
    }

(我意识到我可能只需要从MembershipUser继承我的User类,但它已经是现有类层次结构的一部分。我真的认为这是我第一次遇到合法需要多重继承的情况!)

我认为new MembershipUser(...)提供程序名称参数应该与web.config中设置的匹配,但由于它们已经匹配,我不知道如何继续。

是否有一种方便的方法在代码中获取活动成员资格提供程序的名称?

我开始觉得使用内置的成员身份验证系统是过度的,而且带来的麻烦不值得。

编辑 不确定是否相关,但自定义成员身份验证提供程序类位于类库中,而不是主WAP项目中。

更新 以下是在VS2010命令窗口中显示的System.Web.Security.Membership.Provider对象的内容:

>eval System.Web.Security.Membership.Provider
{Members.Providers.MembersProvider}
    [Members.Providers.MembersProvider]: {Members.Providers.MembersProvider}
    base {System.Configuration.Provider.ProviderBase}: {Members.Providers.MembersProvider}
    ApplicationName: null
    EnablePasswordReset: true
    EnablePasswordRetrieval: false
    MaxInvalidPasswordAttempts: 5
    MinRequiredNonAlphanumericCharacters: 0
    MinRequiredPasswordLength: 6
    PasswordAttemptWindow: 10
    PasswordFormat: Function evaluation was aborted.
    PasswordStrengthRegularExpression: Cannot evaluate expression because debugging information has been optimized away .
    RequiresQuestionAndAnswer: Cannot evaluate expression because debugging information has been optimized away .
    RequiresUniqueEmail: Cannot evaluate expression because debugging information has been optimized away .

更新 2

这个问题突然就开始正常工作了,说明我已经改变了一些东西但是却不记得具体是什么了。我的脑子真笨。如果我找到问题所在的话,我会接受唯一已经发布的答案并更新此处的信息。


你能否尝试在末尾加上程序集,使 type="Members.Providers.MembersProvider" 完全限定,并查看其效果? - amarsuperstar
你能详细说明一下“在末尾放置一个程序集”是什么意思吗? - 3Dave
编辑,忽略那个。您带有跟踪的编辑证明它正在加载正确的类型。 - amarsuperstar
2个回答

6
我使用了 Membership.Provider.Name 来获取正确的名称参数。
    public static MembershipUser GetUserFromEntity(this UserEntity userEntity)
    {
        return new MembershipUser(
                Membership.Provider.Name, 
                userEntity.Username,
                userEntity.PartitionKey,
                userEntity.Email,
                userEntity.PasswordQuestion,
                userEntity.Comment,
                userEntity.IsApproved,
                userEntity.IsLockedOut,
                userEntity.CreationDate,
                userEntity.LastLoginDate,
                userEntity.LastActivityDate,
                userEntity.LastPasswordChangedDate,
                userEntity.LastLockedOutDate
            );
    }

谢谢,使用Membership.Provider.Name而不是this.Name在测试期间修复了“指定的成员资格提供程序名称无效”的错误。当我开始直接通过我创建的实例调用自定义提供程序而不是通过Membership类访问它时,这个错误才开始出现。 - Peadar Doyle

3

虽然还没有解决方案,但通过下面这两个函数,您至少可以了解已注册的内容:

Membership.Provider

Membership.Providers

出于某种原因,我从MembershipUser类继承了我的用户类,但我非常确定我有充分的理由这样做 :-)


是的,这肯定会更方便!如果有一种方便、非反射的方式可以将一个类型复制到另一个类型,前提是它们具有相同的属性名称和类型,那就太好了。我猜我可以为此制作一个 T4 模板,但感觉有些随意。 - 3Dave
已接受,因为这是唯一的答案;而且我不知道.Provider(s)属性,它提供了一些有用的见解。谢谢。 - 3Dave
我进行了更多的谷歌搜索,但据我所知,没有其他方法可以继承MembershipUser。 - Remy
2
关于属性复制,您可以使用类似AutoMapper的工具:http://automapper.codeplex.com/ - Matt Greer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接