IConfidentialClientApplication GetAccountsAsync ничего не возвращает - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь заставить демонстрацию Azure AD B2C работать с моим Azure AD.Это имеет два проекта - TaskService и TaskWebApp.Я получил часть веб-приложения для работы.Он направляет меня на правильную страницу входа.Я использую b2clogin.com вместо login.microsoftonline.com.Если я перехожу на страницу с претензиями в веб-приложении, все выглядит нормально.Однако, когда я пытаюсь использовать TaskService (список дел), он не работает в TaskController.

Сначала он попадает в OnAuthorizationCodeReceived, и токен и утверждения выглядят правильно.AcquireTokenByAuthorizationCode возвращает токен, а в комментарии говорится, что он должен быть кэширован.Затем он попадает в функцию TaskController (Index) и создает другое приложение ConfidentialClientApplication.Затем он вызывает GetAccountsAsync и возвращает пустой список.Там нет ошибки, и я понятия не имею, почему.Это приводит к сбою следующей строки с разумным сообщением об ошибке: «Никакая учетная запись или подсказка входа не были переданы вызову AcquireTokenSilent».Потому что он передает пустой список в качестве второго параметра.

Это приводит к тому, что браузер просто зацикливается между страницей входа и веб-приложением несколько раз, пока не решит остановиться.

// Retrieve the token with the specified scopes
var scope = new string[] { Globals.ReadTasksScope };

IConfidentialClientApplication cca = MsalAppBuilder.BuildConfidentialClientApplication();
var accounts = await cca.GetAccountsAsync(); //this returns empty
AuthenticationResult result = await cca.AcquireTokenSilent(scope, accounts.FirstOrDefault()).ExecuteAsync(); //this throws exception

Я не уверен, что заставило бы меняу меня нет учетных записей, когда у меня есть текущий ClaimsPrincipal.
РЕДАКТИРОВАТЬ: я заметил, что в OnAuthorizationCodeReceived мой AuthenticationResult заполнен почти все, но не Account.Username.Будет ли это иметь значение?Если так, то почему бы не заполнить его?

1 Ответ

1 голос
/ 17 июля 2019

Предполагается, что вы обращаетесь к этим учебным пособиям:

  1. Веб-приложение учебников Active Directory B2C
  2. Учебники Active Directory B2C Web Api

И связанный Проект GitHub (основная ветка, commit bf3bcce)

У меня была такая же проблема.TaskWebApp работает нормально, но доступ к представлению Tasks, основанному на TaskWebApi, приводит к циклу авторизации.Вот что я нашел и как заставить это работать.


TL; DR

В файле Web.config для проекта TaskWebApp добавьте следующую строку в конфигурацию / appSettings:

<add key="ida:TenantId" value="[your AAD B2C Tenant GUID here]" />

Сохранение, сборка и запуск.Вы должны пройти этот цикл проверки подлинности.


Подробности

В Visual Studio я установил точку останова на строке 29 TasksController.cs:

var accounts = await cca.GetAccountsAsync();

Я могу убедиться, что этот LOC включен, когда я перехожу к / Tasks.Войдя в каждый LOC, вызываемый после этого, я проверил каждую часть стека вызовов, чтобы увидеть, где возвращается ноль.

  • GetAccountsAsync ()
  • {внешний код}
  • TaskWebApp.Utils.MSALPerUserMemoryTokenCache .UserTokenCacheBeforeAccessNotification (TokenClassNotification) NOT NULL
  • .LoadUserTokenCacheFromMemory () НЕ NULL

В частности, строка 40 в TaskWebApp \ Utils \ ClaimsPrincipalExtension.cs возвращает значение NULL.

string tenantId = Globals.TenantId;

Он присваивает идентификатор арендатора из класса Globals, определенного в TaskWebApp Web.config, но использует значение из ключа "ida: TenantId", которое нигде не указывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...