从AuthenticateRequest

时间:2017-04-05 18:09:47

标签: c# asp.net-mvc authentication

在我的web.configconfiguration - > system.webServer - > modules并添加了一个名为BasicAuthHttpModule的模块。这有一个Init事件,它分配一个AuthenticateRequest处理程序。

public void Init(HttpApplication context) {
   context.AuthenticateRequest += OnApplicationAuthenticateRequest;
   context.EndRequest += OnApplicationEndRequest;
}

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) {
   // Find the controller name here
   var request = HttpContext.Current.Request;
}

在上面的代码中,OnApplicationAuthenticateRequest检查request.Headers["Authorization"]并确保用户有效。我确实希望特定控制器发生这种情况。我尝试将AllowAnonymous属性添加到它及其方法中。没有变化。

如何找到控制器? RequestContext.RouteData不包含任何内容。我可以查看请求的URL,但我不想像字符串那样解析它。看似hacky。此外, server / ControllerWithoutAccess / Index?ControllerWithAccess = 1 将包含允许匿名访问的控制器名称,但实际上会引用不同的控制器。

[编辑]: ((System.Web.HttpApplication)sender).Context.Request指向代码中的request变量。他们是一样的。同时,request.RequestContext.RouteData的空Route,空RouteHandlerValues包含0项。

1 个答案:

答案 0 :(得分:1)

鉴于您似乎缺少Route详细信息,我认为您只需根据当前上下文重新创建路由表:

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e) 
{
    var context = ((HttpApplication)sender).Context;
    var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context)); 
    var controllerName = routeData.Values["controller"];
    ...
}

请记住,此事件可能会针对每个图像,CSS,脚本文件触发,因此这可能是一项昂贵的操作。您可能希望更多地询问请求上下文,以便明智地决定是否需要运行更昂贵的代码。