当我尝试使用Cortana Bot用户令牌(这是一个Graph令牌)来生成另一个“使用”令牌时,使用{ {1}} / ClientAssertionCertificate
通过使用Cortana Bot用户令牌生成的ClientCredential
和AppId
作为ResourceId
和userAssertion
传递给另一个使用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)获取代表令牌。
流程步骤:
以下是用于从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;
}
获取上面在此步骤中提到的异常:
output = await authContext
.AcquireTokenAsync(resource, cllientCertificateCredential, userAssertion)
.ConfigureAwait(false);
答案 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;
接下来,使用令牌1向API A请求API B的OBO令牌2;
最后,使用OBO令牌2向API B请求OBO令牌3以获取广告图形API。
对于v1端点中的OBO,请阅读link1。
对于v2端点中的OBO,请阅读link2。
答案 1 :(得分:1)
通过将依赖的自定义API(API B)“ user_impersonation”作用域配置为我们的Bot的Cortana通道配置,我们可以解决此问题。通过此配置更改,我们不需要从Microsoft Bot应用程序为API B生成On-Behalf-Of令牌。
感谢所有支持为该线程提供解决方案的人...