Skip to main content
 首页 » 编程设计

c#之WebApi BaseController之检查用户

2024年08月06日52over140

我有以下 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() 
    { 
        //... 
    } 
} 

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