Я создал специальный класс атрибутов авторизации для своего приложения, чтобы проверить, разрешен ли пользователю доступ к маршруту API. Пользователь, с которым я тестирую, имел все разрешения, которые этот класс будет тестировать для удаления, однако api все еще работает. Что я делаю не так?Пользовательский авторизованный атрибут должен быть неудачным, но API работает
UserActionsDictionary имеет идентификаторы арендаторов в качестве ключей и список строк для действий.
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;
}
}
Я вижу здесь много вопросов по поводу подобных тем, но ни один из них не рассматривает проблему, которую я здесь.
Похоже, вы наследуете неправильный 'AuthorizeAttribute'. Вам нужно наследовать от 'System.Web.Http' не' System.Web.Mvc' (поскольку это контроллер WebAPI). – haim770
@ haim770 System.Web.Http, похоже, не имеет того, что мне нужно переопределить. если мне нужно наследовать от System.Web.Http, это меняет вопрос на то, как я реализую то, что я пытаюсь сделать? – Andrew
Они разные, но вы можете добиться точного результата при наследовании от 'System.Web.Http.AutroizeAttribute'. См. Https://msdn.microsoft.com/en-us/library/system.web.http.authorizeattribute(v=vs.118).aspx и http://stackoverflow.com/questions/12629530/how-to- customize-asp-net-web-api-authorizeattribute для необычных требований – haim770