【问题标题】:ASP.NET MVC3 Custom Membership Provider - The membership provider name specified is invalidASP.NET MVC3 自定义成员资格提供程序 - 指定的成员资格提供程序名称无效
【发布时间】:2011-01-03 18:33:49
【问题描述】:

我正在实现一个自定义成员资格提供程序,在我创建 MembershipUser 对象之前,一切似乎都很顺利。那时,我收到错误:

指定的会员提供者名称 是无效的。参数名称: 提供者名称

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>

从我的自定义 User 类创建 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(...) providerName 参数应该与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" 完全量化,看看它是如何工作的
  • 你能扩展一下“把一个程序集放在最后”吗?
  • 编辑,忽略。您对跟踪的编辑证明它正在加载正确的类型

标签: c# asp.net-mvc-3 membership-provider


【解决方案1】:

我使用 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 类访问它时开始。
【解决方案2】:

目前还不是解决方案,但通过以下两个功能,您至少可以了解注册的内容:

Membership.Provider

Membership.Providers

出于某种原因,我确实从 MembershipUser 继承了我的 User 类,但我很确定我有一个很好的理由 :-)

【讨论】:

  • 是的,肯定会更方便!如果有一种方便的、非反射的方式将一种类型复制到另一种类型,如果它们具有相同的属性名称和类型,那就太好了。我想我可以为此制作一个 T4 模板,但感觉很草率。
  • 接受,因为这是唯一的答案;我也不知道.Provider(s) 属性提供了一些有用的见解。谢谢。
  • 我做了一些谷歌搜索,但据我所知,没有其他方法可以从 MembershipUser 继承。
  • 至于复制属性,你可以使用 AutoMapper 之类的东西:automapper.codeplex.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多