1

我们已将 Azure ACS 配置为发出有效期为 15 分钟的 JWT。一旦用户登录到 Web 应用程序 (MVC),用户将使用令牌访问另一台服务器 (WebAPI) 上的资源。然后,WebAPI 服务器将验证该令牌。

那么,有没有办法在不中断用户在 Web 应用程序上的工作的情况下以某种方式更新 JWT?我们不想弹出一个窗口并要求用户再次登录。

谢谢!

4

2 回答 2

1

如果您使用 .NET 的 Active Directory 身份验证库 (ADAL),则它包含一个令牌缓存。根据这篇博文

在这一点上我要强调的最后一件事是,每次您从权威机构获得令牌时,ADAL 都会将其添加到本地缓存中。每次对 AcquireToken 的后续调用都将检查缓存,如果存在合适的令牌,它将立即返回。如果找不到合适的令牌,但有足够的信息来获取新令牌而无需重复整个身份验证过程(与 OAuth2 刷新令牌一样)ADAL 将自动执行此操作。缓存是完全可查询的,可以禁用或替换为您自己的实现,但如果您不需要,您甚至不需要知道它在那里:AccessToken 将透明地使用它。

ADAL.NET 在 Nuget 上可用:https ://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/

如果您没有使用 ADAL.NET,请提供更多信息,例如:

  • 您正在使用什么库
  • 什么是基于 AD FS 或 Azure Active Directory 的 ACS
于 2013-10-05T10:37:50.313 回答
0

我们使用 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());
于 2013-11-06T11:54:10.667 回答