d_m*_*mcg 8 .net assemblies owin asp.net-mvc-5 asp.net-identity
作为一个上下文,我正在开发一个ASP.NET MVC 5应用程序,该应用程序通过Microsoft的OWIN实现使用基于OAuth的身份验证,仅在此阶段用于Facebook和Google.目前(截至v3.0.0,git-commit 4932c2f),FacebookAuthenticationOptions并且GoogleOAuth2AuthenticationOptions没有提供任何属性来强制Facebook或Google分别在登录时重新验证用户(通过附加相应的查询字符串参数).
最初,我开始重写以下类:
FacebookAuthenticationOptionsGoogleOAuth2AuthenticationOptionsFacebookAuthenticationHandler(具体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 assembly] .dll中出现'System.IO.FileLoadException'类型的异常,但未在用户代码中处理
附加信息:无法加载文件或程序集"Microsoft.Owin.Security,Version = 3.0.0.0,Culture = neutral,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文件夹包含Owin程序集的3.0.0版本.
我已经为Microsoft.AspNet.Identity.Owin升级了NuGet包,这仍然是一个问题.
有关如何解决此问题的任何想法?
小智 10
我更新到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文件中的版本号,发现它已正确更新:
Packages.config示例:
<package id="Microsoft.Owin.Security.Google" version="3.0.1" TargetFramework="net45" />
Run Code Online (Sandbox Code Playgroud)
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" />
Run Code Online (Sandbox Code Playgroud)
我发现虽然FacebookAuthenticationHandler被标记为,但幸运的是internal它的抽象基类是。最后,我从 Katana 项目源中获取了修改后的版本,将其重命名并将其包含在我自己的解决方案中,以便它仍然使用 2.1 库,并且不会导致其他 NuGet 依赖项出现问题。AuthenticationHandler<TOptions>publicFacebookAuthenticationHandler
同样对于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>
...
Run Code Online (Sandbox Code Playgroud)
最后,在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);
...
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助其他有类似问题的人。
| 归档时间: |
|
| 查看次数: |
19988 次 |
| 最近记录: |