自定义 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") };
}
}
}
我为我的应用程序创建了自定义授权属性 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") };
}
}
}