1

次のように、複数のメンバーシップ プロバイダーが構成されている場合:

    <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>

Then let's say, for a particular section in the site I want to use SimpleMembershipProvider for auth (the rest of the site will use the default provider i.e. UmbracoMembershipProvider) ... Therefore I need to initialize SimpleMembership with:

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

But it seems the above code only works when SimpleMembershipProvider is the defaultProvider. I can't see a way to specify the provider name I want to use? Is this even possible? Or does simplymembership assume you have one membership and role provider defined?

4

1 に答える 1

0

SimpleMembershipProviderの実装ですExtendedMembershipProviderWebSecurity拡張プロバイダーの任意の実装で動作しますが、使用する場合には疑わしい結合がありますSimpleMembershipProvider

基本的SimpleMembershipProviderには による初期化が必要WebSecurityです。そうしないと、拡張メンバーシップ インターフェイスが使用されたときに例外がスローされます。ASPNET初期化されていない場合は、既定のプロバイダーがラップされ、元のMembershipProviderインターフェイスと古いスキーマで使用できます。

初期化ルーチンは、単純なプロバイダー実装にキャストできる場合、デフォルト プロバイダーのみを初期化します。したがって、デフォルト インスタンスとして構成されていない限り、SimpleMembershipProviderまたはを使用することはできません。SimpleRoleProvider

SimpleMembershipProvider hereの制限に関する詳細情報があります。

回避策があります。リフレクションを使用して、初期化中にプロバイダーを一時的にデフォルトにスワップし、その後元に戻すことができます。まさにそれを行う例については、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);
于 2013-10-18T07:58:35.213 に答える