如何确保Microsoft.IdentityModel.Clients.ActiveDirectory库返回刷新令牌?

时间:2019-04-23 17:41:50

标签: c# azure asp.net-core azure-active-directory

具体地说,有什么方法可以检查AuthenticationContext.AcquireTokenByAuthorizationCodeAsync()是否成功获取刷新令牌?

1 个答案:

答案 0 :(得分:0)

Azure AD身份验证库(ADAL)依靠其令牌缓存来进行有效的令牌管理。当您使用AcquireTokenSilentAsync请求访问令牌并且缓存中有有效令牌时,您会立即获得它。否则,如果有刷新令牌,它将用于从Azure AD获取新的访问令牌。然后将新令牌写入缓存并返回给您。

该库本身支持各种方案:从移动和JavaScript客户端到服务器端应用程序。它可以用于存储单个用户以及许多用户的令牌。如果您查看令牌缓存键类,您会发现令牌可以由目标资源和权限(除了客户端(应用程序)和用户)存储和查询。

您不直接使用缓存键和基础字典。相反,您可以正确地构造AuthenticationContext并将其他参数(例如客户端凭据,用户和/或资源标识符)传递给各种AcquireToken *方法。

默认情况下,内存中有一个单例缓存,该缓存可用于快速测试,但在现实生活中不起作用。首先,令牌具有生存期,如果重新启动应用程序,则会丢失令牌,并且用户将不得不针对Azure AD重新进行身份验证。其次,在进行横向扩展时,需要使缓存可用于应用程序的所有实例。

缓存支持外部存储的方式基本上可以归结为以下内容。您从TokenCache派生,并为BeforeAccess和AfterAccess事件提供处理程序。从技术上讲,这甚至不是事件,您只需提供几个代表即可。每当ADAL想要访问缓存时,BeforeAccess都会被调用,这是您有机会从外部存储中填充缓存的地方。在AcquireToken *方法的末尾调用AfterAccess,并且您想要持久化缓存(如果缓存已被修改),可以通过检查HasStateChanged属性来判断。很简单。

现在,当您加载或保留高速缓存时,它包括整个字典,而不仅仅是单个项。为您提供了方便的Serialize和Deserialize方法,因此您不必担心它们的键和值的结构。相反,您只需保留字节数组。

这意味着,在服务器端Web应用程序中,您要由用户管理缓存。

您可以选择任何外部存储和数据访问技术。在ASP.NET Core中,当您获得现成的SQL Server和Redis支持时,充分利用IDistributedCache是​​很有意义的。

有关更多参考,请浏览:

adal-distributed-token-cache-in-asp-net-core