ASP.NET MVC尝试加载旧版本的Owin程序集



作为上下文,我正在开发一个ASP.NET MVC 5应用程序,该应用程序通过Microsoft的OWIN实现使用基于OAuth的身份验证,现阶段仅适用于Facebook和Google。目前(从v3.0.0开始,gitcommit4932c2f(,FacebookAuthenticationOptionsGoogleOAuth2AuthenticationOptions没有提供任何属性来强制Facebook和Google在登录时分别重新验证用户(通过附加适当的查询字符串参数(。

最初,我开始覆盖以下类:

  • FacebookAuthenticationOptions
  • GoogleOAuth2AuthenticationOptions
  • FacebookAuthenticationHandler(具体为AuthenticateCoreAsync()(
  • GoogleOAuth2AuthenticationHandler(具体为AuthenticateCoreAsync()(

还发现CCD_ 9类被标记为CCD_。

所以我提取了一份Katana项目的来源副本(http://katanaproject.codeplex.com/)并相应地修改了源。

编译后,我发现有几个依赖项需要更新,以便在MVC项目中使用这些更新的程序集(Microsoft.Owin.Security.FacebookMicrosoft.Owin.Security.Google(:

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

这是通过将现有的项目引用替换为3.0.0版本并更新web.config中的引用来完成的。好消息:该项目成功编译。

在调试过程中,我在启动时收到一个异常:

在[MVC web程序集].dll中发生类型为"System.IO.FileLoadException"的异常,但未在用户代码中处理

其他信息:无法加载文件或程序集"Microsoft.Owin.Security,Version=3.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35"或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT异常:0x80131040(

潜在异常表明Microsoft.AspNet.Identity.Owin在Startup.Auth.cs.中从Startup.ConfigureAuth(IAppBuilder app)调用app.UseExternalSignInCookie()时,正试图加载Microsoft.Owin.Security的v2.1.0

不幸的是,程序集(及其其他依赖项,Microsoft.AspNet.Identity.Owin(不是Project Katana解决方案的一部分,我在网上找不到任何可访问的程序集存储库。

Microsoft.AspNet.Identity程序集是否像Katana项目一样是开源的?有没有办法欺骗那些程序集使用引用的v3.0.0程序集而不是v2.1.0?/bin文件夹包含Owin程序集的3.0.0版本。

我已经升级了Microsoft.AspNet.Identity.Owin的NuGet包,但这仍然是一个问题。

关于如何解决这个问题有什么想法吗?

我在3.0.1中更新到OW,并修复了问题:

工具->NuGet软件包管理器->管理用于解决方案的NuGet程序包

我在NuGet.org下的列表中搜索了引用,并为Microsoft.Owin以及Microsoft.Owin.Security.Google、Microsoft.Owin.Security.Facebook等安装了新的引用。

然后我检查了我的packages.config和Web.config文件中的版本号,发现它已经正确更新:

Packages.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" />

我发现,虽然FacebookAuthenticationHandler被标记为internal,但幸运的是,它的抽象基类AuthenticationHandler<TOptions>public。最后,我从Katana项目源中获得了FacebookAuthenticationHandler的修改版本,对其进行了重命名,并将其包含在我自己的解决方案中,这样它仍然使用2.1库,并且不会导致其他NuGet依赖项出现问题。

CCD_ 19也是如此。

因此,使用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);
    ...
}

希望这能帮助其他有类似问题的人。

相关内容

  • 没有找到相关文章

最新更新