使用 Azure Active Directory 客户端凭据流控制身份验证令牌的到期
Posted
技术标签:
【中文标题】使用 Azure Active Directory 客户端凭据流控制身份验证令牌的到期【英文标题】:Controlling expiry of auth token using Azure Active Directory client credential flow 【发布时间】:2017-06-20 22:53:00 【问题描述】:我正在使用端点 /oauth2/token 从 Azure Active Directory 请求(通过 HTTP POST)身份验证持有者令牌。 一切都在 AAD 中设置好,以注册使用此流程检索此令牌的 Web 客户端。使用了 client_id 和 client_secret(共享对称密钥),我成功获得了包含 jwt 不记名令牌的 json 响应以进行身份验证。
我想了解的是如何配置令牌的到期时间超过 1 小时到期,这似乎在我通过此 POST 请求获得的令牌上。我在 Azure AD 经典门户中生成的共享密钥的有效期为 2 年。但是,返回的令牌有 1 小时的有效期。
基于此,我假设此流程的工作方式(至少就 AAD 而言)是我们的 Web 客户端需要安排自己在 1 小时内重新发布对新身份验证令牌的请求确保用于 Web 客户端进行的经过身份验证的 REST 调用的身份验证令牌的新鲜度的时间范围。我想如果之前发布的令牌失败然后发出新请求(这只是实现细节......),它也可能会捕获异常。
这是为该流程保持刷新身份验证令牌的正常方式吗? 我知道,对于大多数其他流程,会生成一个刷新令牌,并且可以进行 OAuth“舞蹈”以保持身份验证令牌有效。 ADAL 很好地抽象了所有这些细节,但在这种情况下,我使用客户端凭据流并使用对 oauth2/token 端点的 HTTP POST 请求,并且在此流中(根据 OAuth2 RFC)没有提供刷新令牌。 ]
我曾假设也许可以在 OAuth 令牌上配置更长的到期时间,甚至可能为这种服务器/服务器机密客户端场景配置一个无限期的令牌。 这在 Azure AD 设置中是否可行?
Azure AD token lifetime config 链接的文档表明生命周期是可配置的。
【问题讨论】:
【参考方案1】:在最后一个令牌过期之前获取新令牌的一种简单方法是跟踪它何时过期。因此,每当您为 HTTP 调用获取令牌时:
-
如果我们没有令牌,请获取一个
如果到期时间快到了,换一个新的
无论如何,要么返回缓存的令牌,要么返回新的令牌
确实可以根据您链接的文档为每个服务主体、应用程序或组织配置生命周期。因此,如果您愿意,您应该能够将访问令牌的生命周期延长至 1 天。
我已经确认您确实可以延长 Azure AD 免费层的访问令牌到期时间。 documentation page 上的免责声明确实表明某些功能将来可能需要 Premium。并没有真正说什么:/
您需要Azure AD v2 PowerShell cmdlets 来执行此操作。几个命令就足够了:
Connect-AzureAD
# Create new policy in Azure AD
New-AzureADPolicy -Definition @("`"TokenLifetimePolicy`":`"Version`":1,`"AccessTokenLifetime`":`"03:00:00`"") -DisplayName ThreeHourTokenPolicy -IsOrganizationDefault $false -Type TokenLifetimePolicy
# Apply on Graph API's service principal in my directory
Add-AzureADServicePrincipalPolicy -ObjectId ad17cfce-f2fd-4b3e-91f5-aa0a82e94012 -RefObjectId 640f76ea-6ef6-40c8-8ed5-178a76e7e762
您确实必须找出服务主体的对象 id 的用途,例如Graph API 将其设置为仅用于来自那里的令牌。或者,您可以在第二次调用中设置 -IsOrganizationDefault $true
而完全忽略第三次,使该策略适用于所有服务主体和应用程序,除非它们有更具体的。
Azure AD 中没有无限期的访问令牌,但您可以将刷新令牌的生命周期设置为直到撤销。
【讨论】:
在第二次阅读我链接的那个文档(现在已经超过 1 年)时,配置令牌访问生命周期的功能似乎在 AAD 公共预览版中,并且可能仅限于 AAD超出预览阶段时的溢价。感谢您澄清没有无限期的标记。知道此功能现在是否已成为免费 AAD 层的一部分? 它在免费层可用,但我不能说它是否会保持这种状态。用示例更新了答案。 Juunas - 非常感谢您提供示例 - 使用 Powershell cmdlet 等以上是关于使用 Azure Active Directory 客户端凭据流控制身份验证令牌的到期的主要内容,如果未能解决你的问题,请参考以下文章
使用Laravel的Azure Active Directory SSO
使用Xamarin.iOS进行Azure Active Directory身份验证过程
用于查询Azure Active Directory的Azure服务
使用 DataGrip - Active Directory 连接到 Azure 数据库