Reactjs 带有msal react包装器的msal浏览器';无法从缓存中获取访问令牌

Reactjs 带有msal react包装器的msal浏览器';无法从缓存中获取访问令牌,reactjs,azure,azure-ad-b2c,msal.js,Reactjs,Azure,Azure Ad B2c,Msal.js,@azure/msal浏览器2.14.1 @azure/msal react 1.0.0-beta.2 我们正在使用自定义b2c策略 当我使用PublicClientApplication实例调用acquireTokenSilent时,它不会从缓存中获取访问令牌,但我可以看到访问令牌存储在sessionStorage中,看起来像{homeAccountId}-{tenantSubdomain}.b2clogin.com AccessToken-{aud}-{tid}。以及具有类似格式的refre

@azure/msal浏览器2.14.1 @azure/msal react 1.0.0-beta.2

我们正在使用自定义b2c策略

当我使用PublicClientApplication实例调用acquireTokenSilent时,它不会从缓存中获取访问令牌,但我可以看到访问令牌存储在sessionStorage中,看起来像
{homeAccountId}-{tenantSubdomain}.b2clogin.com AccessToken-{aud}-{tid}
。以及具有类似格式的refreshToken、clientInfo和idToken。它确实按照预期从端点成功返回令牌

在B2C中,重定向uri设置为SPA,隐式流被禁用

配置:

const config = {

auth: {
    clientId: applicationID,
    authority: signInAuthority,
    knownAuthorities: [
      `${tenantSubdomain}.b2clogin.com`,
    ],
    redirectUri: reactRedirectUri,
    validateAuthority: false,
    navigateToLoginRequestUrl: false,
    postLogoutRedirectUri: reactRedirectUri,
  },
  system: {
    loggerOptions: {
      loggerCallback: (level, message, containsPii) => {
        if (containsPii) {
          return;
        }
        switch (level) {
          case LogLevel.Error:
            console.error(message);
            return;
          case LogLevel.Info:
            console.info(message);
            return;
          case LogLevel.Verbose:
            console.debug(message);
            return;
          case LogLevel.Warning:
            console.warn(message);
            return;
        }
      },
      piiLoggingEnabled: false,
    },
    windowHashTimeout: 60000,
    iframeHashTimeout: 6000,
    loadFrameTimeout: 0,
    tokenRenewalOffsetSeconds: 1,
    // allowRedirectInIframe: true,
  },
  cache: {
    cacheLocation: "sessionStorage",
    storeAuthStateInCookie: true,
  },
};
要求:

const signInRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};

const silentRefreshRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};
const signInRequest = {
  scopes: ["xxx/api/user.read"],
};

const silentRefreshRequest = {
  scopes: ["xxx/api/user.read"],
};
脱机访问、openid和profile会自动添加到请求中,我在这些范围内尝试了许多不同的变化

acquireTokenSilent:

const res = await msalInstance.acquireTokenSilent({
            ...silentRefreshRequest,
            account: msalInstance.getActiveAccount(),
          });

我再次尝试了一些不同的变化。在使用B2C时,如果请求您自己的clientId作为作用域,这是一个已知的问题。B2C服务返回“/”的“scope”值,而不是中断缓存的clientId。他们正在解决一个问题,但现在要解决这个问题,你应该在你的应用注册上创建一个自定义范围,并使用它。您可以跟踪,以便在发布修复程序时收到通知。

对于有相同问题的任何人,Thomas是正确的,请签出此项以创建自定义范围,然后将该范围放入您的请求中:

const signInRequest = {
  scopes: ["xxx/api/user.read"],
};

const silentRefreshRequest = {
  scopes: ["xxx/api/user.read"],
};
它似乎修复了从缓存检索令牌时的作用域问题