invalid_grant OAuthAuthorizationServerProvider - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над написанием полностью настроенного удостоверения ASP.NET для моего WebAPi.

Я переписал свой собственный производный OAuthAuthorizationServerProvider следующим образом:

 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
 {
     context.Validated();
     return Task.FromResult<object>(null);
 }

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
 {
     // Check User availability ...
     //ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

     // if i couldn't found user in my DataBase ... 
     //if (user == null)
     //{
     //context.SetError("invalid_grant", "The user name or password is incorrect.");
     //    return;
     //}

     context.Validated();
 }
}

GrantResourceOwnerCredentials просто возвращает ошибку invalid_grant для каждого вызова. Я хочу справиться с этим, но я не знаю как.

1 Ответ

0 голосов
/ 05 мая 2018

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"

...