我为我的应用程序创建了一个自定义授权属性类,以测试是否允许用户访问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;
}
}
我在这里看到很多关于类似主题的问题,但似乎都没有解决我在这里遇到的问题。
答案 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") };
}
}
}