c# - FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri()) 在 Facebook 上返回 null

标签 c# facebook facebook-graph-api model-view-controller nopcommerce-3.80

我使用 nopcommerce 开发了一个 mvc 5 应用程序,我使用外部回调使用 facebook 登录,它工作正常,但现在它不工作,我找不到实际问题。并使用下面的代码

this.FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri());

它总是返回 null 并且身份验证状态失败我在网上搜索并执行了所有操作并遵循了这些步骤但我仍然无法使用 facebook 登录。

我的代码在FacebookProviderAuthorizer.cs中是这样的

private AuthorizeState VerifyAuthentication(string returnUrl)
{
   var authResult = DotNetOpenAuth.AspNet.Clients.FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri());

   if (authResult.IsSuccessful)
   {
   }
}

然后写回调方法

private Uri GenerateLocalCallbackUri()
{
    string url = string.Format("{0}plugins/externalauthFacebook/logincallback/", _webHelper.GetStoreLocation());
    return new Uri(url);            
}

然后生成服务登录url

private Uri GenerateServiceLoginUrl()
{
   //code copied from DotNetOpenAuth.AspNet.Clients.FacebookClient file
   var builder = new UriBuilder("https://www.facebook.com/dialog/oauth");
   var args = new Dictionary<string, string>();
   args.Add("client_id", _facebookExternalAuthSettings.ClientKeyIdentifier);
   args.Add("redirect_uri", GenerateLocalCallbackUri().AbsoluteUri);
   args.Add("response_type", "token");
   args.Add("scope", "email");
   AppendQueryArgs(builder, args);
   return builder.Uri;
}

最佳答案

我们在 2017 年 3 月 27 日星期一遇到了同样的问题,当时 Facebook 停止了对其 Graph API v2.2 的支持。

我们还使用了最初通过 Nuget 安装的 DotNetOpenAuth。源代码可在以下链接获得:

https://github.com/DotNetOpenAuth/DotNetOpenAuth

具体来说,我们发现我们的代码使用了 4.3 分支,其中包含 DotNetOpenAuth.AspNet.DLL 的源代码。检查源代码后,我们发现问题出在 DotNetOpenAuth.AspNet\Clients\OAuth2\FacebookClient.cs 中的这段代码,位于 QueryAccessToken 方法中:

using (WebClient client = new WebClient()) {
     string data = client.DownloadString(builder.Uri);
     if (string.IsNullOrEmpty(data)) {
          return null;
     }

     var parsedQueryString = HttpUtility.ParseQueryString(data);
     return parsedQueryString["access_token"];
}

具体而言,问题在于 ParseQueryString 调用。从 API v2.3 开始,数据不再以 HTML 查询字符串的形式返回,而是以标准的 JSON 格式返回。

为了解决这个问题,我们创建了自己的继承 OAuth2Client 的自定义类,并从 FacebookClient.cs 导入了大部分相同的代码。然后,我们用解析 JSON 响应以提取 access_token 并返回它的代码替换了上面的代码片段。您可以在同一 FacebookClient 类中的 GetUserData 方法中查看如何执行此操作的示例:

FacebookGraphData graphData;
var request =
    WebRequest.Create(
        "https://graph.facebook.com/me?access_token=" +
             MessagingUtilities.EscapeUriDataStringRfc3986(accessToken));
using (var response = request.GetResponse()) {
     using (var responseStream = response.GetResponseStream()) {
        graphData = JsonHelper.Deserialize<FacebookGraphData>(responseStream);
     }
}

唯一的其他更改是注册我们的自定义类以代替 FacebookClient 类,以便 OAuth 回调使用它来处理来自 Facebook API 的帖子。完成此操作后,一切都会再次顺利进行。

关于c# - FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri()) 在 Facebook 上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43094777/

相关文章:

c# - 有没有办法为 Windows 窗体中的特定按钮 Hook 鼠标事件

facebook - 如何通过 Rails 中的图形 API 检查特定用户的 Facebook 应用程序权限?

android - 为 Android 中的 Facebook 应用程序生成 key 哈希

android - Facebook Unity SDK 测试用户登录

c# - 如何用 xUnit 测试 byte[] 数组?

c# - 给 Entity Framework 生成的类添加数据注解

c# - 服务器证书与客户端证书

facebook - 将 php 变量传递给 Facebook 应用程序选项卡

csv - 如何获取所有用户好友的列表?

ios - 在 Facebook 上发布带有文字的图像