Shopify允许将页面嵌入到管理站点中,为此我可以使用ASP.NET MVC创建页面并获取Shopify管理面板中显示的页面。
要验证页面请求是否有效且Shopify是否请求,在处理请求和呈现页面之前,页面必须验证查询字符串中发送的一些参数。
Shopify发送一个hmac参数,这样我就可以计算出相同的参数,并验证两者是否相等。
我正在使用 Asp.Net Mvc 5 并使用AuthorizeAttribute
类,但现在我正在使用 Asp.Net Core ,似乎授权过滤器已更改。
我已经阅读了一些关于Asp.Net Core中新授权系统如何的文章,但我无法确定最佳方法。
克里特岛自定义属性,以便我可以将它添加到我的控制器。当Shopify调用我的页面时,我需要在控制器操作开始处理请求之前验证查询字符串参数,如果请求无效,则不调用控制器操作,但如果请求有效则授权并让控制器操作执行和呈现页面。
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
}
}
}