c# - WebApi BaseController - 检查用户

标签 c# asp.net-web-api

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

相关文章:

c# - WebAPI OData $Skip 自定义 IQueryable 双应用

c# - 使用 Entity Framework 的最佳比较算法

c# - 从 C# Web api 方法下载 ZipArchive 在 chrome 中返回 "net::ERR_CONNECTION_RESET"

c# - 自动生成文档和继承

c# - 如何连接到 SDF 数据库?我尝试的连接字符串似乎没有用

c# - 索引未分析的映射无法使用嵌套

c# - 如何在我的 Visual Studio 2012 项目中引用 XML 文件作为项目代码中的数据源?

c# - 在卸载期间(卸载前)从自定义安装程序获取对 AppSettings 的访问权限

c# - BindableBase 在经典 MVVM 设计中的使用

javascript - 使用 Angular JS $http.post() 将 json 数据发布到 WCF REST 在 Chrome 中失败但在 IE 中成功