3

我在 .net 中使用 FB SDK,在我的网站上有多个用户配置的 Facebook 电子邮件。每当用户想在 FB 上发布任何消息时,他都可以选择任何电子邮件,并且应该能够在 FB 上登录。

问题是,如果用户已经登录到 FB,但想在其他一些 FB 帐户上发布消息,我们无法向他显示登录屏幕,并且消息会发布到已经登录的帐户上。

即使我们有用户auth_type=reauthenticate,但这也无助于每次显示登录屏幕。我需要像 twitter 这样的机制来强制登录 FB。

任何人都可以提供帮助吗?

4

1 回答 1

1
  1. Facebook 应用程序 – 记下您的应用程序 ID 和应用程序密码
  2. Json.NET 安装在您的 Bin 中。在这里下载:http: //json.codeplex.com
  3. 需要将以下引用添加到您的应用程序将在其上设置的页面:

    使用 Newtonsoft.Json.Linq;使用 Newtonsoft.Json.Serialization;使用 System.Collections.Generic;使用 System.Security.Cryptography;

  4. 这是 HTML 内容:

     <div id="fb-root"></div>
    
    function runLogin() {
    FB.init({
    appId  : 'ENTERYOURAPPIDHERE',
    status : true,
    cookie : true,
    xfbml  : true,
    channelURL: 'ENTERTHEPAGEYOURAPPURLPOINTSTOHERE', // channel.html file 
    oauth : true 
    });
    
    <div id="dontLike">
        PAGE IS <b>NOT</b> Liked
    </div>
    
    </form>
    

打开页面的代码隐藏。我们验证了代码签名请求。

public bool ValidateSignedRequest()
    {
        var VALID_SIGNED_REQUEST = Request.Form["signed_request"];

        string applicationSecret = "YOURAPPSECRET";
        string[] signedRequest = VALID_SIGNED_REQUEST.Split('.');
        string expectedSignature = signedRequest[0];
        string payload = signedRequest[1];

        // Attempt to get same hash
        var Hmac = SignWithHmac(UTF8Encoding.UTF8.GetBytes(payload), UTF8Encoding.UTF8.GetBytes(applicationSecret));
        var HmacBase64 = ToUrlBase64String(Hmac);

        return (HmacBase64 == expectedSignature);
    }

   private string ToUrlBase64String(byte[] Input)
    {
        return Convert.ToBase64String(Input).Replace("=", String.Empty)
                                            .Replace('+', '-')
                                            .Replace('/', '_');
    }

    private byte[] SignWithHmac(byte[] dataToSign, byte[] keyBody)
    {
        using (var hmacAlgorithm = new HMACSHA256(keyBody))
        {
            hmacAlgorithm.ComputeHash(dataToSign);
            return hmacAlgorithm.Hash;
        }
    }

 public Dictionary<string, string> DecodePayload(string payload)
    {
        //Remove the bad part of signed_request
        //Begin
        string[] sB64String = payload.Split('.');
        payload = payload.Replace((sB64String[0] + "."), string.Empty);
        //End
        var encoding = new UTF8Encoding();
        var decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
        var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
        var json = encoding.GetString(base64JsonArray);
        var jObject = JObject.Parse(json);
        var parameters = new Dictionary<string, string>();

        parameters.Add("page", ((bool)jObject["page"]["liked"]).ToString());
        parameters.Add("admin", ((bool)jObject["page"]["admin"]).ToString());
        return parameters;
    }

protected void pageLike()
    {
        string pageLiked = string.Empty;
        var signed_request = Request.Form["signed_request"];
        var json = DecodePayload(signed_request);


        foreach (KeyValuePair<string, string> objKVP in json)
        {
            //Note You can also see if a user is an admin by replacing the objKVP.Key with admin
            if (objKVP.Key == "page" && objKVP.Value == "True")
            {
                Response.Redirect("https://www.YOURSITE.com/facebook/app/pageLiked.aspx");
                litJson.Text += objKVP.Key + " - " + objKVP.Value + "<br />";
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
        {
        pageLike();
    }

您可以在此链接中看到此示例:http ://blog.daniellecopp.com/2012/03/19/detect-if-facebook-user-likes-your-page-with-asp-net-2/#comment- 52

于 2013-03-04T20:33:29.333 回答