.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");