在ADAL v2中,我们正在这样做:
// Common parameter:
_clientCredential = new ClientAssertionCertificate(clientId, certificate);
// Get the token for the first time:
var userAssertion = new UserAssertion(accessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
_authResult = await authContext.AcquireTokenAsync(resource, _clientCredential, userAssertion);
// Refresh the token (when needed):
_authResult = await authContext.AcquireTokenByRefreshTokenAsync(authResult.RefreshToken, _clientCredential);
请注意,为了刷新令牌,我们只需要先前的身份验证结果和公共客户端凭据(_authResult
和_clientCredential
)。 这非常方便。
ADAL v3缺少AcquireTokenByRefreshTokenAsync和here is the explanation。但这并不是说具体来说需要什么改变。
我们是否必须重播第一个AcquireTokenAsync(并因此将resource
,accessToken
和userName
保留在程序状态下的某个位置)?
或者是否有某种方法可以获取仅包含公共元素(_authResult
和_clientCredential
)的最新令牌?
答案 0 :(得分:0)
AcquireTokenSilentAsync现在提供了使用刷新令牌的机制。有关使用此模式的信息,请参见AcquireTokenSilentAsync using a cached token using a cached token。
您是否正在使用[ADAL令牌缓存](http://www.cloudidentity.com/blog/2013/10/01/getting-acquainted-with-adals-token-cache/)?它使您无需管理在代码中使用刷新令牌以及所面临的问题的基本实现细节。
答案 1 :(得分:0)
对于ADAL 3.x中的代表流的推荐方法是使用:
try
{
result = await ac.AcquireTokenSilentAsync(resource, clientId);
}
catch (AdalException adalException)
{
if (adalException.ErrorCode == AdalError.FailedToAcquireTokenSilently ||
adalException.ErrorCode == AdalError.InteractionRequired)
{
result = await ac. AcquireTokenAsync (resource, clientCredentials, userAssertion);
}
}
请注意,在某些情况下,您可能已经缓存了通过ADAL.NET v2.x获取的刷新令牌,并且为了帮助从ADAL 2.x迁移到MSAL.NET,我们计划在MSAL中重新引入AcquireTokenByRefreshToken。 NET(但不在ADAL 4.x中)