[英]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.