Моим приложением по умолчанию является web-api на C#, который использует Microsoft.Owin.Security.OAuth для аутентификации пользователя. Я строю свою собственную реализацию OAuthAuthorizationServerProvider. Мой метод GrantResourceOwnerCredentials
выглядит следующим образом:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
//this method searches for user in database
var user = await accountService.LoginAsync(context.UserName, context.Password);
if (user != null)
{
if (user.Password == "-1")
{
//here i want to set different HTTPStatusCode for user that is not registered or has wrong password
//context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
//context.Response.Context.Response.StatusCode = 403;
//context.SetError("403", "password not valid");
//context.Rejected();
return;
}
}
else if (user == null)
{
//context.Response.Headers.Add(CoreConfiguration.OwinChallengeFlag, new[] { ((int)HttpStatusCode.NotFound).ToString() });
//context.Rejected();
return;
}
//*here goes ClaimsIdentity and AuthenticationTicket creation*
Итак, мой вопрос: как я могу настроить мой HttpStatusCode для ответа в различных ситуациях? Я знаю, что я могу написать свое собственное промежуточное ПО, например, , но я не верю, что это единственный способ.
Проблема в том, что OAuthGrantResourceOwnerCredentialsContext
не имеет никакого влияния на реальное HttpRespose, потому что, как я понимаю, этот контекст может быть только допустимым или нет. В зависимости от этого, OAuthAuthorizationServerProvider
создает HttpResponse с кодом состояния 200 или 400.
Также я знаю, что для проверки пользователя существует метод ValidateClientAuthentication, но я не нашел способов настроить StatusCode из его OAuthValidateClientAuthenticationContext
.
Пожалуйста, объясните мне, где я неправ и возможно ли достичь моей цели?