webdevqa.jp.net

ASP.NET MVCは、古いバージョンのOwinアセンブリを読み込もうとします

少しコンテキストとして、私はこの段階でのみFacebookとGoogle向けに、MicrosoftのOWIN実装を介してOAuthベースの認証を使用するASP.NET MVC5アプリケーションを開発しています。現在(v3.0.0、git-commit 4932c2f以降)、FacebookAuthenticationOptionsと_GoogleOAuth2AuthenticationOptions_は、FacebookとGoogleにそれぞれユーザーの再認証を強制するプロパティを提供していません(適切なクエリ文字列パラメーターを追加することにより) )サインインするとき。

最初に、次のクラスをオーバーライドすることに着手しました。

  • FacebookAuthenticationOptions
  • _GoogleOAuth2AuthenticationOptions_
  • FacebookAuthenticationHandler(具体的にはAuthenticateCoreAsync()
  • _GoogleOAuth2AuthenticationHandler_(具体的にはAuthenticateCoreAsync()

_~AuthenticationHandler_クラスがinternalとしてマークされていることをまだ発見しました。

そこで、Katanaプロジェクトのソースのコピー( http://katanaproject.codeplex.com/ )をプルし、それに応じてソースを変更しました。

コンパイル後、これらの更新されたアセンブリ(Microsoft.Owin.Security.FacebookおよびMicrosoftを使用するために更新が必要な依存関係がいくつかあることがわかりました。 MVCプロジェクトのOwin.Security.Google):

  • Microsoft.Owin
  • Microsoft.Owin.Security
  • Microsoft.Owin.Security.Cookies
  • Microsoft.Owin.Security.OAuth
  • Microsoft.Owin.Host.SystemWeb

これは、既存のプロジェクト参照を3.0.0バージョンに置き換え、web.config内の参照を更新することによって行われました。良いニュース:プロジェクトは正常にコンパイルされます。

デバッグ中に、起動時に例外が発生しました。

タイプ 'System.IO.FileLoadException'の例外が[MVCweb Assembly] .dllで発生しましたが、ユーザーコードで処理されませんでした

追加情報:ファイルまたはアセンブリ 'Microsoft.Owin.Security、Version = 3.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

根本的な例外は、Microsoft.AspNet.Identity.OwinMicrosoft.Owin.Securityのv2.1.0をロードしようとしたときにStartup.Auth.csのapp.UseExternalSignInCookie()からStartup.ConfigureAuth(IAppBuilder app)を呼び出します。

残念ながら、そのアセンブリ(およびその他の依存関係Microsoft.AspNet.Identity.Owin)はProject Katanaソリューションの一部ではなく、これらのアクセス可能なリポジトリが見つかりません。オンラインのアセンブリ。

Microsoft.AspNet.Identityアセンブリは、Katanaプロジェクトのようにオープンソースですか?それらのアセンブリをだまして、v2.1.0の代わりに参照されているv3.0.0アセンブリを使用する方法はありますか? _/bin_フォルダーには、3.0.0バージョンのOwinアセンブリが含まれています。

Microsoft.AspNet.Identity.OwinのNuGetパッケージをアップグレードしましたが、これはまだ問題です。

この問題を解決する方法についてのアイデアはありますか?

8
d_mcg

FacebookAuthenticationHandlerinternalとしてマークされていますが、その抽象基本クラスAuthenticationHandler<TOptions>は幸いにもpublicです。最終的に、KatanaプロジェクトソースからFacebookAuthenticationHandlerの変更バージョンを取得し、名前を変更して独自のソリューションに含めました。これにより、2.1ライブラリが引き続き使用され、他のNuGetで問題が発生しなくなりました。依存関係。

同様にGoogleOAuth2AuthenticationHandler

したがって、Facebookの例を使用すると、MVCプロジェクトに次のクラス定義があります。

// Overridden to add additional property 'ForceReauthentication'
public class FacebookOAuth2ExtendedOptions : FacebookAuthenticationOptions
...

// Reimplemented v2.1 source with modified method 'ApplyResponseChallengeAsync'
public class FacebookOAuth2CustomHandler : AuthenticationHandler<FacebookOAuth2ExtendedOptions>
...

// Reimplemented v2.1 source, modified to use 'FacebookOAuth2CustomHandler '
public class FacebookOAuth2CustomMiddleware : AuthenticationMiddleware<FacebookOAuth2ExtendedOptions>
...

最後に、Startupクラス(App_Start/Startup.Auth.cs)で、カスタムミドルウェアクラスを使用して認証を登録します。

public void ConfigureAuth(IAppBuilder app)
{
    ...

    var fbOptions = new FacebookOAuth2ExtendedOptions()
    {
        AppId = facebookAppKey,
        AppSecret = facebookAppSecret,
        ForceReauthentication = true
    };
    app.Use(typeof(FacebookOAuth2CustomMiddleware), app, fbOptions);

    ...
}

これが同様の問題を抱えている他の人に役立つことを願っています。

0
d_mcg

OWin 3.0.1にアップデートしたところ、問題が修正されました。

ツール-> NuGetパッケージマネージャー->ソリューションのNuGetパッケージの管理

リスト(NuGet.orgの下)で参照を検索し、Microsoft.Owin、Microsoft.Owin.Security、Microsoft.Owin.Security.Google、Microsoft.Owin.Security.Facebookなどの新しい参照をインストールしました。

次に、packages.configファイルとWeb.Configファイルのバージョン番号を確認したところ、これが正しく更新されていることがわかりました。

Packagings.configの例:

<package id="Microsoft.Owin.Security.Google" version="3.0.1" TargetFramework="net45" />

Web.Configの例:

<assemblyIdentity name="Microsoft.Owin.Security" culture="neutral" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
10
Dave Hatt