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

问题描述 投票:0回答:1

具体是有没有办法检查AuthenticationContext.AcquireTokenByAuthorizationCodeAsync()是否成功获得刷新令牌?

c# azure asp.net-core azure-active-directory
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.