代表令牌发行(AADSTS50013:断言包含无效签名)

时间:2019-01-02 15:21:15

标签: azure-active-directory microsoft-graph adal msal cortana-skills-kit

当我尝试使用Cortana Bot用户令牌(这是一个Graph令牌)来生成另一个“使用”令牌时,使用{ {1}} / ClientAssertionCertificate通过使用Cortana Bot用户令牌生成的ClientCredentialAppId作为ResourceIduserAssertion传递给另一个使用Web API的目标。

选中我们的Bot AAD设置后,它将与其他使用的Web 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. Cortana要求用户登录
  2. 用户登录到Cortana
  3. Cortana将此用户令牌(生成的定位目标是使用https://graph.microsoft.com作为受众)发送到Microsoft Bot Framework API
  4. Microsoft Bot Framework API进行了验证,并希望使用此令牌来调用其他Web API(称为API B)。
  5. 由于此Cortana用户令牌无法直接使用,因此需要将其作为Microsoft Bot Framework API的API B的代收凭证生成。
  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 :(得分:1)

我的理解是:首先,您从Cortana访问ms图形API获取用户令牌;然后您要使用用户令牌在Microsoft Bot Framework API中生成OBO令牌;最后,您想使用OBO令牌从Microsoft Bot Framework API访问API B。

要在Microsoft Bot Framework API中获得OBO令牌,应使用API​​ ID和密码,为此,我从未尝试过。

在我这边,我使用v1端点,创建了两个API(API A和B),流程如下: 首先,我的应用程序向API A请求token1;

enter image description here 接下来,使用令牌1向API A请求API B的OBO令牌2;

enter image description here

最后,使用OBO令牌2向API B请求OBO令牌3以获取广告图形API。

enter image description here

对于v1端点中的OBO,请阅读link1

对于v2端点中的OBO,请阅读link2

答案 1 :(得分:1)

通过将依赖的自定义API(API B)“ user_impersonation”作用域配置为我们的Bot的Cortana通道配置,我们可以解决此问题。通过此配置更改,我们不需要从Microsoft Bot应用程序为API B生成On-Behalf-Of令牌。

感谢所有支持为该线程提供解决方案的人...