Я хотел, чтобы мой API поддерживал AOT, поэтому решил отказаться от контроллеров MVC.
Однако мне не нравится подход с минимальным API, поэтому я решил написать собственное промежуточное программное обеспечение для ручной обработки запросов и ответов (с собственной генерацией кода, но это не важно).
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<MyRequestResponseMiddleware>();
Проблема в том, что аутентификация/авторизация перестала работать. HttpContext.User
не настроен, утверждения пусты, IsAuthenticated
всегда ложно даже после промежуточного программного обеспечения аутентификации/авторизации.
public async Task InvokeAsync(HttpContext context)
{
Debug.WriteLine(context.User.Identity.IsAuthenticated); //always false
}
Думаю, это имеет смысл. Я использую две схемы аутентификации и несколько политик, и я хочу вручную определить, какую политику необходимо применить к другому пути запроса, например:
//EXAMPLE
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.Value == "/auth-request")
{
var result = authenticationService.Authenticate("policyName");
//if authentication fails, return 401
//otherwise user is authenticated
//process request as usual
}
}
Но я понятия не имею, как это сделать.
Как MVC это делает? Как это делает минимальный API?
Как проверить аутентификацию/авторизацию, настроенную с помощью таких методов, как AddJwtBearer
,AddScheme
,AddAuthorization
,AddPolicy
и т. д. в пользовательском промежуточном программном обеспечении запросов/ответов?
Хорошо, это было проще, чем я ожидал.
using Microsoft.AspNetCore.Authentication;
namespace MyProject;
public class MyMiddleware(IAuthorizationService authorizationService)
{
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.Value == "/auth-request")
{
var authenticateResult = await context.AuthenticateAsync("myScheme");
if (authenticateResult.Succeeded)
{
//authenticated
context.User = authenticateResult.Principal;
var authorizeResult = await authorizationService.AuthorizeAsync(context.User, "myPolicy");
if (authorizeResult.Succeeded)
{
//authenticated and authorized
}
}
}
}
}