【问题标题】:Facebook signature validation, .NET codeFacebook 签名验证,.NET 代码
【发布时间】:2010-10-01 03:29:33
【问题描述】:

现在是 2010 年 9 月,我正在尝试更新我们网站上的 Facebook 连接集成。

我需要验证由 Facebook 代码设置的身份验证 cookie。我正在关注来自 http://developers.facebook.com/docs/guides/web

的 PHP 示例

请检查 C# 代码:

    public static Dictionary<string, string> ParseCookie(HttpCookie fbCookie)
    {
        if (fbCookie == null)
            return null;

        string value = fbCookie.Value.Substring(1, fbCookie.Value.Length - 2);
        SortedDictionary<string, string> sargs = new SortedDictionary<string, string>();

        foreach (string pair in value.Split('&'))
        {
            string[] keyvalue = pair.Split('=');
            sargs.Add(keyvalue[0], keyvalue[1]);
        }

        string sid = sargs["sig"] ?? string.Empty;
        sargs.Remove("sig");

        string payload = string.Empty;
        foreach (KeyValuePair<string, string> pair in sargs)
        {
            payload += pair.Key + "=" + pair.Value;
        }

        if (string.IsNullOrEmpty(payload) || DataFormatter.GetMD5Hash(payload + Settings.ApplicationSecret).ToUpper() != sid.ToUpper())
            return null;

        return sargs.ToDictionary(pair => pair.Key, pair => pair.Value);
    }

DataFormatter.GetMD5Hash 方法是:

    public static string GetMD5Hash(string key)
    {
        StringBuilder result = new StringBuilder();
        MD5 md5 = new MD5CryptoServiceProvider();
        foreach (byte b in md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)))
            result.Append(b.ToString("X2"));

        return result.ToString();
    }

问题在于我的 md5 与来自 Facebook 的 sig 不匹配

    DataFormatter.GetMD5Hash(payload + Settings.ApplicationSecret).ToUpper() != sid.ToUpper()

总是正确的

请帮忙找出解决办法。

谢谢

【问题讨论】:

    标签: facebook authentication cookies


    【解决方案1】:
        public static Dictionary<string, string> ParseCookie(HttpCookie fbCookie)
        {
            if (fbCookie == null)
                return null;
    
            string value = fbCookie.Value.Substring(1, fbCookie.Value.Length - 2);
            SortedDictionary<string, string> sargs = new SortedDictionary<string, string>();
    
            foreach (string pair in value.Split('&'))
            {
                string[] keyvalue = pair.Split('=');
                if (keyvalue.Length != 2)
                    continue;
                sargs.Add(keyvalue[0], keyvalue[1]);
            }
    
            string sid = sargs["sig"] ?? string.Empty;
            sargs.Remove("sig");
    
            string payload = sargs.Aggregate(string.Empty, (current, pair) => current + (pair.Key + "=" + HttpUtility.UrlDecode(pair.Value)));
    
    
            if (string.IsNullOrEmpty(payload) || DataFormatter.GetMD5Hash(payload + Settings.ApplicationSecret).ToUpper() != sid.ToUpper())
                return null;
    
            return sargs.ToDictionary(pair => pair.Key, pair => pair.Value);
        }
    

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      相关资源
      最近更新 更多