ASP.NET Core, как обращаться с AdalClaimChallengeException при запросе дополнительных ресурсов - PullRequest
0 голосов
/ 30 мая 2018

В 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?
            }
        }
...