在多线程环境中运行时,即使使用无效密钥,也会返回Azure访问令牌。
我已经进行了集成测试,检查在获取Azure访问令牌时是否无法通过无效的客户端密码。
当单独运行时,测试每次都会通过,这意味着无效的客户端密钥不会返回Azure访问令牌。
但是,当使用其他集成测试(在多个线程上)运行时,即使显然无效的客户机密钥,此函数也会返回访问令牌。
即使在指定完全无效的客户端密码时,我也没有看到任何合法的原因,这将成为客户端ID的缓存令牌。
请注意,当客户端ID无效时,不会发生此行为。
这种行为有解释吗?
private async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var clientCredential = new ClientCredential(clientId, clientSecret);
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var result = await context.AcquireTokenAsync(resource, clientCredential);
Debug.WriteLine("----------------------------------");
Debug.WriteLine(clientId);
Debug.WriteLine(clientSecret);
Debug.WriteLine(result.AccessToken);
return result.AccessToken;
}
调试输出
Debug Trace:
----------------------------------
<...client id...>
invalid secret
<...valid token...>
答案 0 :(得分:3)
这是因为您的缓存在缓存中仍然具有有效的访问令牌。 ADAL首先检查缓存,如果仍然有效(未过期)则返回访问令牌。令牌缓存在client_id上作为密钥的一个维度进行转发,因此无效的client_id会按预期失败。要强制库使用密钥并进行网络呼叫,您必须从缓存中删除令牌