.net-core промежуточное ПО возвращает пустой результат

Я делаю сайт с API, API требует проверки, поэтому пользователь получает только свои данные. Я написал следующее промежуточное ПО для проверки логина.

public class ApiAuthenticationMiddleware
{
    private readonly RequestDelegate _next;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public ApiAuthenticationMiddleware(RequestDelegate next,
        SignInManager<ApplicationUser> signInManager,
        UserManager<ApplicationUser> usermanager)
    {
        _next = next;
        _signInManager = signInManager;
        _userManager = usermanager;
    }

    public async  Task Invoke(HttpContext context)
    {
        if (!context.Request.Query.ContainsKey("password") || !context.Request.Query.ContainsKey("email"))
        {
            context.Response.StatusCode = 401; //UnAuthorized
            await context.Response.WriteAsync("Invalid User Key");
            return;
        }
        var email = context.Request.Query["email"];
        var password = context.Request.Query["password"];

        var result = await _signInManager.PasswordSignInAsync(email, password, false, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            await _next.Invoke(context);
        }
        else if (//some more checks)
            context.Response.StatusCode = 401; //UnAuthorized
            await context.Response.WriteAsync("Invalid User Key");
            return;
        }
    }
}

Я хочу, чтобы пустая страница или сообщение об ошибке, например "Неверный ключ пользователя", отображались, если у пользователя нет действительного имени пользователя. Однако в данный момент происходит возвращение домашней страницы (потому что мое промежуточное программное обеспечение вызывается перед usemvc, а оператор return пропускает запрос контроллера, выполненный usemvc).

Мой соответствующий код в методе настройки в startup.cs

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        app.UseIdentity();
        app.UseWhen(x => (x.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase)),
            builder =>
            {
                builder.UseMiddleware<ApiAuthenticationMiddleware>();
            });
        app.UseStaticFiles();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Как заставить промежуточное ПО возвращать пустую страницу с кодом состояния?

Обновление

Попробовав много вещей, я обнаружил, что при удалении:

 context.Response.StatusCode = 401; //UnAuthorized

Он работает как положено, пользователь получает сообщение, указанное в:

await context.Response.WriteAsync("Invalid User Key"); 

Но я не хочу, чтобы пользователь получал 200 кодов состояния при неудачном входе в систему, но 401 код статуса. Но при использовании строки кода состояния пользователь перенаправляется. Итак, как я могу отправить код состояния без перенаправления?

Ответы

Ответ 1

У меня есть догадка, что app.UseIdentity() имеет поведение по умолчанию, когда возникает 403/401, он перехватит ответ и инициирует перенаправление. Попробуйте прокомментировать это и посмотрите, работает ли он.

Альтернативное решение: fooobar.com/questions/359845/...

Последний комментарий: Я настоятельно рекомендую не передавать учетные данные для каждого запроса. Я рекомендую использовать предварительно созданные провайдеры auth и реализовать в качестве вашего промежуточного программного обеспечения. Атрибут Authorize должен быть достаточным для сделанных запросов и может делать то, что вы ищете. Если вы хотите вернуть что-то особенное, вы можете переопределить ответ с помощью промежуточного программного обеспечения, например, промежуточное ПО app.UseIdentity() может быть перенаправлено.

Ответ 2

Попробуйте использовать .Clear() перед установкой StatusCode.

            context.Response.Clear();
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            await context.Response.WriteAsync("Unauthorized");

Ответ 3

Вы также должны установить ContentType. Примерно так:

        context.Response.ContentType = "text/plain";
        context.Response.StatusCode = 401; //UnAuthorized
        await context.Response.WriteAsync("Invalid User Key");