在我的web.config
我configuration
- > 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
,空RouteHandler
和Values
包含0项。
答案 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,脚本文件触发,因此这可能是一项昂贵的操作。您可能希望更多地询问请求上下文,以便明智地决定是否需要运行更昂贵的代码。