如何在asp.net mvc核心中阻止从URL进行部分视图直接访问?

时间:2019-02-28 15:23:37

标签: c# asp.net-mvc asp.net-core-mvc

我希望我的asp.net mvc内核中的局部视图只能通过AJAX请求获得。我无法确定阻止从URL直接访问局部视图的逻辑。

我使用的一种方法是

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

这使我的代码只能通过“发帖请求”获得,但我认为这不是正确的方法。

3 个答案:

答案 0 :(得分:1)

您可以为控制器操作创建一个注释,以防止用户直接访问它。请注意,无论请求是否来自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();     
}

答案 1 :(得分:1)

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
    }
}

答案 2 :(得分:1)

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

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