我有以下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作为参数的所有端点上进行此验证吗?
答案 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()
{
//...
}
}
之后,您的行动中不需要其他代码