#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. Вы пытались клонировать это и настроить для себя?