Как получить токен обновления, вызвав конечную точку авторизации на Identity Server 4 - PullRequest
0 голосов
/ 03 января 2019

У меня есть клиентское приложение ASP.Net MVC, проект API.Net Web API 2 и сервер удостоверений 4. Я хочу защитить свои API от несанкционированного доступа и, следовательно, получить токен JWT от IS4, а затем передать заголовок как Bearerтокен при совершении звонка в API.Все это прекрасно работает (войдите в приложение, получите токен JWT, а затем перейдите к API, чтобы он вызывался после авторизации токена).Я использую версию IdentityModel 3.9.0 для взаимодействия с конечными точками сервера Identity 4.

Я пытаюсь получить токен обновления с сервера удостоверений 4 и в этом проблема.Я не могу получить его, вызвав конечную точку авторизации.Я запутался там.Ниже приведен мой метод ISC GetClients в файле конфигурации

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

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

        AccessTokenLifetime = 1800,

        AllowOfflineAccess  = true,

        // secret for authentication
        ClientSecrets =
        {
            new Secret("secret".Sha256())
        },
        // scopes that client has access to
        AllowedScopes = { "nidhiapi", "offline_access" }            
    }
};

Я только что создал базовую консольприложение для проверки моего сервера аутентификации и ниже код в основном методе

   var discoveryClient = await DiscoveryClient.GetAsync("http://localhost:5000/");
        if (discoveryClient.IsError)
        {
            Console.WriteLine(discoveryClient.Error);
            return;
        }

        // request the token from the Auth server
    var tokenClient = new TokenClient(discoveryClient.TokenEndpoint, "client", "secret");

    var tokenResponse = await tokenClient.RequestClientCredentialsAsync("nidhiapi"); 

Я могу получить AccessToken в переменной tokenResponse с определенным клиентом и потоком HybridClientCredentials

Как я хотел быполучить RefreshToken от Авторизовать конечную точку.Я попытался выполнить следующие изменения в моем клиентском коде с помощью того же метода GetClients

 var tokenResponse = await tokenClient.RequestClientCredentialsAsync("offline_access");

, используя приведенную выше строку кода, и я получил ошибку "Invalid_Scope".Я прочитал об этом и обнаружил, что нам нужно использовать offline_access для получения токена обновления

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

еще одна вещь: каким я должен бытьпередавая метод RequestRefreshToken, поскольку он ожидает токен

 var authTokenClient = new TokenClient(discoveryClient.AuthorizeEndpoint, "client", "secret");

 var refreshTokenResponse = await tokenClient.RequestRefreshTokenAsync("offline_access");

Затем я попытался изменить свой метод GetClients, чтобы использовать только гибридный поток, а не HybridClientCredentials, поскольку я также прочитал, что поток RefreshToken недоступен для ClientCredentials.

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

Предложение / решение, пожалуйста?

1 Ответ

0 голосов
/ 04 января 2019

Вам необходимо использовать поток кода авторизации и запросить область действия «openid offline_access». Насколько мне известно, вы можете использовать токены обновления только при использовании потока кода авторизации.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...