Vagrant Box上的ServiceStack Facebook身份验证NullReference异常(Ubuntu / MySql / Mono / nginx)

时间:2013-07-30 13:50:13

标签: servicestack

我认为远远不够,因为我在这个阶段缺乏真实的信息。我很乐意提供更多关于如何重现这个问题的细节 - 但是想要一些快速的反馈来查看我遗失的地方是否有 gotcha

我有一个简单的ServiceStack hello world应用程序,我正在玩Facebook Auth Provider:

  • Vanilla ServiceStack
  • Vanilla Facebook Auth Proivider
  • 香草用户会话
  • Vanilla OrmLite用户存储库
  • Vanilla OrmLite MySql Db Factory

在本地计算机上进行调试时 - 在Windows 7(和8)上;一切都有效。服务启动,数据库表创建,我可以通过Facebook登录,并将记录插入相关表。

在Vagrant Box中运行Ubuntu上的服务(在Virtual Box中作为虚拟化提供程序运行,在nginx上使用mono-fastcgi托管) - 服务正确启动,我可以看到这些表是在MySql数据库中创建的。当我点击/auth/facebook正确转发到Facebook时 - 但是当服务回调发生时我遇到了错误。

这是当前的输出:

[Auth: 07/30/2013 13:02:47]: [REQUEST: {provider:facebook}] System.NullReferenceException: Object reference not set to an instance of an object at 
ServiceStack.ServiceInterface.Auth.FacebookAuthProvider.Authenticate (ServiceStack.ServiceInterface.IServiceBase,ServiceStack.ServiceInterface.Auth.IAuthSession,ServiceStack.ServiceInterface.Auth.Auth) <0x0061e> at 
ServiceStack.ServiceInterface.Auth.AuthService.Authenticate (ServiceStack.ServiceInterface.Auth.Auth,string,ServiceStack.ServiceInterface.Auth.IAuthSession,ServiceStack.ServiceInterface.Auth.IAuthProvider) <0x000a7> at 
ServiceStack.ServiceInterface.Auth.AuthService.Post (ServiceStack.ServiceInterface.Auth.Auth) <0x00303> at 
ServiceStack.ServiceInterface.Auth.AuthService.Get (ServiceStack.ServiceInterface.Auth.Auth) <0x00013> at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,object,object) <0x0004f> at 
ServiceStack.ServiceHost.ServiceRunner`1<ServiceStack.ServiceInterface.Auth.Auth>.Execute (ServiceStack.ServiceHost.IRequestContext,object,ServiceStack.ServiceInterface.Auth.Auth) <0x00416>

它显然已到达服务(我通过localhost:8080访问该服务,该服务映射到端口80上的来宾计算机);因为错误在ServiceStack输出中很好地包装。

我不认为任何人有任何线索?

1 个答案:

答案 0 :(得分:2)

在调查一个晚上之后好了 - 我找到了根本原因。

Line 51 of FacebookAuthProvider.cs致电Line 28 of WebRequestExtensions.cs - 后者又拨打Line 227 of WebRequestExtensions.cs

此方法调用fails at line 255-ish - 主要是因为默认情况下Mono默认不信任任何SSL证书:as explained here.

而不是找出Mono的正确配置 - 我已经采取了令人讨厌的路线(暂时至少);在我的AppHostBase.Configure实现中使用以下行:

<强> F#

System.Net.ServicePointManager.ServerCertificateValidationCallback <- new RemoteCertificateValidationCallback(fun _ _ _ _ -> true)

<强> C#

System.Net.ServicePointManager.ServerCertificateValidationCallback += (a, b, c, d) => { return true; };

我现在正在运行(就像一个完全可操作的死星)。