WebApi BaseController - 检查用户

时间:2015-01-16 16:02:11

标签: c# asp.net-web-api

我有以下BaseApiController:

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作为参数的所有端点上进行此验证吗?

1 个答案:

答案 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()
    {
        //...
    }
}

之后,您的行动中不需要其他代码