Как правильно получить токен с помощью C # из Identity Server 4 для использования в Postman? - PullRequest
0 голосов
/ 04 ноября 2018

Я выполняю следующую магию C # и читаю токен, полученный в jwt.io . Все выглядит отлично.

DiscoveryResponse vasco = DiscoveryClient.GetAsync("http://localhost:5100").Result;
string tokenUri = vasco.TokenEndpoint;

TokenClient client = new TokenClient(vasco.TokenEndpoint, "Blopp", "SuperSecret");
TokenResponse cred = client.RequestClientCredentialsAsync("secured_api").Result;
string token = cred.AccessToken ?? "none!";

Однако, похоже, он не совсем хорошо функционирует, потому что при вставке в Postman с помощью ключа Авторизация и значения Носитель + токен (префикс передается вручную), я получаю услуга недоступна (как обсуждено в этом вопросе ).

Использование тех же учетных данных на конечной точке http://localhost:5100/connect/token и мастер Postman OAuth 2.0 создает токен, который работает.

Мой вывод заключается в том, что я каким-то образом не получаю правильный токен, используя свой код (и не могу понять это из-за невежества), или что я получаю токен, в котором что-то отсутствует.

Как мне получить правильный токен, полный и полностью эквивалентный тому, который Почтальон получает по указанному выше URL-адресу?

1 Ответ

0 голосов
/ 05 ноября 2018

Мой вывод заключается в том, что я каким-то образом не могу получить правильный токен, используя свой код (и не могу понять это из-за невежества), или что я получаю токен, в котором что-то отсутствует.

Исходя из ваших кодов, вы защищаете API с помощью Client Credentials , поэтому, во-первых, следуйте подробным инструкциям в статье для настройки сервера идентификации, веб-API и клиентов.

Для тестирования я следую инструкциям в этой статье и использую те же коды, которые вы указали, для получения токена:

        // discover endpoints from metadata
        var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
        if (disco.IsError)
        {
            Console.WriteLine(disco.Error);
            return;
        }

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

        if (tokenResponse.IsError)
        {
            Console.WriteLine(tokenResponse.Error);
            return;
        }

        Console.WriteLine(tokenResponse.Json);
        Console.WriteLine("\n\n");

'http://localhost:5000' - это конечная точка хоста сервера идентификации, а Clinet / Secret - это учетные данные моего клиента:

 public static IEnumerable<Client> GetClients()
 {
  return new List<Client>
  {
    new Client
    {
        ClientId = "client",

        // no interactive user, use the clientid/secret for authentication
        AllowedGrantTypes = GrantTypes.ClientCredentials,

        // secret for authentication
        ClientSecrets =
        {
            new Secret("secret".Sha256())
        },

        // scopes that client has access to
        AllowedScopes = { "api1" }
    }
};
}

Используйте этот токен для доступа к веб-API в Почтальоне: enter image description here

Вы также можете сравнить запрос токена получения при использовании мастера на основе OAuth 2.0 и подтвердить, что вы используете поток учетных данных клиента.

...