Код авторизации с запросом токена Proof Key приводит к недопустимому ответу клиента

В настоящее время я оцениваю AppAuth (https://appauth.io/) для использования в собственном мобильном приложении вместе с STS, которая в настоящее время использует IdentityServer3. Я настроил клиент следующим образом:

new IdentityServer3.Core.Models.Client
{
    Enabled = true,
    ClientId = "app",
    ClientName = "app",
    ClientUri = "app:/",
    Flow = Flows.AuthorizationCodeWithProofKey,
    RequireConsent = false,
    RequireSignOutPrompt = false,
    SlidingRefreshTokenLifetime = 28800,
    AllowAccessTokensViaBrowser = true,

    RedirectUris = new List<string>
    {
        "app:/signin"
    },
    PostLogoutRedirectUris = new List<string>
    {
        "app:/signout"
    },
    AllowedScopes = new List<string>
    {
                StandardScopes.OpenId.Name.Name,
                StandardScopes.Email.Name.Name,
                StandardScopes.Profile.Name.Name,
                StandardScopes.Roles.Name.Name,
                StandardScopes.OfflineAccess.Name,
    }
}

Первоначальный запрос на авторизацию выполняется успешно, и IdentityServer3 возвращает код авторизации. Теперь я попробовал последующий запрос токена, и это приводит к HTTP 400 с ошибкой invalid_client и следующими сообщениями в журнале IdentityServer3:

2018-04-17 10:16:38.324 +02:00 [Information] Start token request
2018-04-17 10:16:38.324 +02:00 [Debug] Start client validation
2018-04-17 10:16:38.324 +02:00 [Debug] Start parsing Basic Authentication secret
2018-04-17 10:16:38.324 +02:00 [Debug] Start parsing for secret in post body
2018-04-17 10:16:38.324 +02:00 [Debug] No secret in post body found
2018-04-17 10:16:38.324 +02:00 [Debug] Start parsing for X.509 certificate
2018-04-17 10:16:38.324 +02:00 [Debug] X.509 certificate not found.
2018-04-17 10:16:38.324 +02:00 [Information] Parser found no secret
2018-04-17 10:16:38.324 +02:00 [Information] No client secret found
2018-04-17 10:16:38.324 +02:00 [Information] End token request
2018-04-17 10:16:38.324 +02:00 [Information] Returning error: invalid_client

Я что-то не так понимаю или почему IdentityServer3 не возвращает токен доступа?


person KwaXi    schedule 17.04.2018    source источник
comment
Вы установили code_challenge в запросе авторизации и code_verifier в запросе токена?   -  person iandayman    schedule 17.04.2018
comment
Да. Я установил code_challenge в запросе авторизации, который вернул код авторизации. Я также установил code_verifier в запросе токена, что привело к недопустимому ответу клиента, как указано.   -  person KwaXi    schedule 17.04.2018
comment
Я только что попробовал предложение @Kahbazi. После добавления секрета клиента в конфигурацию клиента в IdSrv3 и дополнительной установки заголовка Authorization при запросе токена я получаю id и токен доступа.   -  person KwaXi    schedule 17.04.2018
comment
да, но странно, что вам нужен секрет клиента для этого потока. См.: github.com/IdentityModel/IdentityModel.OidcClient/issues/25.   -  person iandayman    schedule 17.04.2018


Ответы (1)


Вам необходимо аутентифицировать Client в запросе токена для Authorization Code потока. Итак, вам нужно установить ClientSecrets для вашего клиента.

new IdentityServer3.Core.Models.Client
{
    /// your properties

    ClientSecrets = new List<Secret>
    {
        new Secret("secret".Sha256())
    }
}

И вам нужно отправить client_secret в качестве строки запроса в запросе токена.

Или вы можете использовать BasicAuthentication. В этом случае вам нужно добавить Base64(ClientId:ClientSecret) в заголовок аутентификации.

person Kahbazi    schedule 17.04.2018
comment
Я только что попробовал это, и, похоже, это работает. Чего я не понимаю, так это зачем нужен секрет клиента? PKCE используется для общедоступных клиентов, где секрет клиента в любом случае не имеет смысла. - person KwaXi; 17.04.2018