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

时间:2014-06-06 00:03:47

标签: .net asp.net-mvc-5 assemblies asp.net-identity owin

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

最初,我开始重写以下类:

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

但发现~AuthenticationHandler类标记为internal

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

编译之后,我发现有几个依赖项需要更新才能使用这些更新的程序集( Microsoft.Owin.Security.Facebook Microsoft.Owin.Security.Google < / strong>)在MVC项目中:

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

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

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

  

[MVC web assembly] .dll中出现'System.IO.FileLoadException'类型的异常,但未在用户代码中处理

     

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

基础异常表明 Microsoft.AspNet.Identity.Owin 在从app.UseExternalSignInCookie()调用{strong}时尝试加载 Microsoft.Owin.Security 的v2.1.0 Startup.Auth.cs中的Startup.ConfigureAuth(IAppBuilder app)

不幸的是,程序集(及其它依赖项 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包,这仍然是一个问题。

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:10)

我更新了OWin 3.0.1并修复了问题:

工具 - &gt; NuGet包管理器 - &gt;管理NuGet包以获得解决方案

我搜索了列表中的引用(在NuGet.org下),并为Microsoft.Owin以及Microsoft.Owin.Security,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" />

答案 1 :(得分:0)

我发现虽然FacebookAuthenticationHandler被标记为internal,但其抽象基类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);

    ...
}

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