繁体   English   中英

如何防止从asp.net mvc core中的url直接访问局部视图?

[英]How to prevent partial view direct access from url in asp.net mvc core?

我希望我在 asp.net mvc 核心中的部分视图只能通过 AJAX 请求使用。 我无法决定阻止我的部分视图直接从 URL 访问的逻辑。

我使用的一种方法是

[HttpPost]
public IActionResult Search(ListNSearchModel modelMain)
{ //....some logic...
 return PartialView();     
}

这使我的代码只能通过 Post Request 获得,但我认为这不是正确的方法。

您可以为控制器操作创建一个注释,以防止用户直接访问它。 请注意,无论请求是否来自Ajax,以下内容均应起作用(可以只是通过HTML助手调用一个动作以返回部分视图):

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDirectAccessAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.UrlReferrer == null ||
                    filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
            {
            filterContext.Result = new RedirectToRouteResult(new
                           RouteValueDictionary(new { controller = "Home", action = "Index", area = "" })); 
        }
    }
}

然后用它注释您的控制器操作,如下所示:

[HttpPost]
[NoDirectAccess]
public IActionResult Search(ListNSearchModel modelMain)
{ 
     return PartialView();     
}

X-Requested-With标头返回一个字符串,该字符串指示它是否是Ajax请求。 Ajax请求会将此标头设置为XMLHttpRequest 对于正常的GET和POST请求(非Ajax请求),此标头值将不存在。

因此,您可以只写如下属性:

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor actionDescriptor)
    {
        if (routeContext.HttpContext.Request.Headers != null &&
          routeContext.HttpContext.Request.Headers.ContainsKey("X-Requested-With") &&
          routeContext.HttpContext.Request.Headers.TryGetValue("X-Requested-With", out StringValues requestedWithHeader))
        {
            if (requestedWithHeader.Contains("XMLHttpRequest"))
            {
                return true;
            }
        }

        return false;
    }
}

然后像这样使用:

[AjaxOnlyAttribute]
public IActionResult Search()
{

    return PartialView();
}

或者您可以直接在特定操作中进行检查:

string method = HttpContext.Request.Method;

string requestedWith =
    HttpContext.Request.Headers["X-Requested-With"];

if (method == "POST")
{
    if (requestedWith == "XMLHttpRequest")
    {
        // code goes here
    }
}

只需在您的操作上方添加[ChildActionOnly]并应防止用户直接访问。

**[ChildActionOnly]**
[HttpPost]
public IActionResult Search(ListNSearchModel modelMain)
{ //....some logic...
 return PartialView();     
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM