续订Azure ACS发布的JWT

时间:2013-10-04 20:05:45

标签: asp.net-mvc azure asp.net-web-api acs jwt

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

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

谢谢!

2 个答案:

答案 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,请提供更多信息,例如:

  • 您正在使用的图书馆
  • 什么是ACS,AD FS或Azure Active Directory

答案 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());