【发布时间】:2023-03-12 18:56:01
【问题描述】:
我们使用 Azure AD 进行身份验证并每 30 分钟获取一次刷新的访问令牌。我们调用下面的方法来获取安全令牌并将其添加到请求头中。
var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
var authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectId));
var credential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientId"],
ConfigurationManager.AppSettings["ida:ClientSecret"]);
try
{
var authenticationResult = authContext.AcquireTokenSilent(ConfigurationManager.AppSettings["WebAPIBaseAddress"], credential, new UserIdentifier(userObjectId, UserIdentifierType.UniqueId));
//set cookie for azure oauth refresh token - on successful login
var httpCookie = HttpContext.Current.Response.Cookies["RefreshToken"];
if (httpCookie != null)
httpCookie.Value = authenticationResult.RefreshToken;
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
}
catch
{
//Get access token using Refresh Token
var authenticationResult = authContext.AcquireTokenByRefreshToken(httpCookie.Value, credential, ConfigurationManager.AppSettings["WebAPIBaseAddress"]);
}
在上述方法中,我们使用了 AcquireTokenSilent 方法,它为我们提供了访问令牌。由于访问令牌仅持续一段时间。 过期后,我们调用 AcquireTokenByRefreshToken 获取刷新令牌。
上面的代码运行良好,但是我们随机出现以下异常:
Microsoft.IdentityModel.Clients.ActiveDirectory.AdalSilentTokenAcquisitionException: Failed to acquire token silently. Call method AcquireToken
at Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenSilentHandler.SendTokenRequestAsync()
at Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.<RunAsync>d__0.MoveNext()
ErrorCode: failed_to_acquire_token_silently
这种不一致行为的原因可能是什么?相同的代码在少数环境(Stage/Dev)上工作,但它在生产环境中随机抛出错误。
请提出建议。
【问题讨论】:
-
你是如何配置认证的?你看过这篇stackoverflow.com/questions/34888661/… 的帖子了吗?
-
您使用的 Microsoft.IdentityModel.Clients.ActiveDirectory 是什么版本?
-
@Thomas:谢谢。我们已经在 startup.cs 中以与您共享的链接中提到的相同的方式完成了身份验证。
-
@SushantSonarghare,当您尝试静默获取令牌时,它将从 TokenCache 中获取令牌。因此,如果令牌不再有效,您将收到此错误。您可以做的是捕获 AdalException 并强制用户重新进行身份验证。
-
旁注,您永远不需要调用 AcquireTokenByRefreshToken。如果您调用 AcquireTokenSilent,ADAL 将自动从缓存中选择最佳刷新令牌 - 它会透明地保存新的刷新令牌。让我强调一点:假设您正在持久化缓存,则不应该有任何情况下您必须直接操作刷新令牌。
标签: c# azure azure-active-directory adal