如何使用FB C#SDK强制登录Facebook?

时间:2012-11-30 15:05:02

标签: facebook facebook-graph-api facebook-c#-sdk

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

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

即使我们有用户auth_type=reauthenticate,但这也无助于每次都显示登录屏幕。我需要一个类似Twitter的机制来强制登录FB。

有人可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

  1. Facebook应用程序 - 记下您的App ID和App Secret
  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>
    
  5. 打开页面的代码隐藏。我们验证了代码签名请求。

    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