【问题标题】:When SimpleMembershipProvider is not the default provider当 SimpleMembershipProvider 不是默认提供者时
【发布时间】:2013-08-14 00:16:04
【问题描述】:

当您配置了多个会员提供者时,例如:

    <membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" />
    <add name="UsersMembershipProvider" type="umbraco.providers.UsersMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" passwordFormat="Hashed" />
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
  </providers>
</membership>

然后假设,对于站点中的特定部分,我想使用 SimpleMembershipProvider 进行身份验证(站点的其余部分将使用默认提供程序,即 UmbracoMembershipProvider)......因此我需要初始化 SimpleMembership:

            WebSecurity.InitializeDatabaseConnection(
            Constants.Membership.ConnectionStringName,
            Constants.Membership.TableName, 
            Constants.Membership.UserIdColumnName, 
            Constants.Membership.UserNameColumnName, 
            false);

但上面的代码似乎只在 SimpleMembershipProvider 是 defaultProvider 时才有效。 我看不到指定要使用的提供商名称的方法?这甚至可能吗?或者,simplymembership 是否假设您定义了一个成员资格和角色提供者?

【问题讨论】:

    标签: membership-provider simplemembership custom-membershipprovider


    【解决方案1】:

    SimpleMembershipProviderExtendedMembershipProvider 的实现。尽管WebSecurity 可以与扩展提供程序的任何实现一起使用,但如果使用它,它与SimpleMembershipProvider 的耦合存在一些问题。

    基本上SimpleMembershipProvider需要通过WebSecurity进行初始化,否则在使用扩展成员接口时会抛出异常。如果未初始化,则它会包装默认的 ASPNET 提供程序,并且可以与原始 MembershipProvider 接口和旧架构一起使用。

    初始化例程仅初始化默认提供程序,前提是它们可以转换为简单的提供程序实现。所以是的,除非将它们配置为默认实例,否则您不能使用 SimpleMembershipProviderSimpleRoleProvider

    这里有一些关于SimpleMembershipProviderhere的限制的更多信息。

    有一个解决方法。您可以在初始化期间使用反射将提供程序临时交换为默认值,然后将其切换回来。请参阅BetterMembership.Net 以获取执行此操作的示例。该库扩展了SimpleMembershipProvider,专门用于多提供商系统。

    membershipProviderField = typeof(Membership)
             .GetField("s_Provider", BindingFlags.NonPublic | BindingFlags.Static);
    
    var originalMembershipProvider = membershipProviderField.GetValue(null);
    membershipProviderField.SetValue(null, mySimpleMembershipProvider);
    
    WebSecurity.InitializeDatabaseConnection(...)
    
    membershipProviderField.SetValue(null, originalMembershipProvider);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2014-05-24
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多