ValidateClientAuthentication - это место, где вы будете выполнять проверки подлинности, и именно здесь вы будете выдавать ошибки, если что-то не совпадает.
переместите туда свой код и выполните проверки перед вызовом context.Validated (). Вы вызываете метод Validate только после того, как убедитесь, что все проверено правильно.
вот пример такой реализации, которую я сделал некоторое время назад:
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret;
//first try to get the client details from the Authorization Basic header
if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
{
//no details in the Authorization Header so try to find matching post values
context.TryGetFormCredentials(out clientId, out clientSecret);
}
if (string.IsNullOrWhiteSpace(clientId) || string.IsNullOrWhiteSpace(clientSecret))
{
context.SetError("client_not_authorized", "invalid client details");
return Task.FromResult<object>(null);
}
var dataLayer = new RepoManager(new DataLayerDapper()).DataLayer;
var audienceDto = dataLayer.GetAudience(clientId);
if (audienceDto == null || !clientSecret.Equals(audienceDto.Secret))
{
context.SetError("unauthorized_client", "unauthorized client");
return Task.FromResult<object>(null);
}
context.Validated();
return Task.FromResult<object>(null);
}
Обратите внимание, как проверки выполняются по порядку и возникают определенные ошибки с некоторыми соответствующими ошибками.
Этот код берет идентификатор клиента и секрет клиента из заголовка авторизации, но вы можете легко удалить все это и заменить его своими собственными проверками и вызовами базы данных.
Важной частью является то, что именно здесь вы имеете дело с подобными вещами, и именно здесь вы устанавливаете ошибки, чтобы ваши клиенты знали, что происходит.
GrantResourceOwnerCredentials Здесь вы можете получить правильную аутентификацию вызова, после чего вы можете начать создавать токены, добавлять заявки и создавать билет аутентификации. Этот метод не срабатывает, если предыдущий не может аутентифицировать запрос.
Вот рабочий пример:
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var identity = new ClaimsIdentity("JWT");
identity.AddClaim(new Claim("clientID", context.ClientId));
var props = new AuthenticationProperties(new Dictionary<string, string>
{
{
"audience", context.ClientId
}
});
var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);
return Task.FromResult<object>(null);
}
Теперь, если вы получаете недопустимую ошибку предоставления, которая обычно происходит, потому что вы или не установили grant_type в своем первоначальном вызове, или вы установили неправильное значение.
в моем случае мне пришлось настроить это:
"grant_type", "password"