2010-09-27 4 views
0

сентябрь 2010 года, и я пытаюсь обновить интеграцию с Facebook на нашем веб-сайте.Проверка подлинности подписи Facebook, код .NET

Мне нужно проверить файл cookie, который был установлен кодом Facebook. Я был следующий PHP образец из http://developers.facebook.com/docs/guides/web

пожалуйста, проверьте 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 ,

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

всегда Правда

Пожалуйста, помогите найти решение.

Благодаря

ответ

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); 
    } 
Смежные вопросы