Microsoft Azure B2C — получить информацию профиля

#c# #azure #xamarin.forms #azure-ad-b2c #microsoft-graph-sdks

#c# #azure #xamarin.forms #azure-ad-b2c #microsoft-graph-sdks

Вопрос:

Я в нескольких шагах от полного отказа от этого рабочего процесса.

Я настроил учетную запись Azure с помощью REST API, несколько других вещей, а затем b2c AD. После нескольких часов ненависти к своей жизни у меня наконец-то получилось (в некоторой степени) использовать это ОБЪЯВЛЕНИЕ для входа в систему и для получения доступа к REST API.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я перепробовал все возможные варианты того, что я могу найти, только о том, как получить информацию о профиле того человека, который вошел в систему, и я абсолютно ничего не получаю.

Даже файлы примеров после входа в систему не работают должным образом — они предназначены для перенаправления вас на страницу с надписью welcome (имя пользователя), но имя пользователя не возвращается в моем результате на

  result = await App.AuthenticationClient
                    .AcquireTokenInteractive(B2CConstants.Scopes)
                    .WithPrompt(Microsoft.Identity.Client.Prompt.SelectAccount)
                    .WithParentActivityOrWindow(App.UIParent)
                    .ExecuteAsync();
  

Ничто из этого не является ни в малейшей степени интуитивным. Я читал документы, но почему-то каждый раз, когда я гуглю, я попадаю на другую страницу документов Microsoft с другой информацией.

Я не знаю, что мне нужно передать областям… Я не знаю, как получить токен аутентификации, так как каждый раз, когда я пытаюсь использовать graphs, я получаю сообщение об ошибке с пустым или недопустимым токеном аутентификации (даже после входа в систему).

Несмотря на то, что я успешно вошел в систему с помощью Google, приведенный выше результат дает мне нулевой токен доступа, нулевой идентификатор клиента, нулевые области действия, нулевое имя пользователя в учетной записи… ЕДИНСТВЕННОЕ, что правильно, это то, что уникальный идентификатор совпадает с идентификатором, который я вижу на странице пользователей AD.

РЕДАКТИРОВАТЬ: на самом деле значение accessToken не равно null, я получаю там информацию… но каждый вызов, который я пытаюсь сделать, который, по моему мнению, должен использовать, терпит неудачу.

Т.Е., если я попытаюсь вызвать это, чтобы получить мою информацию после входа в систему:

 InteractiveAuthenticationProvider authProvider = new InteractiveAuthenticationProvider(App.AuthenticationClient, B2CConstants.Scopes);
                GraphServiceClient graphClient = new GraphServiceClient(authProvider);
                var users = await graphClient.Me.Request().GetAsync();
  

Обратите внимание, что App.AuthenticationClient — это то, что я использовал для входа в систему выше — я также пробовал это с

             //.Create(B2CConstants.ClientId)
            //.Build();
  

Я получаю это (только частичная ошибка, поэтому я не передаю идентификаторы)

 Microsoft.Graph.ServiceException: 'Code: InvalidAuthenticationToken
Message: Access token validation failure.
Inner error:
    AdditionalData:
    date: 2020-10-26T21:45:25
  

Комментарии:

1. Если вы хотите вызвать Microsoft graph, вам необходимо получить токен доступа Azure AD. Согласно вашему коду, кажется, что вы получаете токен b2c для вызова Microsoft Graph. О том, как вызвать Microsoft graph в клиенте B2C, пожалуйста, обратитесь к learn.microsoft.com/en-us/azure/active-directory-b2c /…

Ответ №1:

Я предлагаю вам в основном обращаться к документам Microsoft для получения любой информации.

Рассмотрим приведенный ниже код для получения сведений о пользователях из B2C (это код Android Xamarin Forms page .cs):

 async void OnSignInSignOut(object sender, EventArgs e)
        {
            AuthenticationResult authResult = null;
            IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();
            try
            {
                if (btnSignInSignOut.Text == "Sign in")
                {
                    try
                    {
                        IAccount firstAccount = accounts.FirstOrDefault();
                        authResult = await App.PCA.AcquireTokenSilent(App.Scopes, firstAccount)
                                              .ExecuteAsync();
                    }
                    catch (MsalUiRequiredException ex)
                    {
                        try
                        {
                            authResult = await App.PCA.AcquireTokenInteractive(App.Scopes)
                                                      .WithParentActivityOrWindow(App.ParentWindow)
                                                      .ExecuteAsync();
                        }
                        catch(Exception ex2)
                        {
                            await DisplayAlert("Acquire token interactive failed. See exception message for details: ", ex2.Message, "Dismiss");
                        }
                    }

                    if (authResult != null)
                    {
                        var content = await GetHttpContentWithTokenAsync(authResult.AccessToken);
                        UpdateUserContent(content);
                        Device.BeginInvokeOnMainThread(() => { btnSignInSignOut.Text = "Sign out"; });
                    }
                }
                else
                {
                    while (accounts.Any())
                    {
                        await App.PCA.RemoveAsync(accounts.FirstOrDefault());
                        accounts = await App.PCA.GetAccountsAsync();
                    }

                    slUser.IsVisible = false;
                    Device.BeginInvokeOnMainThread(() => { btnSignInSignOut.Text = "Sign in"; });
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("Authentication failed. See exception message for details: ", ex.Message, "Dismiss");
            }
        }
  

Для получения полных и пошаговых примеров интеграции B2C вы можете перейти по ссылкам ниже:

Комментарии:

1. Итак, как всегда, причина, по которой я публикую и прошу о помощи, заключается в том, что я следил за этим документом, и он не предоставляет мне информацию о пользователях.

2. Используемый вами метод отличается от этого. Можете ли вы клонировать это решение и просто настроить в соответствии с инструкциями и протестировать его? Это должно сработать. Я использовал это решение в прошлом.

3. Я показал только одну попытку — я пробовал много вещей. Единственное, что у меня работает (somehwat), это просто выполнение HTTP-запроса к url /.auth /me с моим токеном доступа — однако проблема здесь в том, что когда я создаю новую учетную запись в приложении, а затем запускаю запрос, я не получаю результатов — пока я не перейду к этому URL вмой браузер на моем ноутбуке вручную, что дает результаты, после чего приложение suddenyl тоже начинает работать

4. Вы пытались клонировать это и настроить для себя?