// In Default.aspx:
<iframe src="http://www.facebook.com/plugins/registration.php?
client_id=your_client_id&
redirect_uri=http%3A%2F%2Fmydomain.com%2FCallback.aspx&
fields=name,birthday,gender,location,email"
scrolling="auto"
frameborder="no"
style="border:none"
allowTransparency="true"
width="100%"
height="330">
</iframe>
// In Callback.aspx.cs:
using System;
using Newtonsoft.Json.Linq;
using System.Text;
using System.Security.Cryptography;
public partial class Callback: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var signed_request = Request.Form["signed_request"];
var obj = ParseSignedRequest(signed_request, "your_secret_key");
var name = obj["name"].Value<string>();
var birthday = obj["birthday"].Value<DateTime>();
var location = obj["location"]["name"].Value<string>();
var gender = obj["gender"].Value<string>();
var email = obj["gender"].Value<string>();
// Save values to database...
}
private JToken ParseSignedRequest(string signedRequestValue, string secret_key)
{
string[] signedRequestSplit = signedRequestValue.Split('.');
string expectedSignature = signedRequestSplit[0];
string payload = signedRequestSplit[1];
// Attempt to get same hash
var encoding = new UTF8Encoding();
var hmac = SignWithHmac(encoding.GetBytes(payload), encoding.GetBytes(secret_key));
var hmacBase64 = ToUrlBase64String(hmac);
if (hmacBase64 != ReplaceSpecialCharactersInSignedRequest(expectedSignature))
return null;
var decodedJson = ReplaceSpecialCharactersInSignedRequest(payload);
var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
var data = JObject.Parse(encoding.GetString(base64JsonArray));
if (data.HasValues && data["registration"] != null)
{
return data["registration"];
}
else
return null;
}
private static string ReplaceSpecialCharactersInSignedRequest(string str)
{
return str.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
}
private static byte[] SignWithHmac(byte[] dataToSign, byte[] keyBody)
{
using (var hmacAlgorithm = new HMACSHA256(keyBody))
{
hmacAlgorithm.ComputeHash(dataToSign);
return hmacAlgorithm.Hash;
}
}
private static string ToUrlBase64String(byte[] Input)
{
return ReplaceSpecialCharactersInSignedRequest(Convert.ToBase64String(Input));
}
}