作为一个背景,我正在开发一个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/)提取了源代码的副本,并相应地修改了源代码。
编译后,我发现在MVC项目中有一些需要更新的依赖关系才能使用这些更新的程序集(Microsoft.Owin.Security.Facebook和Microsoft.Owin.Security.Google):
这是通过将现有项目引用替换为3.0.0版本并更新web.config中的引用来完成的。好消息:项目成功编译。
在调试中,我在启动时收到异常消息:
[MVC Web程序集] .dll中发生类型为'System.IO.FileLoadException'的异常,但未在用户代码中处理
附加信息:无法加载文件或程序集'Microsoft.Owin.Security,版本= 3.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)
基本的异常表明Microsoft.AspNet.Identity.Owin试图负载V2.1.0 Microsoft.Owin.Security打电话时app.UseExternalSignInCookie()
从Startup.ConfigureAuth(IAppBuilder app)
在Startup.Auth.cs。
不幸的是,该程序集(及其其他依赖项Microsoft.AspNet.Identity.Owin)不是Project Katana解决方案的一部分,我无法在线找到这些程序集的任何可访问存储库。
Microsoft.AspNet.Identity程序集是否像Katana项目一样是开源的?有没有办法欺骗那些程序集使用引用的v3.0.0程序集而不是v2.1.0?该
/bin
文件夹包含3.0.0版本的Owin程序集。
我已经为Microsoft.AspNet.Identity.Owin升级了NuGet软件包,但这仍然是一个问题。
关于如何解决此问题的任何想法?
我发现,虽然FacebookAuthenticationHandler
将其标记为internal
,但AuthenticationHandler<TOptions>
幸运的是它的抽象基类public
。最后,我FacebookAuthenticationHandler
从Katana项目源代码中获取了经过修改的版本,将其重命名并将其包含在我自己的解决方案中,以便它仍然使用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);
...
}
希望这对其他有类似问题的人有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句