Azure B2C не может получить доступ к API графика - PullRequest
0 голосов
/ 25 июня 2018

Я получил токен доступа для загрузки графического клиента, используя следующий код:

    string graphResourceID = "https://graph.windows.net";      
    string tenantID = ConfigurationManager.AppSettings["ida:Domain"];
    string aadInstance = "https://login.microsoftonline.com/" + tenantID + 
    "/oauth2/v2.0/token";

Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential credential = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(clientId, appKey);
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance);
authenticationContext.TokenCache.Clear();

var authResult = await authenticationContext.AcquireTokenAsync(graphResourceID,clientcred);

А затем попытался использовать токен для получения информации о пользователе, выполнившем вход в систему, через граф AD API:

Uri servicePointUri = new Uri(graphResourceID);
Uri serviceRoot = new Uri(servicePointUri, tenantID);
ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,async () => await GetTokenForApplication());    
var result = await activeDirectoryClient.Users.Where(u => u.ObjectId.Equals(userObjectID)).ExecuteAsync();
IUser user = result.CurrentPage.ToList().First();

return View(user);

Однако возвращается следующая ошибка:

"error": {
"code": "Authorization_IdentityNotFound",
"message": "The identity of the calling application could not be established.",
"innerError": {
"request-id": "2bdae8ff-d935-4e01-80a1-78cbc8acf4de",
"date": "2017-08-09T18:07:40"

Я убедился, что приложение mu B2C имеет разрешение «Чтение и запись данных каталога» для Windows Active Directory:

enter image description here

Может кто-нибудь помочь, пожалуйста? Застрял на это на некоторое время. ТИА

Редактировать

Я также пытался использовать Microsoft.Graph, но в итоге получил ту же ошибку. Плюс для пользователей B2C, я думаю, что лучше всего сейчас придерживаться API Azure Ad Graph: https://dev.office.com/blogs/microsoft-graph-or-azure-ad-graph

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Спасибо, ребята, похоже, что я использовал идентификатор владельца исходного каталога, который использовал для создания своего каталога B2C.Следовательно, код не может найти мое приложение.Мне нужно использовать идентификатор клиента / имя домена моего каталога Azure B2C, в котором зарегистрировано приложение B2C, нажав на каталог коммутатора в верхнем правом углу портала.

0 голосов
/ 25 июня 2018

Похоже, что вы используете библиотеку Azure AD для работы с Graph API.Я рекомендую вам использовать Microsoft.Graph для этого.Также установите разрешение для Microsoft Graph.

Примечание : не забудьте нажать кнопку [ Предоставить разрешения ].

enter image description here

Ниже приведен демонстрационный код.

string graphResourceId = "https://graph.microsoft.com/";
string authority = "https://login.microsoftonline.com/{0}";
string tenantId = "tenantId";
string clientId = "client Id";
string secretKey = "secret key"
var accessToken = authContext.AcquireTokenAsync(graphResourceId, new ClientCredential(clientId,secret)).Result.AccessToken;
var graphserviceClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    requestMessage =>
                    {
                        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                        return Task.FromResult(0);
                    }));
var user = graphserviceClient.Users.Request().GetAsync().Result.FirstOrDefault();

Результат теста:

enter image description here

Обновление:

Я также тестирую с API-интерфейсом Azure AD Graph с Azure B2c, он также работает правильно на моей стороне.Я также назначаю [Чтение и запись данных каталога] и нажимаю [Предоставить разрешения] без других настроек разрешений.

Ниже приведен демонстрационный код, который я использовал для теста.

 string graphResourceID = "https://graph.windows.net";
 string tenantID = "tenant Id";
 Uri servicePointUri = new Uri(graphResourceID);
 Uri serviceRoot = new Uri(servicePointUri, tenantID);
 ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, async () => await GetAppTokenAsync());
 var result =  activeDirectoryClient.Users.ExecuteAsync().Result;
 IUser user = result.CurrentPage.ToList().First();



 private static async Task<string> GetAppTokenAsync()
 {
        string graphResourceID = "https://graph.windows.net";
        string tenantID = "tenant id ";
        //please remove v2 from the link
        string aadInstance = "https://login.microsoftonline.com/" + tenantID +"/oauth2/token";
        var clientId = "client Id";
        var appKey = "secret key";
        // Instantiate an AuthenticationContext for my directory (see authString above).
        AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance, false);
        // Create a ClientCredential that will be used for authentication.
        // This is where the Client ID and Key/Secret from the Azure Management Portal is used.
        ClientCredential clientCred = new ClientCredential(clientId, appKey);
        // Acquire an access token from Azure AD to access the Azure AD Graph (the resource)
        // using the Client ID and Key/Secret as credentials.
        AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(graphResourceID, clientCred); 
        // Return the access token.
        return authenticationResult.AccessToken;
   }

Результат теста:

enter image description here

Если это все еще не работает для вас.Я предлагаю вам создать новое приложение Azure AD и попробовать его снова.

Packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.ActiveDirectory.GraphClient" version="2.1.1" targetFramework="net471" />
  <package id="Microsoft.Data.Edm" version="5.6.4" targetFramework="net471" />
  <package id="Microsoft.Data.OData" version="5.6.4" targetFramework="net471" />
  <package id="Microsoft.Data.Services.Client" version="5.6.4" targetFramework="net471" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.8" targetFramework="net471" />
  <package id="System.Spatial" version="5.6.4" targetFramework="net471" />
</packages>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...