Недавно мы внедрили некоторые политики условного доступа, которые требуют многофакторной аутентификации для определенных приложений. Одна из этих политик налагает 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.