gpt4 book ai didi

c# - WebApi BaseController - 检查用户

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:17 25 4
gpt4 key购买 nike

我有以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com