隐藏

Global.asax中的拦截请求

发布:2022/6/30 13:33:35作者:管理员 来源:本站 浏览次数:889

我有一个使用MVC 4.5的ASP.NET MVC应用程序。我被指示将查询字符串授权放到应用程序中。该应用程序充当前端另一个应用程序的数据处理器。

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

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

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

由于

4 个答案:

答案 0 :(得分:2)

您可以为此使用自定义操作过滤器。如果您创建一个继承自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标头,看它是否等于xmlhttprequest

答案 1 :(得分:0)

  

有没有办法可以检查HASHCODE在global.asax中是否有效,并将用户从那里重定向到错误页面

我会使用更适合此的HttpHandler。 (参见文档herehere以及分步教程here

  

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

由于你使用的是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