如何在 ASP.NET SDK 示例中扩展访问令牌

How to extend access token in ASP.NET SDK sample

我的应用程序基于 ASP.NET 来自此处的 Microsoft 图形 SDK 示例:https://developer.microsoft.com/en-us/graph/docs/get-started/aspnetmvc

我成功构建了一个管理日历(会议室)的应用程序,但我遇到了用户在 1 小时后注销的问题。应用程序基于 OpenID,访问令牌的生命周期为 1 小时。我假设在 SDK 示例中会通过下面的代码自动延长访问令牌的生命周期,这样我就不会自己实现刷新令牌:

var cca = new ConfidentialClientApplication(appId, redirectUri, new ClientCredential(appSecret), tokenCache);
var result = await cca.AcquireTokenSilentAsync(scopes);

我正在尝试使用 cookie 和身份验证选项,但我想要成功:

var cookieAuthenticationOptions = new CookieAuthenticationOptions();
cookieAuthenticationOptions.ExpireTimeSpan = TimeSpan.FromMinutes(90);
cookieAuthenticationOptions.SlidingExpiration = false;

new OpenIdConnectAuthenticationOptions{ UseTokenLifetime = true }

所以基本上我想知道,如何让用户在我的应用程序中保持登录状态 90 天,这样用户就不需要每小时输入他的凭据。

  1. 是否可以在示例 SDK 中执行此操作,还是我需要手动执行?
  2. 如果SDK可以,我应该更改什么或如何设置?

非常感谢您的帮助。

您无法控制令牌的 TTL,但您可以通过请求 offline_access scope 获得刷新令牌。刷新令牌的 TTL 为 14 天,每次您请求刷新时,您都会获得一个新令牌 一个新的刷新令牌。

虽然不是特定于 SDK,但我写了一个 v2 Endpoint Primer,其中涵盖了此处起作用的底层机制,包括刷新令牌。

通过快速查看该示例,它应该可以工作。刷新令牌是 MSAL 库的任务,而不是 Graph SDK 的任务。本质上,它的工作方式是样本将 GraphClient 设置为在发送请求时调用 GetUserAccessTokenAsync。该方法从 MSAL 库调用 AcquireTokenSilentAsync,后者执行以下操作:

  • 检查令牌缓存中是否存在有效的未过期访问令牌。如果它在那里,returns它。
  • 如果令牌过期,它会检查是否存在刷新令牌。如果存在刷新,它会使用它来获取新的访问 token/refresh 令牌,缓存新的令牌,然后 returns 新的访问令牌。

如果没有发生这种情况,我会检查您的令牌缓存发生了什么。看起来该示例使用会话来存储令牌,因此它可能会随着您的会话而过期。一个更稳健的解决方案是将令牌存储在安全的数据库中,但样本往往采用简单的方式:)

正如@Jason Johnston 所提到的,SDK 会自行处理,但我们在阅读本文时发现了一件事 - Focus on tenants section.

我们的大多数用户都有个人甚至组织帐户,因此当它尝试刷新令牌时,您必须选择这些帐户之一(每小时后 MS 登录页面询问时。)

更改我们的登录 URL 以使用 "organizations" 租户后,无需其他操作,然后所有刷新自动发生,这是我们预期的行为。