Global.asax 中的拦截请求

Intercepting Request in Global.asax

我有一个使用 MVC 4.5 的 ASP.NET MVC 应用程序。我已被指示对应用程序进行查询字符串授权。该应用程序作为前端另一个应用程序的数据处理器。

我们决定在包含哈希码的请求 URL 中附加一个查询字符串,例如 http://dr.appbox.us/DataReport/?passcode=HASHCODE

可以检查哈希码,如果匹配则允许进一步请求。 现在我在应用程序中有大约 20 个控制器,有没有一种方法可以检查 HASHCODE 在 global.asax 中是否有效并将用户从那里重定向到错误页面?

另外请告诉我是否有办法检查我是否可以绕过应用程序中 Ajax 请求的哈希码。

谢谢

is there a way that I can check if the HASHCODE is valid in global.asax and redirect the user to error page from there

我会使用 HttpHandler which is better suitable for this. (See documentation here and here and step-by-step tutorial here)

Also please tell me if there is a way to check if I can bypass this hashcode for Ajax requests in the application.

您可以检查 HttpContext.Current.Request.Headers["x-requested-with"] 是否为 XMLHttpRequest。然后是 AJAX 调用,您可以跳过身份验证步骤。此外,您可以在第一次收到哈希码时设置一个会话变量,并在 AJAX 请求完成后检查该哈希码是否仍然有效。那么你将拥有比不检查它更好的安全性。

在我看来,您应该考虑实施 IAuthorizationFilter 而不是尝试使用 Global.asax。 IAuthorizationFilter 的实现将在任何请求之前 运行,如果哈希码无效,您可以选择要执行的操作。

您可以为此使用自定义操作过滤器。如果您创建一个新的 class 继承自 ActionFilterAttribute 并覆盖 OnActionExecuting 方法。您可以在此处验证密码并根据需要重定向。

public class HashCodeCheckFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var passcode = filterContext.HttpContext.Request.QueryString["passcode"];
        // Validate passcode
        var valid = false;

        // If invalid then do some error processing
        if (!valid)
        {
            // Redirect to errro page....
            filterContext.Result = new RedirectToRouteResult("NameOfErrorRoute");
            return;
        }

        base.OnActionExecuting(filterContext);
    }
}

然后您可以在特定的控制器/操作上将其用作属性:

[HashCodeCheckFilter]
public class HomeController : Controller
{
    // GET: Home
    [HashCodeCheckFilter]
    public ActionResult Index()
    {
        return View();
    }
}

或者您可以在Application_Start(或App_Start/FilterConfig)中将其注册为适用于所有请求的全局过滤器:

GlobalFilters.Filters.Add(new HashCodeCheckFilterAttribute());

如果您不想检查请求是否为 ajax 请求,您可以检查请求中的 HTTP_X_REQUESTED_WITH header 是否等于 xmlhttprequest

由于您使用的是 asp.net MVC,因此我会在您的应用程序中查看全局操作过滤器。您可以通过 global.asax 将动作过滤器注册为全局动作过滤器。

GlobalFilters.Filters.Add(new MyActionFilterAttribute());

在您的操作过滤器中,您可以放置​​代码来检查您的哈希值,每次在控制器上调用您的任何操作时都会执行此代码。

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            // CHECK HASH HERE
        }
        base.OnActionExecuting(filterContext);
    }
}

查看这些资源以获取更多信息

http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-global-action-filters https://msdn.microsoft.com/en-us/library/system.web.mvc.globalfiltercollection(v=vs.98).aspx