2015-01-16 24 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