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); 
     } 


    }