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

时间:2017-04-22 16:15:27

标签: asp.net-mvc office365 openid dotnetopenauth microsoft-graph

我的应用程序基于Microsoft SDK的ASP.NET 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可以实现,我应该更改什么或如何设置它?
  3. 非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

从快速浏览一下这个样本,它应该可行。刷新令牌是MSAL库的任务,而不是Graph SDK。基本上它的工作方式是,只要发送请求,样本就会将GraphClient设置为调用GetUserAccessTokenAsync。该方法从MSAL库调用AcquireTokenSilentAsync,它执行以下操作:

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

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

答案 1 :(得分:1)

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

虽然不是特定于SDK,但我写了一个v2 Endpoint Primer,它涵盖了这里的基础机制,包括刷新令牌。

答案 2 :(得分:1)

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

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

更改我们的登录网址以使用"组织"租户,不需要其他行动,然后所有刷新都自动发生,这是我们的预期行为。