Ответ токена был успешно возвращен: unsupported_grant_type

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

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

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

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

"error": "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;
}

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

Я следил за документацией oppeniddict и все это включил в свой 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 и возвращаю его.

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


person Pedro Franco    schedule 11.05.2018    source источник


Ответы (1)


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

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

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

// Enable the client credentials flow.
options.AllowClientCredentialsFlow();
person Renatto Machado    schedule 11.05.2018