Asp.net core 如何禁用从url直接访问视图?

Asp.net core 如何禁用从url直接访问视图?,asp.net-core,Asp.net Core,我的asp net核心应用程序中有两个视图。第一个视图称为customer,第二个视图称为payment。我想禁用用户可以通过在浏览器中键入url“”获得直接访问权限的功能 如果用户试图直接访问名为“付款”的视图,我希望将用户重定向到名为“客户”的视图 我该怎么做呢。我不知道。您可以创建一个过滤器,如下所示: public class NoDirectAccessAttribute:ActionFilterAttribute { public override void OnActio

我的asp net核心应用程序中有两个视图。第一个视图称为customer,第二个视图称为payment。我想禁用用户可以通过在浏览器中键入url“”获得直接访问权限的功能

如果用户试图直接访问名为“付款”的视图,我希望将用户重定向到名为“客户”的视图


我该怎么做呢。我不知道。

您可以创建一个过滤器,如下所示:

 public class NoDirectAccessAttribute:ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var canAccess = false;

        //check the refer
        var referer = context.HttpContext.Request.Headers["Referer"].ToString();
        if(!string.IsNullOrEmpty(referer))
        {
            var request = context.HttpContext.Request;
            var rUri = new System.UriBuilder(referer).Uri;
            if(request.Host.Host==rUri.Host && request.Host.Port==rUri.Port && request.Scheme==rUri.Scheme)
            {
                canAccess = true;
            }
        }

        // ... check other requirements

        if (!canAccess)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index", area = "" }));
        }
    }
}
然后可以将
NoDirectAccess
属性应用于特定操作

[NoDirectAccess]
public IActionResult Privacy()
{
   return View();
}

这不是它的工作原理。从POST返回重定向时,重定向由浏览器执行,而不是由服务器执行。服务器告诉浏览器URL,浏览器就到了。因为URL必须以一种可以告知浏览器的形式存在,用户可以直接在那里导航,如果他们愿意的话。也就是说,你可能想要。@GSerg,我不明白你所说的与这个问题有什么关系@mehpir,我能想到的最简单的解决方案是用
[HttpPost]
装饰动作,这将阻止任何GET访问页面,这就是我认为您所说的直接访问。我还假设您正在发布到付款页面。或者,您可以在付款操作中执行
重定向到操作(“客户”)
。这可能需要检查传递给操作的任何状态是否有效,如果无效则重定向。@Gup3rSuR4c
RedirectToAction
指示浏览器转到页面并给出URL。恶意用户可以随时拦截标题并手动导航到页面,而无需先访问以前的页面。不管它是get还是post,因为它同样容易伪造。据我所知,OP正在询问如何防止这种情况发生,因此除非从客户页面调用,否则无法访问支付URL。OP在他的问题中非常清楚。他希望防止用户直接键入支付页面的URL,这是一个GET请求。用HttpPost进行装饰可以阻止这种情况。防范恶意黑客用户(如您所指的用户)是断章取义的。虽然这是一个合理的担忧,但不是OP所要求的。除此之外的防护可能意味着任何事情,例如支付中的数据验证、用户身份验证、来自客户页面的加密令牌以及数据保护API等等……因此,解决这一问题所需的全部工作就是提供正确的
引用程序。