Как обрабатывать MsalUiRequiredException после AcquireTokenByAuthorizationCodeAsync - PullRequest
1 голос
/ 07 марта 2019

Недавно мы внедрили некоторые политики условного доступа, которые требуют многофакторной аутентификации для определенных приложений. Одна из этих политик налагает CA на некоторые наборы данных, которые также предоставляются через Graph, поэтому для определенных областей действия Graph теперь требуется многофакторная аутентификация.

Я борюсь с тем, как справиться с этим сценарием в веб-приложении .Net с использованием библиотеки предварительного просмотра MSAL v3. Само мое веб-приложение не подпадает под политику CA, но оно пытается запросить область действия графа.

При настройке аутентификации я передаю все графические области, которые требуются приложению:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = ClientId,
        Authority = Authority,
        RedirectUri = RedirectUri,
        Scope = "openid profile offline_access " + GraphScopes,
        PostLogoutRedirectUri = postLogoutRedirectUri,

Этот поток аутентификации не принуждает пользователя к MFA. Следующим шагом является событие AuthorizationCodeReceived. Там я создаю кеш токена и пытаюсь получить токен через код авторизации:

var code = context.Code;
string signedInUserId = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;

TokenCache userTokenCache = new MSALSessionCache(signedInUserId, context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase). GetMsalCacheInstance();

ConfidentialClientApplication cca = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, new ClientCredential(AppKey), userTokenCache, null);
string[] scopes = GraphScopes.Split(new char[] { ' ' });
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, scopes);

Метод AcquireTokenByAuthorizationCodeAsync вызывает метод исключения MsalUiRequiredException. Исключение составляют утверждения, которые, как я полагаю, нужно каким-то образом использовать для форсирования МФА.

Вот где я наткнулся на контрольно-пропускной пункт. Что мне делать с этими претензиями? Я видел некоторую документацию, указывающую, что я должен использовать их как extraQueryParameters при запросе токена, но мне еще не удалось найти метод, который позволил бы мне это сделать. Я нашел метод в классе ConfidentialClientApplicationBuilder, который позволяет мне указывать утверждения, но я все еще получаю MsalUiRequiredException.

На данный момент моим решением было добавить мое веб-приложение в исходную политику условного доступа. Это заставляет MFA на входной стороне потока авторизации и удовлетворяет требованиям Graph. Для меня это кажется ненужным шагом. Я должен быть в состоянии обработать ошибку в моем веб-приложении и программно вызвать MFA.

1 Ответ

1 голос
/ 16 марта 2019

Кажется, в MSAL GitHub есть выделенная страница , которая решает эту проблему.Снимок ниже показывает соответствующий раздел документации.

enter image description here

По сути, все, что нам нужно, это способ указать требуемые утверждения в extraQueryParameters.В вашем делегате для AuthorizationCodeReceived вы можете использовать ConfidentialClientApplication для достижения желаемого результата.В частности, метод *1013* GetAuthorizationRequestUrlAsync позволяет создавать пользовательский URI для конечной точки авторизации с необходимыми утверждениями в дополнительных параметрах запроса.Перенаправление пользователя на вышеуказанную конечную точку приведет к принудительному выполнению MFA и приведет к успешной генерации маркеров доступа.Вот ссылка на пример GitHub, который использует метод GetAuthorizationRequestUrlAsync для указания пользовательских утверждений в дополнительных параметрах запроса.

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