首页 > 解决方案 > 使用 refreshtoken adal azureAD 静默更新 accesstoken

问题描述

环境

当前情景

  1. 用户身份验证成功并获取访问/刷新令牌
  2. 一段时间后,访问令牌过期。
  3. 在后续请求中,用户被重定向回 Azure 登录页面,然后重定向回应用配置的主页。由于涉及重定向,用户将丢失当前页面上的所有工作。用户必须重新启动整个工作流程并再次返回原始请求页面。

要求

到期后,刷新应该在用户没有任何显式操作的情况下静默完成。用户留在原处并在令牌刷新完成后继续工作。

代码

阿达尔服务.ts

public get accessToken() {
    return this.context.getCachedToken(this.configService.getAdalConfig.clientId);
}

public get graphAccessToken() {
    return  sessionStorage[new AppConstants().User_Graph_Token];
}

public retrieveTokenForGraphAPI() {
    this.context.acquireToken('https://graph.microsoft.com', function (error, id_token) {

        if (error || !id_token) {
            console.log('ADAL error occurred: ' + error);
        } else {
            // Store token in sessionStorage
            sessionStorage[new AppConstants().User_Graph_Token] = id_token;
            return;
        }
    }.bind(this)
    );
}

OAuth.callback.component.ts

export class OAuthCallbackComponent implements OnInit {

ngOnInit() {
    if (!this.adalService.userInfo) {
        console.log('oauthCallBack::User info not found, redirecting to login');
        this.router.navigate(['loginKey']);
    } else {
        if (!this.adalService.graphAccessToken) {
            this.adalService.retrieveTokenForGraphAPI();
        }
        this.router.navigate([appConstants.App_Home_Page_URL]);
    }

图代币消费者

在这个地方,它检测到令牌已过期,然后重定向到登录页面(接收缓存的参数)。重定向失去了应用程序的工作流上下文,从而妨碍了用户的工作

if (!this.adalService.isAuthenticated) {
    this.adalService.login();
}
const bearer = this.adalService.graphAccessToken;

// Now hit graph client
const client = MicrosoftGraphClient.Client.init({
      authProvider: (done) => {
           done(null, bearer); //first parameter takes an error if you can't get an access token
      }
});

让我知道是否需要任何其他配置/代码详细信息。

(是否应该在会话中明确保存令牌,我只调用“retrieveTokenForGraphAPI”,它可以根据需要从自己的缓存或 iframe 中获取它?)

欢迎任何有关改进方法/设计/代码的建议

标签: angularazure-active-directorymicrosoft-graph-apiaccess-tokenadal

解决方案


在用户登录并且存在有效的会话 cookie 之前,ADAL 将更新已过期的令牌或即将过期的令牌。从用户的角度来看,这种更新发生在后端,只要存在与 AAD 的有效会话,他们就应该认为令牌从未真正过期。我认为在令牌过期之前或之后更新令牌没有太大区别,只要有可用的令牌可以提供给受保护的 API。

当用户登录时,AAD 会设置一个 cookie。只要该 cookie 有效,ADAL 就可以在需要时静默更新令牌。以编程方式,您可以调用aquireTokenapi 来更新令牌。

还要检查您是否在清单中将 oauth2AllowImplicitFlow 设置为 true。这可能会有所帮助:http ://stackoverflow.com/questions/29326918/adal-js-response-type-token-is-not-supported


推荐阅读