Не удалось получить токен из-за ошибки unauthorized_client - PullRequest
0 голосов
/ 17 декабря 2018

Я пишу демонстрацию о том, как получить токен из IDS4 с помощью Postman.

Запрос на токен пароля взят со страницы IDS4 .

[HttpGet("token")]
public IActionResult GetToken([FromHeader] string user, [FromHeader] string pass)
{
  string tokenEndpoint = "https://localhost:44300/connect/token";
  HttpClient client = new HttpClient();

  Task<TokenResponse> tokenResponse = 
    client.RequestPasswordTokenAsync(new PasswordTokenRequest
  {
    Address = tokenEndpoint,

    ClientId = "client",
    ClientSecret = "client_secret",
    Scope = "MemberApi.full",

    UserName = user,
    Password = pass
  });
  TokenResponse toko = tokenResponse.Result;

  if (toko.IsError)
    return Ok(toko.Error);
  return Ok(toko.AccessToken;
}

Клиенты настроены следующим образом.

private static IEnumerable<Client> GetClients => new[]
{
  ...
  new Client
  {
    ClientId = "client",
    ClientSecrets = { new Secret("client_secret".Sha256()) },
    ClientName = "Client",

    AllowedGrantTypes = GrantTypes.Implicit,
    AllowAccessTokensViaBrowser = true,

    RedirectUris = { "http://localhost:5000/security/credentials" },
    PostLogoutRedirectUris = { "http://localhost:5000/index.html" },
    AllowedCorsOrigins = { "http://localhost:5000", "https://localhost:44300" },

    AllowedScopes =
    {
      IdentityServerConstants.StandardScopes.OpenId,
      IdentityServerConstants.StandardScopes.Profile,
      IdentityServerConstants.StandardScopes.Email,
      "MemberApi",
      "MemberApi.full",
      "MemberApi.limited"
    }
  }
};

Ресурсы API настроены следующим образом.

private static IEnumerable<ApiResource> GetApis => new[]
{
  new ApiResource
  {
    Name = "MemberApi",
    DisplayName = "Members' API",
    ApiSecrets = {new Secret("MemberSecret".Sha256())},
    UserClaims = {JwtClaimTypes.Name, JwtClaimTypes.Email, JwtClaimTypes.Role},
    Scopes = {new Scope("MemberApi.full"), new Scope("MemberApi.limited")}
  }
};

Насколько я могу судить, я следовал рекомендациям вDocs.Я тоже пытался сравнить с примерами.Несмотря на это, я застреваю на ошибке, говоря unauthorized_client .Чего мне не хватать?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Клиенту разрешено использовать неявный поток только для получения токена для доступа к ресурсу, защищенному сервером идентификации:

AllowedGrantTypes = GrantTypes.Implicit,

Но ваш клиент использует Поток владельца ресурса :

Этот тип гранта подходит для клиентов, способных получить учетные данные владельца ресурса (имя пользователя и пароль, обычно с использованием интерактивной формы).Он также используется для миграции существующих клиентов с использованием схем прямой аутентификации, таких как HTTP Basic или дайджест-аутентификация, в OAuth путем преобразования сохраненных учетных данных в токен доступа.

Если вы используете приложение SPA,Вы должны использовать Implicit Flow для получения токенов без предоставления учетных данных конечного пользователя третьей стороне.

Как правило, у вас есть три приложения: клиентское приложение, сервер идентификации (с пользователем db) и API.При использовании Implicit Flow:

  1. Клиент перенаправляет пользователя на приложение сервера идентификации, сервер идентификации предоставляет пользовательский интерфейс, позволяющий пользователю вводить свои учетные данные.
  2. После того, как пользователь вводит свои учетные данные, сервер идентификации будет проверятьучетные данные в БД / конфигурационный файл.Конечно, вы также можете настроить внешний вход в систему на сервере идентификации.
  3. После проверки учетных данных сервер идентификации будет выдавать идентификационный токен и токен доступа (если область включает в себя ресурс API) обратно в клиентское приложение в соответствии с обратным вызовом.URL-адрес в конфигурации OpenID Connect клиента.
  4. Клиентское приложение будет проверять и декодировать идентификатор токена и входя в систему пользователя.Вы можете использовать SDK или напрямую обработать процесс вручную.
  5. Если вы получили токен доступа, вы можете сохранить токен доступа в кеше сеанса, его можно использовать для доступа к защищенному ресурсу до истечения срока его действия.
0 голосов
/ 17 декабря 2018

Запрос клиента не разрешен в этом потоке:

AllowedGrantTypes = GrantTypes.Implicit

Забыть client.RequestPasswordTokenAsync.Вам это не нужно, и вы не можете его использовать.В неявном потоке пароль знает только пользователь.Клиент недоступен.

Предположим, что IdentityServer работает в одном домене: https://idp.mydomain.com, а клиент работает в другом месте: https://mvc.mydomain.com

Когда пользователь нажимает защищенныйна странице клиента mvc пользователь перенаправляется на IdentityServer , где пользователь входит в систему. Там пользователь вводит учетные данные, и в случае успеха пользователь возвращается клиенту в качестве известного идентификатора.

В зависимости от потока клиент в конечном итоге получает как минимум токен доступа.Этот токен важен, поскольку позволяет клиенту обращаться к ресурсу от имени пользователя .Это похоже на входной билет.

На основании токена доступа ресурс теперь знает, что ВОЗ хочет получить доступ к ресурсу.У маркера доступа есть одно утверждение, которое делает это различие, утверждение «sub».Без этого утверждения клиент не имеет доступа к ресурсу в этом потоке.

В вашей конфигурации клиенту разрешен доступ к областям «MemberApi», но ему необходимо согласие пользователя, прежде чем он действительно сможет получить доступ к ресурсу.


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

Это поток, в котором нет пользователя навсе.Клиент (как в программном обеспечении) может войти в систему, используя clientid + secret.При правильной настройке это приведет к токену доступа.

Теперь клиент может получить доступ к ресурсу без какого-либо взаимодействия с пользователем.Идентификационный токен недоступен, так как нет пользователя.Претензия 'sub' отсутствует.Токен обновления не поддерживается в этом потоке, он не нужен.Клиент может запросить новый токен, используя учетные данные.


Если вы хотите узнать, как работает токен обновления , в гибридном потоке пользователь регистрирует журналв дополнение к этому (если настроена область = автономно) возвращается токен обновления.

Поскольку токен доступа действителен только в течение короткого времени (зависит от времени истечения), необходимо получить новый токен.Для этого следует использовать токен обновления.Токен обновления позволяет клиенту запрашивать новый токен доступа без необходимости взаимодействия с пользователем (автономный доступ).

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


В неявном потоке токена обновления нет, но токен доступа действительно истекает.Так что вам понадобится другой способ обновить токен.Для этого вы можете использовать что-то вроде тихого обновления .

Для терминологии, пожалуйста, прочитайте документацию .

Обратите внимание на различные потоки.Все зависит от обстоятельств.Есть ли пользователь или нет, это приложение для браузера, есть ли фронтальный канал, обратный канал, требуется ли доступ в автономном режиме, может ли клиент хранить секрет?Вещи, которые необходимо учитывать перед выбором потока.

При выборе потока необходимо настроить разрешенные разрешения для клиентов.Клиент, использующий учетные данные клиента, не может получить доступ к ресурсу, если разрешен только неявный тип предоставления.

IdentityServer в основном предназначен для настройки клиентов и ресурсов.Взгляните на примеры, чтобы увидеть различные потоки и их настройку.

...