В Azure Active Directory, для которой я создал регистрацию приложения, включена двухфакторная аутентификация.Для подмножества пользователей выдается AdalClaimChallengeException
сообщение о том, что требуется вмешательство пользователя:
AADSTS50079: пользователю необходимо использовать многофакторную аутентификацию
исключение имеет значение утверждений, которое выглядит следующим образом:
{
"access_token": {
"capolids": {
"essential": true,
"values": ["<GUID>"]
}
}
}
Документация Azure AD предполагает, что
Проблема утверждений находится внутри заголовка WWW-Authenticate, который может быть проанализирован для извлечения параметра заявок для следующего запроса. После добавления в новый запрос Azure AD знает, как оценить политику условного доступа при входе в систему, и приложение теперь соответствует политике условного доступа
и
В нашем веб-API 1 мы улавливаем ошибку error = Interaction_required и отправляем вызов заявок в настольное приложение.В этот момент настольное приложение может выполнить новый вызов acquToken () и добавить запрос заявок в качестве дополнительного параметра строки запроса .Этот новый запрос требует, чтобы пользователь выполнил многофакторную аутентификацию, а затем отправил этот новый токен обратно в Web API 1 и завершил поток от имени.
Я не уверен, как это сделатьэто в приложении MVC.Компонент промежуточного программного обеспечения полностью настроен для выполнения запроса. Я могу поймать исключение в методе OnAuthenticationFailed
, но как мне работать с токеном?
services.AddOpenIdConnect(opts => {
Configuration.GetSection("Authentication")
.Bind(opts);
opts.ClientSecret = aadClientSecret.Value;
opts.Events = new OpenIdConnectEvents {
OnAuthorizationCodeReceived = async ctx => {
HttpRequest request = ctx.HttpContext.Request;
//We need to also specify the redirect URL used
string currentUri = UriHelper
.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
//Credentials for app itself
var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);
//Construct token cache
ITokenCacheFactory cacheFactory =
ctx.HttpContext.RequestServices.GetRequiredService<ITokenCacheFactory>();
TokenCache cache = cacheFactory.CreateForUser(ctx.Principal);
var authContext = new AuthenticationContext(ctx.Options.Authority, cache);
//Get token for Microsoft Graph API using the authorization code
string resource = "https://graph.microsoft.com";
AuthenticationResult result =
await authContext.AcquireTokenByAuthorizationCodeAsync(
ctx.ProtocolMessage.Code, new Uri(currentUri), credential, resource);
//Tell the OIDC middleware we got the tokens, it doesn't need to do anything
ctx.HandleCodeRedemption(result.AccessToken, result.IdToken);
},
OnAuthenticationFailed = async ctx => {
var adalException = ctx.Exception as AdalClaimChallengeException;
if (adalException != null) {
HttpRequest request = ctx.HttpContext.Request;
var claims = adalException.Claims;
string currentUri = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
//Credentials for app itself
var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);
// there is no user, how do I get their cache?
var cache = new TokenCache();
var authContext = new AuthenticationContext(ctx.Options.Authority, cache);
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", credential);
// now what?
}
}