我有以下 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 作为参数的端点上执行此验证?
最佳答案
您可以根据 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 检查的地方装饰 Controller 或特定操作:
[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()
{
//...
}
}
之后您的操作中不需要额外的代码
关于c# - WebApi BaseController - 检查用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987946/