验证查询字符串参数以验证ASP.NET CORE请求的正确方法

时间:2017-07-24 17:07:08

标签: asp.net asp.net-mvc asp.net-core shopify asp.net-authorization

Shopify允许将页面嵌入到管理站点中,为此我可以使用ASP.NET MVC创建页面并获取Shopify管理面板中显示的页面。

要验证页面请求是否有效且Shopify是否请求,在处理请求和呈现页面之前,页面必须验证查询字符串中发送的一些参数。

Shopify发送一个hmac参数,这样我就可以计算出相同的参数,并验证两者是否相等。

我正在使用 Asp.Net Mvc 5 并使用AuthorizeAttribute类,但现在我正在使用 Asp.Net Core ,似乎授权过滤器已更改。

我已经阅读了一些关于Asp.Net Core中新授权系统如何的文章,但我无法确定最佳方法。

所以最后我需要:

克里特岛自定义属性,以便我可以将它添加到我的控制器。当Shopify调用我的页面时,我需要在控制器操作开始处理请求之前验证查询字符串参数,如果请求无效,则不调用控制器操作,但如果请求有效则授权并让控制器操作执行和呈现页面。

我在Asp.Net MVC 5中的当前过滤器是这样的:

namespace MyShopifyApp.Filters
{
    public class EmbeddedAppAuthAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        { 
            //Validates if the nonce/state from the query string is correct
            var stateParameter = httpContext.Request.QueryString["state"];
            var nonce = ShopifyHelper.AuthorizationNonceManager.GetNonce(ProjectSettings.ShopifyShopUrl);

            if (!string.IsNullOrEmpty(stateParameter))
            {
                if (string.IsNullOrEmpty(nonce) || stateParameter != nonce)
                {
                    return false;
                }
            }

            //Validates if the shop parameter from the query string is valid
            var shopParameter = httpContext.Request.QueryString["shop"];
            if (!ProjectSettings.IsValidShop(shopParameter))
                return false;

            //Calculates a HMAC signature and validates if the request is really from Shopify
            if (!ShopifyAuthorizationService.IsAuthenticRequest(httpContext.Request.QueryString, ProjectSettings.ShopifyAdminAppApiSecret))
                return false;

            //Everything is correct so allow the request to continue
            return true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

        }
    }
}

这是一个示例控制器:

namespace MyShopifyApp.Controllers
{
    [EmbeddedAppAuth]
    public class MyController : Controller
    {
        public async Task<ActionResult> Index(string hmac, string shop, string signature, string timeStamp, string protocol)
        {
            //Do something here only if the request is authentic and sent by Shopify
        }
    }
}

0 个答案:

没有答案