我有一个使用MVC 4.5的ASP.NET MVC应用程序。我被指示将查询字符串授权放到应用程序中。该应用程序充当前端另一个应用程序的数据处理器。
我们决定在包含例如http://dr.appbox.us/DataReport/?passcode=HASHCODE的哈希码的请求URL中附加查询字符串。
可以检查HASHCODE,如果匹配,则允许进一步。 现在我在应用程序中有大约20个控制器,有没有办法可以检查HASHCODE在global.asax中是否有效并将用户从那里重定向到错误页面?
另外请告诉我是否有办法检查是否可以绕过应用程序中的Ajax请求的哈希码。
由于
答案 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
。 (参见文档here和here以及分步教程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