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

时间:2017-01-03 21:24:08

标签: c# asp.net-mvc-4 authorize-attribute

我为我的应用程序创建了一个自定义授权属性类,以测试是否允许用户访问API路由。我正在测试的用户拥有此类将测试删除的所有权限,但是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;
    }
}

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

2 个答案:

答案 0 :(得分:0)

我认为你忘了把:

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();
}

答案 1 :(得分:0)

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") };
        }
    }
}