3

我有一个示例应用程序,托管在 AppHarbor 上,现在想通过 facebook 集成授权。所以我下载了 nugget Facebook.Web.Mvc 包来实现它。

阅读教程后,在控制器中我有方法:

 public ActionResult Login(string returnUrl)
    {
        var oauthClient = new FacebookOAuthClient(FacebookApplication.Current) { RedirectUri = GetFacebookRedirectUri() };


        if (!string.IsNullOrWhiteSpace(returnUrl))
        {
            returnUrl = Url.Action("Index", "Facebook");
        }

        dynamic parameters = new ExpandoObject();
        parameters.scope = ExtendedPermissions;

        var state = new { csrf_token = CalculateMD5Hash(Guid.NewGuid().ToString()), return_url = returnUrl };
        parameters.state = Base64UrlEncode(Encoding.UTF8.GetBytes(JsonSerializer.Current.SerializeObject(state)));
        SetFacebookCsrfToken(state.csrf_token);

        string s = oauthClient.GetLoginUrl(parameters).AbsoluteUri;

        ViewBag.FacebookLoginUrl = s;
        //new LogEvent(s).Raise();

        return View(new AccountModel());
    }

看法:

<a href="@ViewBag.FacebookLoginUrl" id="lUrl">
<div class="fblogin"></div>

在 localhost 这对我有用。但是当我将它上传到 appharbor 时,我看到,生成的链接指示地址 + 端口 16013(因为支持总是告诉随机端口)。因此,单击它会显示 Facebook 登录窗口,而不是空白页面。

我在 facebook 中手动将我的应用程序设置配置到此端口,但没有帮助。

我也试图通过这个端口访问我的网站 - 没有。

然后我通过jquery将端口号更改为80,它也没有帮助。

你有过这样的问题吗?

4

2 回答 2

4

我不熟悉 Facebook api,但我遇到了类似的问题。我怀疑传入的 returnUrl 值不正确。它可能包含 AppHarbor 在内部用于负载平衡的端口号。

请参阅这篇关于如何为 AppHarbor 创建公共 url 的文章:http: //support.appharbor.com/kb/getting-started/workaround-for-generating-absolute-urls-without-port-number

然后确保您的 returnUrl 中的值是公开可用的。

于 2012-01-18T22:54:18.913 回答
2

您现在可以设置有效解决此问题的aspnet:UseHostHeaderForRequestUrlappSetting 。true这可以通过使用相应的键和值向您的应用程序添加配置变量来完成。

来源 AppHarbor

于 2013-06-19T09:25:37.717 回答