Ответ токена был успешно возвращен: unsupported_grant_type - PullRequest
0 голосов
/ 11 мая 2018

Я перехожу с .NET Core 1.1 на 2.0, и теперь мне нужно обновить свою аутентификацию тоже.

Я использую OAuth и OpenIddict до .NET Core 2.0

КогдаЯ отправляю запрос моему connect/token Я получаю следующее:

OpenIddict.Server.OpenIddictServerHandler [0] Ответ токена был успешно возвращен: {

"ошибка":" unsupported_grant_type ",

" error_description ":" Указанный параметр 'grant_type' не поддерживается. "

}.

Это мой метод запроса:

using (var client = new HttpClient())
{
    var request = new HttpRequestMessage(HttpMethod.Post, $"{url}/connect/token");
    request.Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "client_credentials",
        ["client_id"] = clientId,
        ["client_secret"] = clientSecret,
        ["pessoaid"] = pessoaId,
        ["usuarioid"] = usuarioId,
        ["conta"] = conta,
        ["cpfcnpj"] = userDoubleCpf,
        ["fonteDados"] = fonteDados,
        ["userIdsLogged"] = userIdsLogged
    });

    var response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead);
    response.EnsureSuccessStatusCode();

    var result = JObject.Parse(await response.Content.ReadAsStringAsync());
    if (result["error"] != null)
    {
        throw new InvalidOperationException("An error occurred while retrieving an access token.");
    }
    return result;
}

Мои OpenIddictApplications генерируются, когда приложение связано с учетной записью пользователя, поэтому ClientId и Secret генерируются, когда запрос на вход в систему отправляется моему API и извлекает соответствующие значения.

Я последовал за документом и включил все в мой Startup.cs

Это мой AuthorizationController:

[HttpPost("~/connect/token"), Produces("application/json")]
public async Task<IActionResult> Exchange(OpenIdConnectRequest request)
{
    Debug.Assert(request.IsTokenRequest(),
        "The OpenIddict binder for ASP.NET Core MVC is not registered. " +
        "Make sure services.AddOpenIddict().AddMvcBinders() is correctly called.");

    if (request.IsClientCredentialsGrantType())
    {
        // Note: the client credentials are automatically validated by OpenIddict:
        // if client_id or client_secret are invalid, this action won't be invoked.

        var application = await _applicationManager.FindByClientIdAsync(request.ClientId, HttpContext.RequestAborted);
        if (application == null)
        {
            return BadRequest(new OpenIdConnectResponse
            {
                Error = OpenIdConnectConstants.Errors.InvalidClient,
                ErrorDescription = "The client application was not found in the database."
            });
        }

        // Create a new authentication ticket.
        var ticket = CreateTicket(request, application);

        return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
    }

    return BadRequest(new OpenIdConnectResponse
    {
        Error = OpenIdConnectConstants.Errors.UnsupportedGrantType,
        ErrorDescription = "The specified grant type is not supported."
    });
}

Я генерируюAuthenticationTicket и возвращениеthis.

Есть идеи о том, что может быть причиной такого рода плохого запроса, когда я пытаюсь отправить запрос на получение моего токена?

1 Ответ

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

Это происходит потому, что вы не настраиваете на себе поток учетных данных клиента Startup.cs.

См. Пример: https://github.com/openiddict/openiddict-samples/blob/dev/samples/ClientCredentialsFlow/AuthorizationServer/Startup.cs

Внимание, строка 52:

// Enable the client credentials flow.
options.AllowClientCredentialsFlow();
...