Эта строка зависает навсегда: authContext.AcquireTokenAsync(https://graph.windows.net, учетные данные);

Моя проблема: когда я использую проект Microsoft, строка кода, упомянутая в заголовке, выполняется и проходит проверку подлинности правильно, и я могу выполнять операции над пользователями, как показано в примере проекта "B2CGraphClient". Однако когда я копирую и вставляю B2CGraphClient.cs в свое веб-приложение, эта строка кода зависает навсегда. Как это может быть?

Висящая строка - #184 в B2CGraphClient.cs.

Подробности: я использую пример проекта с именем «B2CGraphClient», упомянутый в этом статья, zip-файл которой находится здесь. Файлы требуют установки переменных clientId, clientSecret и tenant, которые мне удалось установить правильно, чтобы они соответствовали моему экземпляру AAD B2C. Значения этих переменных также были правильно установлены, когда я скопировал код B2CGraphClient.cs в свой проект веб-приложения, поэтому я не думаю, что это проблема.

Подсказки: эти наблюдения потенциально могут быть проблемами:

  1. При запуске примера кода Microsoft «B2CGraphClient» не требуется, чтобы пользователь проходил аутентификацию в веб-приложении; однако мое веб-приложение требует, чтобы пользователь вводил свое имя пользователя/пароль перед использованием клиента Graph.
  2. Когда строка кода в заголовке запускается в моем веб-приложении, следующий URL-адрес в браузере: https://login.microsoftonline.com/<my_domain>.onmicrosoft.com/B2C_1_SiUpIn/...... Я знаю, что имя политики B2C_1_SiUpIn не должно быть в этом URL-адресе. Но как мне это исправить?

Благодарю вас!


ОБНОВЛЕНИЕ

Я публикую код, который инициализирует B2CGraphClient, который показывает, что (по крайней мере, мне так кажется) единственными фрагментами информации, которые передаются клиенту для создания его учетных данных, являются имена clientId, clientSecret и tenant.

    public B2CGraphClient(string clientId, string clientSecret, string tenant)
    {
        // The client_id, client_secret, and tenant are pulled in from the App.config file
        this.clientId = clientId;
        this.clientSecret = clientSecret;
        this.tenant = tenant;

        // The AuthenticationContext is ADAL's primary class, in which you indicate the direcotry to use.
        this.authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenant);

        // The ClientCredential is where you pass in your client_id and client_secret, which are 
        // provided to Azure AD in order to receive an access_token using the app's identity.
        this.credential = new ClientCredential(clientId, clientSecret);
    }

credential позже используется для аутентификации клиента графа:

        AuthenticationResult result = await authContext.AcquireTokenAsync(aadGraphResourceId, credential);

person aBlaze    schedule 16.03.2018    source источник


Ответы (1)


B2CGraphClient был разработан для консольного приложения.

Чтобы интегрировать B2CGraphClient в веб-приложение, вы должны изменить вызовы AcquireToken с синхронного метода на асинхронный метод.

Например. Меняться от:

AuthenticationResult authResult = authContext.AcquireToken("https://graph.windows.net", credential);

to:

AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.windows.net", credential);

person Chris Padgett    schedule 17.03.2018
comment
Спасибо за помощь. К сожалению, я все еще вижу проблему. Я думаю, проблема в том, что имя политики попадает в URL-адрес при выполнении вызова AcquireTokenAsync: https://login.microsoftonline.com/<my_domain>.onmicrosoft.com/B2C_1_SiUpIn/...... Этот URL-адрес не должен включать политику регистрации/вхождения в Azure ADB2C. Это правильно? - person aBlaze; 17.03.2018
comment
Правильный. B2CGraphClient получает маркер доступа к Azure AD Graph API. Он получает это от конечной точки маркера Azure AD версии 1.0, которая не должна включать имя политики в URL-адрес конечной точки. - person Chris Padgett; 17.03.2018
comment
Окей круто. Как удалить имя политики и создать правильный URL-адрес конечной точки? (Но по-прежнему сохраняйте политику, когда пользователь входит в приложение) - person aBlaze; 17.03.2018
comment
Вы можете ответить, пожалуйста? - person aBlaze; 20.03.2018
comment
Я полагаю, что аргумент tenant, который передается конструктору B2CGraphClient, содержит идентификатор политики, потому что вы можете использовать это значение tenant как в промежуточном программном обеспечении аутентификации, так и в этом классе B2CGraphClient. Этот аргумент tenant для конструктора B2CGraphClient должен содержать только идентификатор или имя арендатора. - person Chris Padgett; 20.03.2018
comment
Спасибо за продолжение этой темы. Я опубликовал обновление. Я запустил код, и переменная tenant содержит только идентификатор политики. Я также разместил код, чтобы вы могли это проверить. Есть ли что-то, что я неправильно понимаю или упускаю? - person aBlaze; 20.03.2018
comment
Спасибо, @Emilia, что вы передаете как tenant при инициализации экземпляра B2CGraphClient? то есть var client = new B2CGraphClient("<clientId>", "<clientSecret>", "*what are you passing here?*") - person Chris Padgett; 20.03.2018
comment
Я проезжаю <mydomain>.onmicrosoft.com - person aBlaze; 20.03.2018
comment
Крис, я надеюсь, ты все еще в состоянии продолжить разговор. У вас есть еще предложения? Это правильное tenant имя? - person aBlaze; 23.03.2018
comment
Привет Крис. Я все еще надеюсь, что у вас есть ответ. :) Это последний раз, когда я перепрошу. :) Если бы вы могли, по крайней мере, дайте мне знать, знаете ли вы ответ, был бы очень признателен. Таким образом, я знаю, чтобы перестать писать комментарии. - person aBlaze; 24.03.2018
comment
Привет @Эмилия. Приносим извинения за то, что не проследили за этим раньше. Немного сложно ответить на это из приведенной выше информации. Если вы найдете меня в LinkedIn, я буду рад помочь с устранением неполадок, и мы можем опубликовать окончательный ответ здесь. - person Chris Padgett; 24.03.2018
comment
Приглашение LinkedIn отправлено! Спасибо! - person aBlaze; 24.03.2018
comment
Я использую B2BGraphClient.AccessToken = await authContext.AcquireTokenAsync(this.aadGraphResourceId, учетные данные); это, но сталкиваясь с той же проблемой, линия висит навсегда - person S. Deshmukh; 22.11.2018