Мой базовый Request
класс выглядит следующим образом:
public class GetAllProjectsQuery : QueryBase<ProjectsListModel>
{
}
public abstract class QueryBase<T> : UserContext, IRequest<T> // IRequest is MediatR interface
{
}
public abstract class UserContext
{
public string ApplicationUserId { get; set; } // and other properties
}
Я хочу написать промежуточное программное обеспечение для моего .NET Core 3.1 WebApi
, которое будет извлекать JWT
из заголовка запроса и читать из него ApplicationUserId
. Я начал что-то кодировать:
public class UserInformation
{
private readonly RequestDelegate next;
public UserInformation(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var jwt = context.Request.Headers["Authorization"];
// read jwt here
var userContext = (UserContext)context.Request.Body; // i know it wont work
userContext.ApplicationUserId = //whats next? Any ideas?
await this.next(context);
}
}
Но, честно говоря, я не знаю, с чего начать, поэтому вот мои вопросы:
Как видите, каждый запрос будет упакован с моим UserContext
класс и тд. Как привести HttpContext.Request.Body
к моему объекту запроса и прикрепить к нему ApplicationUserId
? Является ли это возможным? Я хочу получить доступ к учетным данным пользователя из моего JWT из заголовков, и я хочу иметь эту информацию в каждом запросе в моем API (передать его контроллеру, затем команде et c).
Если получение этой информации из промежуточного программного обеспечения не является наилучшей практикой, что это такое?
РЕДАКТИРОВАТЬ: Mcontroller, использующий MediatR
:
// base controller:
[ApiController]
[Route("[controller]")]
public abstract class BaseController : ControllerBase
{
private IMediator mediator;
protected IMediator Mediator => this.mediator ?? (this.mediator = HttpContext.RequestServices.GetService<IMediator>());
}
// action in ProjectControlle
[HttpGet]
[Authorize]
public async Task<ActionResult<ProjectsListModel>> GetAllProjects()
{
return Ok(await base.Mediator.Send(new GetAllProjectsQuery()));
}
// query:
public class GetAllProjectsQuery : QueryBase<ProjectsListModel>
{
}
// handler:
public class GetAllProjectsQueryHandler : IRequestHandler<GetAllProjectsQuery, ProjectsListModel>
{
private readonly IProjectRepository projectRepository;
public GetAllProjectsQueryHandler(IProjectRepository projectRepository)
{
this.projectRepository = projectRepository;
}
public async Task<ProjectsListModel> Handle(GetAllProjectsQuery request, CancellationToken cancellationToken)
{
var projects = await this.projectRepository.GetAllProjectsWithTasksAsync();
return new ProjectsListModel
{
List = projects
};
}
}