4

在最新版本的 Facebook C# SDk 6.4 中。我们可以使用FacebookSubscriptionVerify动作方法属性吗?FacebookClient因为这在课堂上不可用

我在 MVC3 项目中使用的是旧版本的 Facebok C# SDK。现在,切换到 Facebook C# SDK 6.4 后,该类不可用。

我们有什么替代品吗?

4

1 回答 1

2

今天早上我花了更多时间确认您引用的属性已在版本 6 中删除(以及大量其他项目)。由于这个项目是开源的,这里是FacebookSubscriptionVerify你曾经使用的 ActionFilter 的代码。对于此处未包含的任何对函数的引用,CodePlex 上的此版本提供了所有代码供您查看: http: //facebooksdk.codeplex.com/SourceControl/changeset/view/08cb51f372b5#Source/Facebook .Web/FacebookSubscriptionsHttpHandler.cs

新版本(版本 6.X)和版本 5 的最后几个分支可以在 GitHub 站点上找到 - https://github.com/facebook-csharp-sdk/facebook-csharp-sdk/tree/master/Source

随着源代码的可用性,您应该能够结合您使用此功能的方式,创建您自己ActionFilterAttribute的可以复制您以前拥有的功能的功能。

// --------------------------------
// <copyright file="FacebookSubscriptionVerifyAttribute.cs" company="Thuzi LLC (www.thuzi.com)">
//     Microsoft Public License (Ms-PL)
// </copyright>
// <author>Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me)</author>
// <license>Released under the terms of the Microsoft Public License (Ms-PL)</license>
// <website>http://facebooksdk.codeplex.com</website>
// ---------------------------------

namespace Facebook.Web.Mvc
{
using System.Web.Mvc;

public class FacebookSubscriptionVerifyAttribute : ActionFilterAttribute
{
    public string VerificationToken { get; set; }

    public FacebookSubscriptionVerifyAttribute(string verificationToken)
    {
        VerificationToken = verificationToken;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.ContentType = "text/plain";
        var request = filterContext.HttpContext.Request;
        var modelState = filterContext.Controller.ViewData.ModelState;

        string errorMessage;

        if (request.HttpMethod == "GET")
        {
            if (string.IsNullOrEmpty(VerificationToken))
            {
                errorMessage = "Verification Token is empty.";
            }
            else
            {
                if (FacebookSubscriptionVerifier.VerifyGetSubscription(request, VerificationToken, out errorMessage))
                {
                    return;
                }
            }
        }
        else
        {
            errorMessage = "Invalid http method.";
        }

        modelState.AddModelError("facebook-subscription", errorMessage);

        filterContext.HttpContext.Response.StatusCode = 401;
    }
}

}

以及 FacebookSubscriptionVerifier 类的代码

namespace Facebook.Web
{
    using System.Collections.Generic;
    using System.Diagnostics.Contracts;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Web;

    /// <summary>
    /// Facebook helper methods for web.
    /// </summary>
    internal static class FacebookSubscriptionVerifier
    {
        internal const string HTTP_X_HUB_SIGNATURE_KEY = "HTTP_X_HUB_SIGNATURE";

        internal static byte[] ComputeHmacSha1Hash(byte[] data, byte[] key)
        {
            Contract.Requires(data != null);
            Contract.Requires(key != null);
            Contract.Ensures(Contract.Result<byte[]>() != null);

            using (var crypto = new System.Security.Cryptography.HMACSHA1(key))
            {
                return crypto.ComputeHash(data);
            }
        }

        /// <summary>
        /// Verify HTTP_X_HUB_SIGNATURE.
        /// </summary>
        /// <param name="secret">
        /// The secret.
        /// </param>
        /// <param name="httpXHubSignature">
        /// The http x hub signature.
        /// </param>
        /// <param name="jsonString">
        /// The json string.
        /// </param>
        /// <returns>
        /// Returns true if validation is successful.
        /// </returns>
        internal static bool VerifyHttpXHubSignature(string secret, string httpXHubSignature, string jsonString)
        {
            Contract.Requires(!string.IsNullOrEmpty(secret));

            if (!string.IsNullOrEmpty(httpXHubSignature) && httpXHubSignature.StartsWith("sha1=") && httpXHubSignature.Length > 5 && !string.IsNullOrEmpty(jsonString))
            {
                // todo: test inner parts
                var expectedSignature = httpXHubSignature.Substring(5);

                var sha1 = ComputeHmacSha1Hash(Encoding.UTF8.GetBytes(jsonString), Encoding.UTF8.GetBytes(secret));

                var hashString = new StringBuilder();
                foreach (var b in sha1)
                {
                    hashString.Append(b.ToString("x2"));
                }

                if (expectedSignature == hashString.ToString())
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// Verify HTTP_X_HUB_SIGNATURE for http GET method.
        /// </summary>
        /// <param name="request">
        /// The http request.
        /// </param>
        /// <param name="verifyToken">
        /// The verify token.
        /// </param>
        /// <param name="errorMessage">
        /// The error message.
        /// </param>
        /// <returns>
        /// Returns true if successful otherwise false.
        /// </returns>
        internal static bool VerifyGetSubscription(HttpRequestBase request, string verifyToken, out string errorMessage)
        {
            Contract.Requires(request != null);
            Contract.Requires(request.HttpMethod == "GET");
            Contract.Requires(request.Params != null);
            Contract.Requires(!string.IsNullOrEmpty(verifyToken));

            errorMessage = null;

            if (request.Params["hub.mode"] == "subscribe")
            {
                if (request.Params["hub.verify_token"] == verifyToken)
                {
                    if (string.IsNullOrEmpty(request.Params["hub.challenge"]))
                    {
                        errorMessage = Properties.Resources.InvalidHubChallenge;
                    }
                    else
                    {
                        return true;
                    }
                }
                else
                {
                    errorMessage = Properties.Resources.InvalidVerifyToken;
                }
            }
            else
            {
                errorMessage = Properties.Resources.InvalidHubMode;
            }

            return false;
        }

        /// <summary>
        /// Verify HTTP_X_HUB_SIGNATURE for http POST method.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <param name="secret">
        /// The secret.
        /// </param>
        /// <param name="jsonString">
        /// The json string.
        /// </param>
        /// <param name="errorMessage">
        /// The error message.
        /// </param>
        /// <returns>
        /// Returns true if successful otherwise false.
        /// </returns>
        internal static bool VerifyPostSubscription(HttpRequestBase request, string secret, string jsonString, out string errorMessage)
        {
            Contract.Requires(request != null);
            Contract.Requires(request.HttpMethod == "POST");
            Contract.Requires(request.Params != null);
            Contract.Requires(!string.IsNullOrEmpty(secret));

            errorMessage = null;

            // signatures looks somewhat like "sha1=4594ae916543cece9de48e3289a5ab568f514b6a"
            var signature = request.Params["HTTP_X_HUB_SIGNATURE"];

            if (!string.IsNullOrEmpty(signature) && signature.StartsWith("sha1="))
            {
                var expectedSha1 = signature.Substring(5);

                if (string.IsNullOrEmpty(expectedSha1))
                {
                    errorMessage = Properties.Resources.InvalidHttpXHubSignature;
                }
                else
                {
                    if (string.IsNullOrEmpty(jsonString))
                    {
                        errorMessage = Properties.Resources.InvalidJsonString;
                        return false;
                    }

                    var sha1 = ComputeHmacSha1Hash(Encoding.UTF8.GetBytes(jsonString), Encoding.UTF8.GetBytes(secret));

                    var hashString = new StringBuilder();
                    foreach (var b in sha1)
                    {
                        hashString.Append(b.ToString("x2"));
                    }

                    if (expectedSha1 == hashString.ToString())
                    {
                        // todo: test
                        return true;
                    }

                    // todo: test
                    errorMessage = Properties.Resources.InvalidHttpXHubSignature;
                }
            }
            else
            {
                errorMessage = Properties.Resources.InvalidHttpXHubSignature;
            }

            return false;
        }
    }
}
于 2013-10-29T14:06:44.780 回答