Не удается получить токен доступа в приложении React для доступа к защищенному API .NET Core с помощью Azure B2C

У меня возникают проблемы с получением токена доступа из моего приложения React при попытке доступа к моему собственному веб-API .NET Core 3.1. Я могу нормально войти в систему и получить доступ к пользовательским данным, но когда я пытаюсь получить токен доступа, я постоянно получаю указанную ниже ошибку. Буду признателен за любую помощь или толчок в правильном направлении. Спасибо!

Неперехваченный (в обещании) BrowserAuthError: silent_sso_error: Тихий единый вход не может быть завершен - предоставлена ​​недостаточная информация. Укажите логин-подсказку или sid.

Вот что у меня есть:

  1. Настройте регистрацию приложения React (SPA с перенаправлением на localhost: 3000 с использованием потока кода аутентификации)
  2. Настройка регистрации приложения .NET Core для веб-API (Интернет с перенаправлением на localhost: 44347)
  3. Созданы две области для веб-API (чтение и запись)
  4. Предоставил API-разрешение для спа для областей веб-API

Настройка веб-API .NET Core 3.1 (ref: https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-protected-web-api-app-configuration):

  1. Запуск ConfigureServices

services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAdB2C");

  1. appsettings.json
    "AzureAdB2C": {
       "Instance": "https://{example}.b2clogin.com",
       "ClientId": "{web api Client ID}",
       "TenantId": "xxxxxxxxxxxx",
       "Audience": "https://{example}.onmicrosoft.com/api"
    }

Настройка React с использованием @ azure / msal-browser: ^ 2.7.0 и @ azure / msal-react: ^ 1.0.0-alpha.0 (ref: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-react):

  1. index.tsx
const configuration: Configuration = {
  auth: {
      clientId: '{SPA Client ID}',
      authority: 'https://{example}.b2clogin.com/{example}.onmicrosoft.com/B2C_1_SignUpIn',
      knownAuthorities: ['{example}.b2clogin.com'],
  },
  cache: {
      cacheLocation: 'localStorage', // This configures where your cache will be stored
      storeAuthStateInCookie: false // Set this to "true" to save cache in cookies
  }
};

const pca = new PublicClientApplication(configuration);

<MsalProvider instance={pca}>
   <App />
</MsalProvider>
  1. App.tsx
  useEffect(() => {
    if (error) {
        login(InteractionType.Popup);
    }
  }, [error, login]);
  1. Доступ к коду токена
const { instance, accounts, inProgress } = useMsal();

useEffect(() => {
        if (inProgress === 'none' && accounts.length > 0) {
            const request = {
                account: accounts[0],
                scopes: ["https://{example}.onmicrosoft.com/api/scope.read"]
            };
            // Retrieve an access token
            instance.acquireTokenSilent(request)
                .then(response => {
                    console.log('response', response);
                    if (response.accessToken) {
                        console.log('accessToken', response.accessToken);
                        return response.accessToken;
                    }
                    return null;
                })
                .catch(error => console.log('token error', error));
        }
    }, [inProgress, accounts, instance]);

person Andrew.Stack.Overflow    schedule 06.12.2020    source источник


Ответы (2)


Для тех, кто сталкивается с подобной проблемой, можно обойтись путем передачи запроса на вход с областями в начальном входе в систему. В моем случае я использую для входа в систему ловушку useMsalAuthentication (). Вы можете следить за цепочкой здесь, https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/2702.

export const loginRequest = {
    scopes: [ "openid", "https://{example}.onmicrosoft.com/api/scope.read" ]
}

const {login, error} = useMsalAuthentication(InteractionType.Redirect, loginRequest);
person Andrew.Stack.Overflow    schedule 08.12.2020

Все упомянутые вами документы относятся к Azure AD, но не к Azure AD B2C.

Мы используем библиотеку react-azure-adb2c для использования ReactJS с Azure AD B2C. Вы можете подписаться на этот блог., и он показывает вам шаги и образец кода.

person Pamela Peng    schedule 07.12.2020
comment
Спасибо. Я бы предпочел использовать официально поддерживаемые библиотеки, но я посмотрю, может ли это сработать. - person Andrew.Stack.Overflow; 07.12.2020
comment
Привет, @ Andrew.Stack.Overflow. Боюсь, что нет официальной библиотеки для интеграции azure b2c с react, но вы можете использовать MSAL.js для интеграции Azure AD B2C с вашим приложением, см. документ. Для получения дополнительной информации см. Этот простой и официальный образец MSAL Azure AD B2C. - person Pamela Peng; 08.12.2020
comment
Команда AzureAD также создает библиотеку для использования специально для React в том же репозитории, который вы опубликовали. Это то, что я использую в своем примере. github.com/AzureAD/microsoft- библиотека аутентификации для js / дерево / - person Andrew.Stack.Overflow; 09.12.2020