我是否将这个用于Facebook身份验证的php示例正确转换为c#?

时间:2011-04-12 17:02:05

标签: c# php facebook

我正在尝试编写一些用于Facebook身份验证的php示例代码的c#版本,我在这里找到:http://developers.facebook.com/docs/guides/web/示例中的php是:

define('YOUR_APP_ID', 'your app id ');
define('YOUR_APP_SECRET', 'your app secret');

function get_facebook_cookie($app_id, $app_secret) {
  $args = array();
  parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
  ksort($args);
  $payload = '';
  foreach ($args as $key => $value) {
    if ($key != 'sig') {
      $payload .= $key . '=' . $value;
    }
  }
  if (md5($payload . $app_secret) != $args['sig']) {
    return null;
  }
  return $args;
}

我的C#版本是:

private bool CheckFacebookAuthentication()
{
    var appSecret = "??????????";
    var appId = "?????";
    var cookie = Request.Cookies["fbs_" + appId];

    var payload = "";
    foreach (var key in cookie.Values.AllKeys.OrderBy(x => x))
    {
        if (key != "sig")
        {
            payload += key.Trim("\"".ToCharArray()) + "=" + cookie.Values[key].Trim("\"".ToCharArray());
        }
    }

    if (cookie.Values["sig"] == FormsAuthentication.HashPasswordForStoringInConfigFile(payload + appSecret, "md5"))
    {
        return true;
    }
    return false;
}

我很欣赏我的c#版本与php没有完全相同的东西,即它只是检查签名是否有效并返回一个指示这个的布尔值;而如果它有效,则php返回一个数组。

但我遇到的问题是我的c#版本没有验证我希望有效的cookie。我对php的体验是有限的,所以我希望在编写c#版本时我误解了php的例子。

我的c#解释这个php有什么明显的错误吗?

2 个答案:

答案 0 :(得分:2)

是的,这是正确的翻译,但您可以用"\"".ToCharArray()替换'\"'

此外,还有一个用C#写的非常好的SDK:http://facebooksdk.codeplex.com/

如果您想查看更多示例代码,那就是这样。

我使用Facebook的Graph API和C#工作了很多,所以如果有任何具体需要帮助,请随时问:)

答案 1 :(得分:1)

我会说这不是相应的翻译。据我所知,它归结为这一行:

parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);

在PHP中,通过删除任何'\'或'“'字符(检查php手册中的trim(...))和然后解析来修剪cookie字符串,而在C#中你是目前正在逐个修剪每个值和密钥,请尝试删除它。