我们已将 Azure ACS 配置为发出有效期为 15 分钟的 JWT。一旦用户登录到 Web 应用程序 (MVC),用户将使用令牌访问另一台服务器 (WebAPI) 上的资源。然后,WebAPI 服务器将验证该令牌。
那么,有没有办法在不中断用户在 Web 应用程序上的工作的情况下以某种方式更新 JWT?我们不想弹出一个窗口并要求用户再次登录。
谢谢!
我们已将 Azure ACS 配置为发出有效期为 15 分钟的 JWT。一旦用户登录到 Web 应用程序 (MVC),用户将使用令牌访问另一台服务器 (WebAPI) 上的资源。然后,WebAPI 服务器将验证该令牌。
那么,有没有办法在不中断用户在 Web 应用程序上的工作的情况下以某种方式更新 JWT?我们不想弹出一个窗口并要求用户再次登录。
谢谢!
如果您使用 .NET 的 Active Directory 身份验证库 (ADAL),则它包含一个令牌缓存。根据这篇博文:
在这一点上我要强调的最后一件事是,每次您从权威机构获得令牌时,ADAL 都会将其添加到本地缓存中。每次对 AcquireToken 的后续调用都将检查缓存,如果存在合适的令牌,它将立即返回。如果找不到合适的令牌,但有足够的信息来获取新令牌而无需重复整个身份验证过程(与 OAuth2 刷新令牌一样)ADAL 将自动执行此操作。缓存是完全可查询的,可以禁用或替换为您自己的实现,但如果您不需要,您甚至不需要知道它在那里:AccessToken 将透明地使用它。
ADAL.NET 在 Nuget 上可用:https ://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/
如果您没有使用 ADAL.NET,请提供更多信息,例如:
我们使用 ACS + ADAL,似乎没有聪明的方法来刷新令牌。即使缓存内令牌的 ExpiresOn 时间到期,AcquireToken 也总是返回过时的缓存令牌。我们自己缓存令牌,因此仅在 ExpiresOn 到期时调用此代码。
我最终得到了这个肮脏的黑客:
var authContext = new AuthenticationContext(ServiceInfo.AcsUrl);
if (authContext.TokenCacheStore.Count > 0)
{
authContext.TokenCacheStore.Remove(authContext.TokenCacheStore.First());
}
result = authContext.AcquireToken(acsRealm, allProviders.First());