我有一个场景,预计3种不同类型的客户端(设备类型)将能够通过Azure AD针对我的Web应用进行身份验证。但是,仅在第一种类型(PC环境中的普通浏览器)内,才要求用户插入其Azure AD用户名和密码来登录。我的想法是创建某种过程,该过程仅需要使用Azure AD登录第一次输入用户名和密码。用户将使用第一类客户端进行首次登录,但是此后该过程也将在没有用户名和密码的情况下进行;取而代之的是,用户将可以通过用户名+密码或什至通过智能卡登录来访问系统。
经过一些研究,“刷新令牌”一词似乎经常出现。似乎是ADAL no longer provide the physical refresh token的最新版本;因此,实际的刷新令牌无法保存在某些数据库中,然后在从类型2或类型3设备登录时使用。但是,同一篇文章还建议该刷新令牌现在由ADAL在缓存中自动处理。
我还发现了一些很棒的sample code,它可以通过实体框架在MSSQLLocalDB数据库中实现持久化的ADAL令牌缓存。
基本上我的想法是:
现在,我不确定解决此问题的尝试(上面)是否至少在正确的轨道上(指导我:)!),但是我注意到下面的代码段中使用了tenantID,SignedInUserID和UserObjectID都可以在首次成功通过身份验证后检索到,这至少促使我尝试了一下。
Dim clientcred As ClientCredential = New ClientCredential(aadClientId, aadAppKey)
Dim authenticationContext As AuthenticationContext = New AuthenticationContext(aadInstance & tenantId, New ADALTokenCache(SignedInUserID))
Dim authenticationResult As AuthenticationResult = Await authenticationContext.AcquireTokenSilentAsync(aadGraphResourceID, clientcred, New UserIdentifier(UserObjectID, UserIdentifierType.UniqueId))
注意:ADALTokenCache是自定义ADALTokenCache类的构造函数,该类处理将TokenCache持久存储在本地数据库中。
因此,我将这3个值保存在系统数据库中,然后在登录智能卡时按用户名检索它们,然后使用如上所示的AcquireTokenSilentAsync。
我已经实施了此解决方案,并有一些疑问-
1)似乎从本地db中检索了持久令牌,并且看来authenticationResult对象确实检索了正确的值;访问令牌,ID令牌和用户信息!但是,似乎并不能对我进行身份验证/登录。request.IsAuthenticated保持虚假,并且我不知道下一步该怎么做。该过程是否错误?还是我需要做更多的事情?
2)authenticationResult的有效期似乎总是从原始令牌创建之日起1小时。在我看来,这就像实际的Access令牌到期时间,但在任何与ADAL相关的对象中,与Refresh令牌到期无关的任何内容均不可见!因此,这是一个非常棘手的情况。
3)ADAL确实说过刷新令牌是在缓存中自动处理的。但是,是否需要从Azure AD配置端进行配置?我没有发现与在Azure门户中设置刷新令牌或其过期详细信息有关的任何信息。