asp.net-mvc-3 – 在facebook C#SDk 6.4中替换FacebookSubscriptionVerify

在最新版本的Facebook C#SDk 6.4中.我们可以使用FacebookSubscriptionVerify行动方法属性吗?因为这在FacebookClient类中不可用

我在我的MVC3项目中使用了旧版本的Facebok C#SDK.现在,切换到Facebook C#SDK 6.4后,这个类不可用.

我们有替代品吗?

最佳答案 我今天早上花了一点时间,确认你引用的属性在版本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;
        }
    }
}
点赞