2

我猜是远射,因为我在这个阶段提供的真实信息缺乏。我很乐意提供有关如何重现该问题的更多详细信息-但希望获得一些快速反馈,以查看我遗漏的某个地方是否存在问题。

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

  • 香草服务堆栈
  • 香草 Facebook 身份验证提供程序
  • 香草用户会话
  • Vanilla OrmLite 用户存储库
  • 香草 OrmLite MySql Db 工厂

在我的本地机器上调试时 - 在 Windows 7(和 8)上;一切都是一种享受。服务启动,创建数据库表,我可以通过 Facebook 登录并将记录插入到相关表中。

当在 Vagrant Box 内的 Ubuntu 上运行该服务时(在 Virtual Box 中作为虚拟化提供者运行,使用 mono-fastcgi 托管在 nginx 上) - 服务正确启动,我可以看到表是在 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 输出中。

我想没有人有任何线索吗?

4

1 回答 1

2

好的,经过一个晚上的调查 - 我找到了根本原因。

FacebookAuthProvider.cs 的第 51 行调用WebRequestExtensions.cs 的第 28 行- 这反过来又调用WebRequestExtensions.cs 的第 227 行

此方法调用在第 255 行失败- 主要是因为默认情况下 Mono 默认不信任任何 SSL 证书:如此处所述。.

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

F#

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

C#

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

我现在已经启动并运行(就像一个完全可操作的死星)。

于 2013-07-31T00:15:57.847 回答