Azure AD-使用离线访问范围获取声明(ADAL库)

Azure AD-使用离线访问范围获取声明(ADAL库),azure,azure-active-directory,openid-connect,adal,claims-based-identity,Azure,Azure Active Directory,Openid Connect,Adal,Claims Based Identity,我正在使用Microsoft库在.NET web应用程序中针对Azure AD实现OAuth 我使用基于持久缓存令牌的AcquireTokenSilentAsync方法来获取AuthenticationResult对象。此对象包含一个UserInfo属性,可用于获取索赔值以创建ClaimSideEntity对象 我试图了解要传递给OpenIdConnectAuthenticationOptions的Scope参数的作用域 我使用的是OpenIDConnectScope.OpenIDProfile

我正在使用Microsoft库在.NET web应用程序中针对Azure AD实现OAuth

我使用基于持久缓存令牌的AcquireTokenSilentAsync方法来获取AuthenticationResult对象。此对象包含一个UserInfo属性,可用于获取索赔值以创建ClaimSideEntity对象

我试图了解要传递给OpenIdConnectAuthenticationOptions的Scope参数的作用域

我使用的是OpenIDConnectScope.OpenIDProfile值,该值转换为“openid配置文件”-这成功地检索了索赔。但它不会返回刷新令牌来处理在访问令牌过期后刷新它(这正是我想要的)

所以我发现我需要使用OpenIDConnectScope.OfflineAccess,它可以转换为“离线访问”。这将返回一个AuthenticationResult.UserInfo对象,其所有属性都设置为“null”

我想我会尝试使用多个作用域;类似于“openid profile offline\u access”,但只要作用域参数值中存在“offline\u access”,UserInfo对象总是返回空值


为什么会发生这种情况?在能够检索UserInfo对象以创建ClaimsEntity对象的同时,启用刷新访问令牌的正确方法是什么?

我猜您使用的是ADAL.NET v3,对吗

ADAL v2用于公开刷新令牌,因为您必须自己处理刷新。对于ADALV3,这是由库自动完成的

您的代码应该类似于:

try
{
 result = await authContext.AcquireTokenSilentAsync(graphResourceId, clientId);
}
catch (AdalException adalException) 
{
 if (adalException.ErrorCode == AdalError.FailedToAcquireTokenSilently || adalException.ErrorCode == AdalError.UserInteractionRequired)
 {
  result = await authContext.AcquireTokenAsync(graphResourceId,
                                               clientCred, 
                                               userAssertion);
 }
}

请参阅详细信息。

是的,我使用的是最新稳定版本的ADAL,我的代码与您的代码一模一样。此外,我使用SQL数据库来持久化令牌缓存;authContext是使用此令牌缓存创建的。其思想是能够使用来自完全不同的浏览器会话的缓存令牌进行身份验证,而无需每次输入凭据。在这种情况下,只需要在第一轮中输入用户名和密码。问题在于,只有在访问令牌未过期(在一小时时间内)的情况下,以静默方式获取令牌才有效。知道吗?你在哪里看到你用的是哪种adal版本?