如何获取刷新令牌

8
2个回答

10

AcquireTokenByRefreshToken函数可在ADAL 2.X中使用,该代码示例使用的是ADAL 3.13.8,并且从ADAL3.X开始,库不再公开刷新令牌和AuthenticationContext.AcquireTokenByRefreshToken功能。

ADAL缓存刷新令牌,并且每当调用AcquireToken并且请求的令牌需要更新(即使要获取不同资源的新访问令牌),它都会自动使用它。

在此处查看解释。另请在此处在此处了解有关ADAL中刷新令牌的更多详细信息。


请帮我:http://stackoverflow.com/questions/43388851/the-azure-user-session-lifetime - Phoenix
但是 AcquireTokenSilentAsync 呢?即使缓存匹配,它也会抛出无法获取令牌的异常。 - Neo

2
如果您正在寻找一种持久性机制,可以简单地使用TokenCache.Serialize()
以下是我的做法:
首先,获取令牌并序列化缓存令牌。
AuthenticationContext authContext = new AuthenticationContext($"https://login.microsoftonline.com/{Tenant}");
var authResult = authContext.AcquireTokenAsync(resource, ClientId, new Uri("https://login.microsoftonline.com/common/oauth2/nativeclient"), new PlatformParameters(PromptBehavior.SelectAccount)).Result;
byte[] blobAuth = authContext.TokenCache.Serialize();

然后,加载缓存的字节

AuthenticationContext authContext = new AuthenticationContext($"https://login.microsoftonline.com/{tenant}/");
authContext.TokenCache.Deserialize(blobAuth);
var res = authContext.AcquireTokenSilentAsync(resource, clientId).Result;

1
如果类为您刷新令牌,则无需访问刷新令牌。因此,您只需要像此答案所示那样保留对象的副本进行序列化即可。有用的答案,谢谢! - Meir
绝对正确,只要内存中的对象可以使用“AcquireTokenSilentAsync”函数进行刷新而无需序列化,但每次重新启动程序时都必须再次请求访问令牌。 我的答案是展示如何管理持久性令牌,这些令牌也可以保存在数据库\文件中。 - Yinon_90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接