如何在 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 天,这样用户就不需要每小时输入他的凭据。
- 是否可以在示例 SDK 中执行此操作,还是我需要手动执行?
- 如果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" 租户后,无需其他操作,然后所有刷新自动发生,这是我们预期的行为。
我的应用程序基于 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 天,这样用户就不需要每小时输入他的凭据。
- 是否可以在示例 SDK 中执行此操作,还是我需要手动执行?
- 如果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" 租户后,无需其他操作,然后所有刷新自动发生,这是我们预期的行为。