首页 > 解决方案 > 尝试在 c# 中获取令牌时出现 AdalSilentTokenAcquisitionException

问题描述

我正在尝试使用连接到我的天蓝色应用程序,acquireTokenSilentAsync但出现异常,这是代码:

public class Oauth
    {
        public const string OAuthHeader = "Authorization";
        public static  String GetUserAccessTokenAsync()
        {
            AuthenticationResult result = null;
            string aadTenant = TestConfiguration.Default.ActiveDirectoryTenant;
            string aadClientAppId = TestConfiguration.Default.ActiveDirectoryClientAppId;
            string aadResource = TestConfiguration.Default.ActiveDirectoryResource;

            var authenticationContext = new AuthenticationContext(aadTenant, TokenCache.DefaultShared);

            result = authenticationContext.AcquireTokenSilentAsync(aadResource, aadClientAppId).Result;

            if (result != null)
            {
                var accessToken = result.AccessToken;
                // Use the token
                return accessToken;
            }
            else
            {
                return "";
            }
        }
    }

我在此行收到以下错误:

result = authenticationContext.AcquireTokenSilentAsync(aadResource, aadClientAppId).Result;

AdalSilentTokenAcquisitionException:无法静默获取令牌,因为在缓存中未找到令牌。调用方法 AcquireToken

怎么了?

标签: c#azure-active-directory

解决方案


当您尝试静默获取令牌时,它会从 TokenCache 中获取令牌或静默使用 refreshToken。因此,当缓存中没有令牌时,AdalException 返回。你可以参考这篇文章

请注意AcquireTokenSilent不需要在客户端凭据流中调用(当应用程序在没有用户的情况下获取令牌时,但以自己的名义)

请注意, AcquireTokenSilent失败可能有多种原因,例如缓存不包含用户的令牌,或者令牌已过期且无法刷新。

try
{
    result = await ac.AcquireTokenSilentAsync(resource, clientId);
}
catch (AdalException adalException)
{
    if (adalException.ErrorCode == AdalError.FailedToAcquireTokenSilently
        || adalException.ErrorCode == AdalError.InteractionRequired)
    {
        result = await ac.AcquireTokenAsync(resource, clientId, redirectUri,
                                       new PlatformParameters(PromptBehavior.Auto));
    }
}

推荐阅读