C# WebApi BaseController-正在检查用户

C# WebApi BaseController-正在检查用户,c#,asp.net-web-api,C#,Asp.net Web Api,我有以下BaseApiController: public class BaseApiController : ApiController { public readonly Current _current { get; private set; } } 我所有的apicontroller都继承自这个 我需要在我的ApiControllers中的所有方法中进行验证,以检查传递的userId是否与当前的HttpContext.current.User.Identity匹配 [Route

我有以下BaseApiController:

public class BaseApiController : ApiController
{
    public readonly Current _current { get; private set; }
}
我所有的
apicontroller
都继承自这个

我需要在我的
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上执行此操作,以便我可以避免在所有接收用户ID作为参数的端点上执行此验证?

您可以基于创建自定义验证属性来实现所需的功能

对于您的情况,它可以如下所示:

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()
    {
        //...
    }
}
[授权]
[RoutePrefix(“api/账户”)]
[UserAccessCheck]//检查控制器中所有操作的用户id
公共类AccountController:BaseApiController
{
//....
}
公共类值控制器:BaseApiController
{
//....
[UserAccessCheck]//仅检查特定操作的用户id
公共IEnumerable Get()
{
//...
}
}

在此之后,您的操作中不需要额外的代码

验证实际上应该做什么?您可以创建一个受保护的方法并调用它。属性可能也很有趣。验证是检查管道上的令牌/声明是否与Api使用者发送的{userId}匹配。我知道验证的是什么,但应该执行什么操作?每次调用都是一样的吗?哦,对不起。它总是返回相同的
返回请求.CreateErrorResponse(HttpStatusCode.Forbidden,“Unauthorized”)@jeroenvanevel我更新了我的问题。也许这有助于理解我在说什么这是个好主意,但是我得到了这个错误:
System.Net.Http.HttpRequestMessage”不包含“CreateErrorResponse”的定义,并且在actionContext.Request上找不到接受第一个参数类型为“System.Net.Http.HttpRequestMessage”的扩展方法“CreateErrorResponse”。CreateErrorResponse@user3362714这是你的支票使用中的System.Net.Http命名空间