Неверная подпись при генерации токена на предъявителя - PullRequest
1 голос
/ 21 марта 2019

Я новичок в OAuth и использовал этот учебник для генерации токена доступа из клиентского приложения в целевое приложение.Сам код работает нормально, но сгенерированный токен доступа имеет invalid signature, когда я декодировал на https://jwt.io/

Вот код из учебника

public class ServicePrincipal
    {
        /// <summary>
        /// The variables below are standard Azure AD terms from our various samples
        /// We set these in the Azure Portal for this app for security and to make it easy to change (you can reuse this code in other apps this way)
        /// You can name each of these what you want as long as you keep all of this straight
        /// </summary>
        static string authority = "";  // the AD Authority used for login.  For example: https://login.microsoftonline.com/myadnamehere.onmicrosoft.com 
        static string clientId = ""; // client app's client id
        static string clientSecret = ""; // client app's secret key
        static string resource = ""; // target app's App ID URL

        /// <summary>
        /// wrapper that passes the above variables
        /// </summary>
        /// <returns></returns>
        static public async Task<AuthenticationResult> GetS2SAccessTokenForProdMSAAsync()
        {
            return await GetS2SAccessToken(authority, resource, clientId, clientSecret);
        }

        static async Task<AuthenticationResult> GetS2SAccessToken(string authority, string resource, string clientId, string clientSecret)
        {
            var clientCredential = new ClientCredential(clientId, clientSecret);
            AuthenticationContext context = new AuthenticationContext(authority, false);
            AuthenticationResult authenticationResult = await context.AcquireTokenAsync(
                resource,  // the resource (app) we are going to access with the token
                clientCredential);  // the client credentials
            return authenticationResult;
        }
    }

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

     AuthenticationContext authenticationContext =
   new AuthenticationContext({authority});

        ClientCredential clientCredential = new ClientCredential({client app id}, {client app secret});
        try
        {
            AuthenticationResult result =
              await authenticationContext.AcquireTokenAsync({target app's App ID URL},
                                                                clientCredential);
        }
        catch (Exception e)
        {
            return false;
        }

Оба кода дали мне недопустимый токен доступа для подписи версии 1.0

Здесь есть две проблемы:

  1. Я заметил, что когда я декодирую токен доступа, он показывает "ver": "1.0".Означает ли это, что использует OAuth1.0?Потому что я предполагаю использовать OAuth 2.0 .. Почему код генерирует токен, который создает OAuth1.0, а не OAuth2.0?

  2. Почему это недействительная подпись?

enter image description here

Ответы [ 3 ]

4 голосов
/ 21 марта 2019

Я попробовал тот же код с вашим, получил ту же ситуацию invalid signature, но когда я изменил JWT ALGORITHM на HS256 , я получил Signature Verified.

enter image description here

И подпись:

enter image description here

И различия оRRS256 и HS256:

RS256 (подпись RSA с SHA-256) - это асимметричный алгоритм, в котором используется пара открытого / секретного ключей: у провайдера идентификации есть закрытый (секретный) ключиспользуется для генерации подписи, а потребитель JWT получает открытый ключ для проверки подписи.Поскольку открытый ключ, в отличие от закрытого ключа, не нуждается в защите, большинство провайдеров идентификации делают его доступным для потребителей для получения и использования (обычно через URL-адрес метаданных).

HS256 (HMAC с SHA-256), с другой стороны, является симметричным алгоритмом с одним (секретным) ключом, который совместно используется двумя сторонами.Поскольку один и тот же ключ используется как для создания подписи, так и для ее проверки, необходимо позаботиться о том, чтобы ключ не был скомпрометирован.

1 голос
/ 21 марта 2019

Я заметил, что когда я декодирую токен доступа, он показывает "ver": "1.0".Означает ли это, что использует OAuth1.0?Потому что я предполагаю использовать OAuth 2.0 .. Почему код генерирует токен, который создает OAuth1.0, а не OAuth2.0?

Вы используете OAuth2.0, ver:"1.0" означает, чтоМаркер JWT выдается конечной точкой Azure AD V1.0.

Почему это недопустимая подпись?

API должен проверить, соответствует ли алгоритм, как указано в заголовке JWT (свойство alg)соответствует ожидаемому API.AAD использует RS256, поэтому вы должны изменить на RS256:

enter image description here

Обычный способ - построить по модулю и показателю степени, находя их изhttps://login.microsoftonline.com/common/discovery/keys соответствующий ребенок и x5t из токена.Любое использование онлайн-инструмента, например https://play.golang.org/, для получения открытого ключа состоит из двух компонентов: n и e.Вы также можете использовать значение x5c, нажмите здесь для образцов.

1 голос
/ 21 марта 2019

Вы отправляете свой ключ в форму на jwt.io? Попробуйте сделать реальный отдых, используя токен в заголовке авторизации. Если все работает, а jwt - нет, возможно, это на них.

...