1

我必须实现自定义授权过滤器。ASP.NET MVC - 如何在自定义授权过滤器中获取命名空间?

(用于检查被授权,需要命名空间,控制器名称和动作名称)

我不设法获取命名空间。这里是我的代码:

ExampleController.cs:

namespace ExampleProject.Controllers 
{ 
    public class ExampleController : Controller 
    { 
     [CustomAuth()]    
     public string Index() 
     {   
      return "OK"; 
     } 
    } 
} 

CustomAuthFilter.cs:

namespace ExampleProject.Infrastructure.Filters 
{ 
    public class CustomAuthAttribute : AuthorizeAttribute 
    { 
      protected override bool AuthorizeCore(HttpContextBase httpContext) 
      { 
       string currentNamespace = string.Empty; 
       string currentController = string.Empty; 
       string currentAction = string.Empty; 

       var routeData = httpContext.Request.RequestContext.RouteData; 

       currentController = routeData.GetRequiredString("controller"); //Example 
       currentAction = routeData.GetRequiredString("action");   //Index 

       currentNamespace = How??????? // ExampleProject.Controllers 

       ... 
      } 
    } 
} 

我怎样才能获得的命名空间?

非常感谢提前。

+0

你想用命名空间做什么? – ssilas777 2013-03-02 10:40:01

回答

0

约定优于配置

如果您遵守这一点,你可以很容易得到ExampleProject.Controllers,因为所有的控制器Controllers文件夹,如果你不改变手动这一约定您安全地得到控制的命名空间,但如果更改命名空间

public class CustomAuthAttribute : AuthorizeAttribute 
    { 
     public string controllerFullName { get; set; } 
     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      string currentNamespace = string.Empty; 
      string currentController = string.Empty; 
      string currentAction = string.Empty; 

      var routeData = httpContext.Request.RequestContext.RouteData; 

      currentController = routeData.GetRequiredString("controller"); //Example 
      currentAction = routeData.GetRequiredString("action"); //Index 
      currentNamespace = controllerFullName.Substring(0, controllerFullName.IndexOf("." + currentController, System.StringComparison.Ordinal)); 

      return false; 
     } 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      controllerFullName = filterContext.Controller.ToString(); 
      base.OnAuthorization(filterContext); 
     } 


    }