2017-05-03 77 views
0

我爲我的API創建了認證過濾器,它將驗證auth頭以確保用戶可以訪問該API。但是,我也有權限設置端點,這將允許用戶閱讀,但不能寫等我希望能夠在這裏執行此身份驗證,如果它失敗,我可以殺死請求。爲此,我需要知道控制器和操作值。我有權訪問url字符串,但我不願意自己解析這個,除非我必須。從ASP.NET API中的認證過濾器訪問路由信息

我已經使用從AuthenticateAsync方法

var requestcontext = context.Request.GetRequestContext(); 
string actionName = requestcontext.RouteData.Values["action"].ToString(); 
string controllerName = requestcontext.RouteData.Values["controller"].ToString(); 

這將返回一個問題,因爲控制器和操作鍵都沒有設置這時裏面下面的代碼嘗試。有沒有辦法強制他們設置?意思是說,我可以調用的方法是強制.NET立即設置路由數據,而不是稍後,允許我訪問值?

如果這是不可能的。我怎麼能夠實現這個目標?我試圖創建一個基本的APIController,在這裏我嘗試添加以下內容。

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
//check the route data and validate 
} 

由於APIController不支持此方法,因此無法正常工作。假設它是MVC控制器的一部分,而不是API。我嘗試過使用MVC的各種其他覆蓋,但它們不適用於API控制器。我寧願能夠在過濾器中處理所有這些,所以我不需要使用控制器,但是如果這是實現它的唯一方法,那麼它是如何完成的?

+1

我有同樣的問題,你可以找到我的問題的一些答案:http://stackoverflow.com/questions/18248547/get-controller-and-action-name-from-within-controller – Robert

回答

0

以下代碼用於在認證過程中獲取操作和控制器數據。

public class MyCustomFilter : IAuthenticationFilter 
{ 
    public bool AllowMultiple { get; } 

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     string actionName = context.ActionContext.ActionDescriptor.ActionName; 
     string controllerName = context.ActionContext.ControllerContext.ControllerDescriptor.ControllerName; 
    } 
}