Как предотвратить частичный просмотр прямого доступа с URL в ядре asp.net mvc? - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу, чтобы мое частичное представление в ядре asp.net mvc было доступно только через запрос AJAX.Я не могу определить логику, чтобы предотвратить прямой доступ к моему частичному представлению с URL.

Один из подходов, который я использовал, был

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

. Это сделало мой код доступным только через почтовый запрос, ноЯ не думаю, что это правильный путь.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Заголовок 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
    }
}
0 голосов
/ 28 февраля 2019

Вы можете создать аннотацию для действия вашего контроллера, которая будет препятствовать непосредственному доступу пользователей к нему.Обратите внимание, что следующее должно работать независимо от того, исходит ли запрос от 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();     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...