4

ASP.NET MVC4 ベースのアプリケーションに SimpleMembership を使用しています。インターネット上のいくつかのブログをフォローして、認証メカニズムをセットアップしました。背景として、次のハイライトがあります。

• メンバーシップを初期化するクラス「InitializeSimpleMembershipAttribute」があります。これは、WebSecurity クラスのメソッドへの最初の呼び出しの前に呼び出されるようにしてください。

• WebSecurity をうまく利用してデフォルトのユーザーとロールを作成する SeedData クラスがあります (DB はデフォルト データを取得します)。

• 現在の状態のアプリケーションでは、ユーザーがログインして、アクセスできる機能を使用できます。したがって、SimpleMembership は正しくセットアップされ、機能していると言えます。

• 現在、「ResetPassword」機能を追加しています。私はいくつかのブログをフォローしています。

http://www.itorian.com/2013/03/PasswordResetting.html#comment-form および http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.resetpassword(v=vs. 111).aspx

基本的なもの (ビューとロジック) を実装しましたが、WebSecurity.GeneratePasswordResetToken(userName); を呼び出すと、

次の例外が発生します。

このメソッドを呼び出すには、「Membership.Provider」プロパティが「ExtendedMembershipProvider」のインスタンスである必要があります。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。例外の詳細: System.InvalidOperationException: このメソッドを呼び出すには、"Membership.Provider" プロパティが "ExtendedMembershipProvider" のインスタンスである必要があります。

ILSpy で、これが WebSecurity.VerifyProvider() メソッドから来ていることがわかります。しかし、なぜ私は理解できませんか?

ExtendedMembershipProvider extendedMembershipProvider = Membership.Provider as ExtendedMembershipProvider;

上記の WebSecurity クラスからの行は、この例外を引き起こすために null を返す必要がありますが、構成が web.config ファイルに存在し、「ExtendedMembershipProvider」から拡張されていない他のプロバイダーを使用していないため、そうすべきではありません。

この問題を解決するために人々が行った提案に基づいて、少し変更した web.config をお見せしましょう。

    <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="enableSimpleMembership" value="true" />
  </appSettings>
  <system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <roleManager enabled="true" defaultProvider="SimpleRoleProvider" lockItem="true">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider" lockItem="true">
      <providers>
        <clear />
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PublicWebsiteDbContext" />
      </providers>
    </sessionState>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PublicWebsiteDbContext" applicationName="/" />
      </providers>
    </profile>
  </system.web>

試行 1: 上記の属性に lockItem="true" を設定して、グローバル構成が構成をオーバーライドしないようにします。

試行 2: 以下の質問に対する回答で示唆されているように、必要なメンバーシップ構成が "web.config" に存在することを確認してください: このメソッドを呼び出すには、"Membership.Provider" プロパティが "ExtendedMembershipProvider" のインスタンスである必要があります。

試行 3: <add key="enableSimpleMembership" value="true" />web.config ファイルに追加されました。

試行 4: Google で少なくともトップ 10 のヘルプ リンクを読み、このトピックに関連すると思われる SO で 5 つの回答を読んで ください彼は、回答に記載されている理由でエラーを解決しました。「ActionExecutingContext」は「System.Web.Http」にありません。

この例外を取り除くために私が試すことができる他のことを親切に提案してもらえますか?

これは私にとってはうまくいくはずであり、そのような問題を解決するのに2時間以上無駄にしなければならなかったことに悩まされていました(SimpleMembershipを使用して破棄し、独自の認証メカニズムを使用する時点で)。

更新:問題は解決しました。この例外を解決した変更は、ビジネス レイヤー プロジェクトで WebMatrix.WebData アセンブリ バージョン 1.0 を参照していたので、それをアセンブリ バージョン 2.0 に置き換えたことです。他のプロジェクト アセンブリ (DAL) でもバージョン 2.0 アセンブリが使用されています。

WebMatrix.WebData アセンブリの両方のバージョンを比較しましたが、問題のコードに違いは見つかりませんでした。では、プロバイダーを「ExtendedMembershipProvider」にキャストできなかった理由が正確にはわかりませんか?

他のプロジェクト、特に Web プロジェクトがバージョン 2.0 とWebSecurity.GeneratePasswordResetToken1.0 アセンブリを探しているビジネス レイヤーをロードしているため、問題が発生している可能性がありますか? その場合、例外から警告やその他のヘルプを得るべきではありませんか?

よろしくお願いします > シャイレンドラ

4

2 に答える 2

4

この例外を解決した変更は、ビジネス レイヤー プロジェクトで WebMatrix.WebData アセンブリ バージョン 1.0 を参照していたので、それをアセンブリ バージョン 2.0 に置き換えたことです。

WebMatrix.WebData アセンブリの両方のバージョンを比較したところ、問題のコードに違いは見つかりませんでした。

ただし、バージョン 2.0 アセンブリが既に別のプロジェクト アセンブリ (DAL) でも使用されているという事実。

したがって、私の理論が100%確信できるわけではありませんが、実行時にプロバイダーをチェックしているときに、競合のために正しいアセンブリをロードできませんでした(DALプロジェクトで参照されている1つのバージョンがすでにロードされており、2番目のプロジェクトメソッドが呼び出されたときに同じアセンブリの異なるバージョン) であり、一般的な例外メッセージが表示されています。

于 2013-08-23T06:06:31.407 に答える