我的应用程序基于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天登录,这样用户就不需要每小时输入他的凭据。
非常感谢你的帮助。
答案 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登录页面询问一次)。
更改我们的登录网址以使用"组织"租户,不需要其他行动,然后所有刷新都自动发生,这是我们的预期行为。