Проблема
В ASP.NET Core 2.2 я внедряю AuthorizationHandler (где у меня есть доступ к HttpContext входящего запроса).
Как вызвать ту же привязку моделидля параметров запроса, который используется MVC из этого AuthorizationHandler?
В идеале я хотел бы написать метод расширения, который позволяет мне написать что-то вроде:
HttpContext.Request.Query.BindValue<ICollection<MembershipType>>("membershipType");
, который возвращает новый экземпляриз ICollection<MembershipType>
на основе параметров запроса с именем "membersType" (и где MembershipType
- это перечисление).
Фон
Предположим, у меня есть действие контроллера, где сложная модельвыполняется привязка для параметров запроса, например, что-то вроде этого (MembershipType
- это перечисление):
[HttpGet]
[Authorize("MyPolicyThatUsesMyRequirement")]
public Task<ActionResult<List<Member>>> GetMembers([FromQuery] ICollection<MembershipType> membershipTypeFilter = null)
{
// skipping actual implementation
}
Теперь я хочу создать AuthorizationHandler, который будет успешным только для определенных комбинаций записей membershipTypeFilter
и пользователяроли.Это означает, что в моем AuthorizationHandler мне нужно получить доступ к параметру membersTypeFilter.
Давайте рассмотрим следующий скелет AuthorizationHandler:
class MyRequirement : AuthorizationHandler<MyRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
{
var mvcContext = context.Resource as AuthorizationFilterContext;
// TODO: need access to query parameters here
return Task.CompletedTask;
}
}
mvcContext.HttpContext.Request.Query
дает мне доступ к запросупараметры, но только в виде словаря строковых массивов.Конечно, я мог бы разобрать эту коллекцию строк и каким-то образом превратить ее в коллекцию значений enum.Но в этом сценарии крайне важно, чтобы это преобразование выполнялось точно так же, как это делается, когда MVC вызывает мое действие контроллера.Поэтому я ищу способ вызвать тот же механизм связывания, что и MVC.