我们已将Azure ACS配置为发布有效期为15分钟的JWT。一旦用户登录到Web应用程序(MVC),用户将使用该令牌访问另一个服务器(WebAPI)上的资源。然后,WebAPI服务器将验证该令牌。
那么,有没有办法以某种方式更新JWT而不会中断用户在Web应用程序上的工作?我们不想弹出窗口并要求用户再次登录。
谢谢!
答案 0 :(得分:1)
如果您使用.NET的Active Directory身份验证库(ADAL),则它包含令牌缓存。每this blog post:
此时我要强调的最后一点是,每次从权限ADAL获取令牌时,ADAL都会将其添加到本地缓存中。每次对AcquireToken的后续调用都将检查缓存,如果存在合适的令牌,它将立即返回。如果找不到合适的令牌,但是有足够的信息来获取新的令牌而不重复整个身份验证过程(就像OAuth2刷新令牌的情况一样),ADAL会自动执行此操作。缓存是完全可查询的,可以被禁用或替换为您自己的实现,但如果您不需要,您甚至不需要知道它:AccessToken将透明地使用它。
ADAL.NET在Nuget上可用:https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/
如果您不使用ADAL.NET,请提供更多信息,例如:
答案 1 :(得分: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());