2015-01-16 23 views
1

我有以下BaseApiController:從這個的WebAPI BaseController - 檢查用戶

public class BaseApiController : ApiController 
{ 
    public readonly Current _current { get; private set; } 
} 

我所有的ApiControllers繼承。

我需要在我的ApiControllers中的所有方法中進行驗證,該驗證檢查userId是否通過匹配當前的HttpContext.Current.User.Identity。

[Route("{userId}/cars")] 
public HttpResponseMessage GetCars(int userId) 
{ 
    if (userId != _current.UserId) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.Forbidden,      "Unauthorized"); 
    } 
} 

反正有這樣做的BaseApiController,讓我能避免對所有收到的userid參數端點這樣做驗證?

+2

驗證實際上應該做什麼?你可以製作一個受保護的方法並調用它。屬性可能很有趣,也可以看一下。 –

+0

該驗證用於檢查管道上的令牌/聲明是否與Api消費者發送的{userId}匹配。 – user3362714

+0

我知道什麼正在驗證,但應執行什麼操作?每次調用這個動作都一樣嗎? –

回答

3

您可以根據ActionFilterAttribute創建自定義驗證屬性以實現您所需的功能。

對於您的情況下,它可以是這樣的:

public class UserAccessCheckAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var controller = actionContext.ControllerContext.Controller as BaseApiController; 
     object requestUserIdObj; 

     if (controller != null && actionContext.ActionArguments.TryGetValue("userId", out requestUserIdObj)) 
     { 
      var userId = (int) requestUserIdObj; 

      if (userId != controller._current.UserId) 
      { 
       actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Unauthorized"); 
      } 
     } 
    } 
} 

之後,你可以裝飾你需要與此屬性進行用戶ID檢查或者控制器或具體行動:

[Authorize] 
[RoutePrefix("api/Account")] 
[UserAccessCheck] //check user id for all actions in controller 
public class AccountController : BaseApiController 
{ 
    //.... 
} 

public class ValuesController : BaseApiController 
{ 
    //.... 
    [UserAccessCheck] //check user id for specific action only 
    public IEnumerable<string> Get() 
    { 
     //... 
    } 
} 

後在您的操作中不需要額外的代碼

+0

這是一個好主意,但我得到這個錯誤:''System.Net.Http.HttpRequestMessage'沒有包含'CreateErrorResponse'的定義,也沒有接受'System.Net'類型的第一個參數的擴展方法'CreateErrorResponse'。可以在** actionContext.Request.CreateErrorResponse ** – user3362714

+1

@ user3362714上找到Http.HttpRequestMessage'檢查是否在您使用的System.Net.Http命名空間 – Imortist

+0

賓果。非常感謝 – user3362714