自定义 AuthorizeAttribute 应该失败但 API 运行

custom AuthorizeAttribute should be failing but API runs

我为我的应用程序创建了自定义授权属性 class,以测试是否允许用户访问 API 路由。我正在测试的用户拥有此 class 将测试删除的所有权限,但是 api 仍然是 运行。我做错了什么?

UserActionsDictionary 以租户 ID 作为键和操作字符串列表。

using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Application {
    public class HasActionAttribute : AuthorizeAttribute {

        public string Actions { get; set; }
        protected override bool AuthorizeCore(HttpContextBase httpContext) {
            UserCache userCache = HELPERS.GetCurrentUserCache();
            return userCache.UserActionsDictionary[userCache.CurrentTenantID.ToString()].Intersect(Actions.Split(',').ToList()).Any();
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
            filterContext.Result = new HttpUnauthorizedResult("Action not allowed for the current user");
        }
    }
}

并且在控制器中。我正在测试是什么原因导致授权在路由中失败,它甚至不应该进入,但是有了断点,我看到测试结果为假。

[Authorize]
public class TestController : ApiController {

    [Route("api/Test/TestRoute")]
    [HttpGet]
    [HasAction(Actions="Test Action")]
    public dynamic Test(){
        UserCache userCache = HELPERS.GetCurrentUserCache();
        bool test = userCache.UserActionsDictionary[userCache.CurrentTenantID.ToString()].Intersect("Test Action".Split(',').ToList()).Any();
        return test;
    }
}

我在这里看到很多关于类似主题的问题,但 none 似乎解决了我在这里遇到的问题。

我想你忘了把:

GlobalFilters.Filters.Add(new HasActionAttribute()); 

~/App_Start/FilterConfig.cs 中。

FilterConfig 用于管理全局过滤器。

更新:

并更改检查空参数的方法:

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    if(string.IsNullOrWhiteSpace(Actions))
    {
        return true;
    }
    UserCache userCache = HELPERS.GetCurrentUserCache();
    return userCache.UserActionsDictionary[userCache.CurrentTenantID.ToString()].Intersect(Actions.Split(',').ToList()).Any();
}

haim770 主要在问题评论中回答了我的问题,所以我会把完整的答案放在这里,以供其他有类似问题的人使用。

我继承错了AuthorizeAttribute。我需要从 System.Web.Http 而不是 System.Web.MVC 继承。该属性的最终代码如下。

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Controllers;

namespace Application {
    public class HasActionAttribute : AuthorizeAttribute {

        public string Actions { get; set; }
        public override void OnAuthorization(HttpActionContext actionContext) {
            UserCache userCache = HELPERS.GetCurrentUserCache();
            List<string> actionsList = Actions.Split(',').Select(a=>a.Trim(' ')).ToList();
            if (!userCache.UserActionsDictionary[userCache.CurrentTenantID.ToString()].Intersect(actionsList).Any()) {
                HandleUnauthorizedRequest(actionContext);
            }
        }

        protected override void HandleUnauthorizedRequest(HttpActionContext filterContext) {
            filterContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("Action not allowed for the current user") };
        }
    }
}