От имени проблемы с токеном (AADSTS50013: утверждение содержит недопустимую подпись) - PullRequest
0 голосов
/ 02 января 2019

Я получаю сообщение об ошибке (упомянуто ниже), когда пытаюсь использовать токен пользователя Cortana Bot (который является токеном Graph) для создания токена «от имени» для другого потребляющего приложения Web API с использованием ClientAssertionCertificate / ClientCredential предназначен для другого потребляющего веб-API, передавая AppId как ResourceId и userAssertion, сгенерированные с использованием пользовательского токена Cortana Bot.

При проверке наших настроек Bot AAD он настраивается с использованием другого веб-API-интерфейса (API B) в качестве допустимого приложения вместе с приложением Graph. Нужно ли нам выполнять какие-либо дополнительные настройки в AAD, чтобы получить этот токен от имени *

AADSTS50013: Assertion contains an invalid signature. 
[Reason - The provided signature value did not match the expected signature value., 
    Thumbprint of key used by client: '9DB0B05B5D70DD7901FB151A5F029148B8CC1C64', 
    Found key 'Start=11/11/2018 00:00:00, 
    End=11/11/2020 00:00:00'
]
Trace ID: a440869f-b8f5-4d87-ba1a-6bd8dd7ba200
Correlation ID: 651e1fa8-2069-4489-a687-e68e5206e193
Timestamp: 2019-01-02 07:14:45Z

Ниже приведен поток и пример кода, показывающие, как мы пытаемся получить токен от имени для другого потребляющего Web API (API B).

Поток шагов:

  1. Кортана просит пользователя Войти в систему
  2. Вход пользователя в Cortana
  3. Cortana отправляет этот маркер пользователя (сгенерированный таргетинг для использования https://graph.microsoft.com в качестве аудитории) в Microsoft Bot Framework API
  4. Microsoft Bot Framework API проверяет и хочет использовать этот токен для вызова другого Web API (который называется API B).
  5. Поскольку этот токен пользователя Cortana нельзя использовать напрямую, его необходимо сгенерировать как токен от имени для API B из Microsoft Bot Framework API.
  6. Ниже приведен пример кода, используемого для создания токена от имени от Microsoft Bot Framework API:

    public async Task<string> GetOnBehalfOfTokenAsync(string authority, string resource, string scope = "", string token = "") 
    {
        AuthenticationResult output;
        var clientId = ConfigurationManager.AppSettings["API-B-ClientId"];
    
        // Read certificate which can be used for getting token to API B using ClientAssertionCertificate
        // GetCert() is used to get the Certificate based on Thumbprint configured in Web.config file.
        var certificate = this.GetCert();
    
        // 'authority' is https://login.microsoftonline.com/{tenant id}
        var authContext = new AuthenticationContext(authority);
        var cllientCertificateCredential = new ClientAssertionCertificate(clientId, certificate);
    
        // 'token' is the user token which was received from Cortana.
        var userAssertion = (!string.IsNullOrWhiteSpace(token)) ?
            new UserAssertion(token, "urn:ietf:params:oauth:grant-type:jwt-bearer", 
                TokenHelper.ExtractUserInfoFromAuthToken(token, "upn")) : null;
        try 
        {
            // 'resource' is the Resource Id of API B
            // if UserAssertion is null then get token with ClientAssertionCertificate else get 
            // on-behalf-of token using UserAssertion and ClientAssertionCertificate
            if (userAssertion == null) 
            {
                output = await authContext
                    .AcquireTokenAsync(resource, cllientCertificateCredential)
                    .ConfigureAwait(false);
            }   
            else 
            {
                output = await authContext
                    .AcquireTokenAsync(resource, cllientCertificateCredential, userAssertion)
                    .ConfigureAwait(false);
            }
        } 
        catch (Exception ex) 
        {
            logger.log("Error acquiring the AAD authentication token", ex);
        }
    
        return output.AccessToken;
    }
    
  7. Получение исключения, которое было упомянуто выше на этом шаге:

    output = await authContext
       .AcquireTokenAsync(resource, cllientCertificateCredential, userAssertion)
        .ConfigureAwait(false);
    

Ответы [ 2 ]

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

Мы могли бы решить эту проблему, настроив нашу зависимую настраиваемую область действия API (API B) «user_impersonation» для конфигурации канала Cortana для нашего бота. С этим изменением конфигурации нам не нужно генерировать токен On-Behalf-Of для API B из нашего приложения Microsoft Bot.

Спасибо всем, кто поддержал, чтобы предоставить решения для этой темы ...

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

Насколько я понимаю, сначала вы получаете токен пользователя из своего API-интерфейса msg для Cortana access;а затем вы хотите использовать токен пользователя для генерации токена OBO в Microsoft Bot Framework API;и, наконец, вы хотите использовать токен OBO для доступа к API B из Microsoft Bot Framework API.

Если вы хотите получить токен OBO в Microsoft Bot Framework API, вы должны использовать идентификатор API и секрет для этого,Я никогда не пробовал этого.

Со своей стороны я использую конечную точку v1, я создаю два API (API A и B), и мой поток таков: во-первых, мое приложение запрашивает token1 для API A;

enter image description here Затем используйте токен1, чтобы запросить токен OBO для API B у API A;

enter image description here

Окончательно, используйте токен OBO2, чтобы запросить токен OBO3 для API Aad Graph из API B.

enter image description here

Для OBO в конечной точке v1, пожалуйста, прочитайте link1 .

Для OBO в конечной точке v2, пожалуйста, прочитайте link2 .

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