Как правильно получить токен в IDS4 от SPA перспективным способом? - PullRequest
0 голосов
/ 17 декабря 2018

Я прочитал в учебнике IDS4 , что следующий способ является способом получения токена.

var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");

if (tokenResponse.IsError) { ... }
Console.WriteLine(tokenResponse.Json);

Однако в значении intellisense указано, что он будет объявлен устаревшимпоэтому я проверил документы для идентификационной модели тип предоставления пароля , предлагая следующее.

var response = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
  Address = "https://localhost:44300/connect/token",
  ClientId = "spa",
  ClientSecret = "spa_secret",
  Scope = "MemberApi",
  UserName = user,
  Password = pass
});

Я не уверен, что делать дальше с точки зрения создания токена.В объекте, который я получаю, есть AccessToken , IdentityToken , RefreshToken и т. Д., И я не понимаю, на что можно полагаться в качестве документации поразличия между ними неясны.

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

new Client
{
  ClientId = "spa",
  ClientSecrets = { new Secret("spa_secret".Sha256()) },
  ClientName = "SPA client",
  ClientUri = "http://identityserver.io",

  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"
  }
}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Вместо использования TokenClient в будущем планируется использовать методы расширения (в HttpClient).

Метод расширения с функциональностью, аналогичной классу TokenClient, равен RequestClientCredentialsTokenAsync

Используйте его следующим образом:

var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://auth.myserver.com:5011");
var tokenResponse = await client.RequestClientCredentialsTokenAsync(
    new ClientCredentialsTokenRequest
    {
        Address = disco.TokenEndpoint,
        ClientId = "MyAppClient",
        ClientSecret = "secret",
        Scope = "api1"
    });
0 голосов
/ 17 декабря 2018

Это сбивает с толку, поскольку документация должна охватывать множество различных ситуаций.Лучше всего сконцентрироваться на неявном потоке , поскольку это хороший кандидат для приложения SPA.

Образец и документация доступны от identityServer, взгляните на JavaScriptClient .

Следующее, что лучше всего сделать, это прочитать спецификации .Это источник.IdentityServer реализует эти спецификации.Кроме того, вы можете прочитать документацию IdentityServer.

Это должно помочь вам понять, когда и где использовать токены.Это зависит от типа клиента и выбранного потока.Вы можете найти информацию об этом здесь .

Вкратце, значение токенов:

  • токен доступа : JWT или ссылкатокен, используемый для доступа к ресурсу.Этот токен также используется для извлечения информации из конечной точки UserInfo.
  • Идентификационный токен : содержит по крайней мере подчиненную заявку для идентификации пользователя.
  • Обновить токен : токен, позволяющий клиенту получать новый токен доступа от имени пользователя без необходимости взаимодействия с пользователем (автономный доступ).Доступно только в определенных потоках.

В зависимости от потока ответ может отличаться.

Информацию о том, как получить доступ к ресурсу (api) с помощью javascript с использованием токена доступа, см. В это .Когда срок действия токена доступа истечет, вам понадобится новый токен, без необходимости запрашивать у пользователя повторный вход.Поскольку токен обновления не поддерживается для неявного потока, вы можете реализовать автоматическое обновление токена, как описано здесь .

Об устаревшем коде, TokenClient заменяется на HttpClient.Вместо настройки TokenClient вы можете теперь вызвать расширение для HttpClient.Это улучшение кода и не влияет на реализацию потоков.

...