作为一个上下文,我正在开发一个ASP.NET MVC 5应用程序,该应用程序通过Microsoft的OWIN实现使用基于OAuth的身份验证,仅适用于此阶段的Facebook和Google。目前(截至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.Owin.Security.Google < / strong>)在MVC项目中:
这是通过将现有项目引用替换为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包,这仍然是一个问题。
有关如何解决此问题的任何想法?
答案 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);
...
}
希望这有助于其他有类似问题的人。