【问题标题】:ADAL renewing token using AcquireTokenAsync and existing JWT tokenADAL 使用 AcquireTokenAsync 和现有 JWT 令牌更新令牌
【发布时间】:2017-12-10 13:28:44
【问题描述】:

我通过初始登录获得了一个 JWT 令牌,该令牌设置为在 60 分钟后过期。我想更新这个令牌,这样用户就不会被注销。

为此,我正在使用 AcquireTokenAsync 调用,使用 UserAssertion 在 60 分钟窗口内调用

public static async Task RenewToken(string resourceUri)
{
    var authContext = new AuthenticationContext(Authority);
    var authHeader = HttpContext.Current.Request.Headers["Authorization"];
    var userAccessToken = authHeader.Substring(authHeader.LastIndexOf(' ')).Trim();
    var userAssertion = new  UserAssertion(userAccessToken);

    // keeps returning the same access token with same expiry
    var authResult = await authContext.AcquireTokenAsync(resourceUri, ClientId, userAssertion);

    var userInfo = authResult.UserInfo;
    var apiAccessToken = authResult.AccessToken;
    var expiry = authResult.ExpiresOn.UtcDateTime.ToString("u");
}

是不是上面的调用已有的 JWT 令牌只能在令牌过期后才能使用?

任何意见表示赞赏。

【问题讨论】:

    标签: jwt azure-active-directory access-token adal refresh-token


    【解决方案1】:

    根据您的代码,您似乎想在 web api(service) 端刷新令牌,在服务端您不应该更新访问令牌。客户端应用程序应该执行该操作。

    使用 ADAL,您的应用将在最终用户首次登录时获取访问和刷新令牌,然后您可以在访问令牌过期时使用刷新令牌静默获取新的访问令牌 (AcquireTokenSilentAsync) 和刷新令牌可用且有效。

    从通过提示用户获取访问令牌之日起,可以使用 refresh-token 刷新访问令牌最长 90 天,有效期滑动窗口为 14 天。

    查看我们的code sample implementing this scenario for more help。如果我误解了你的情况,请随时告诉我。

    【讨论】:

    • 谢谢 - 我的情况是我有一个 MVC 应用程序托管我的 SPA 客户端和一个 WebAPI 来访问资源。我在客户端使用 OWIN 中间件通过授权码获取访问令牌,但是在返回的AuthenticationResult 中,没有refresh_token,只有access_token。所以,我在客户端应用程序中使用这个access_token 来请求一个使用AcquireTokenAsyncUserAssertion(access_token) 的新令牌。那是错的吗?您提到的代码与我的相似,但无法知道用于在到期时刷新令牌甚至刷新令牌本身的代码在哪里。
    • @sppc42 , 在 adal v3.x 版本中, 它不会暴露刷新令牌, ADAL 会为你处理这个过程, 例如检查令牌缓存中的刷新令牌是否可用&有效, 获取新的访问令牌通过刷新令牌。有关详细信息,请参阅this blog
    • 南宇,我看过那个博客,我知道现在ADAL中没有refresh_tokens。这就是为什么我上面的代码使用最初收到的access_token 来更新,这也是该博客中提到的,即只需使用UserAssertion(access_token) 调用AcquireTokenAsync。但是,如果在令牌仍然有效(未过期)时进行该调用,则会从缓存中返回相同的令牌。那么,是不是如果这个access_token 过期了,那么只有带有这个access_tokenAcquireTokenAsync 会给我一个新的过期令牌?
    • @sppc42,有刷新令牌返回,但adal不会暴露给你,adal会自动处理刷新令牌过程。使用刷新令牌获取新的访问令牌是您场景中的可靠方式。
    • @sppc42 您之前关于取回相同访问令牌的评论。 ADAL 将检查访问令牌是否过期,如果仍然有效,则从缓存中返回该访问令牌。现在,如果它看到它已过期,那么它将使用刷新令牌(南宇提到的隐藏)为您获取新的访问令牌。第三种情况是如果刷新令牌也过期了,您将收到一个AdalSilentTokenAcquisitionException,表明它不再有效。在这种情况下,您需要不显眼地让用户知道他们需要重新验证并发出新的 OWIN 挑战。
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 2021-09-28
    • 2018-09-29
    • 2022-12-23
    • 2019-03-25
    • 2021-08-23
    • 2015-12-18
    • 2016-09-28
    相关资源
    最近更新 更多