Ola pessoALL,

Estamos trabalhando em uma feature no https://powerembedded.com.br/ para acelerar o setup, fazendo um import dos relatórios e usuários já existentes na nossa plataforma.

Por questões de segurança e facilidade, quando criamos o ClientId inicial para acessarmos os dados do PowerBI criamos com o menor nível de scopes que precisávamos, mas para um import mais robusto precisamos de permissões administrativas.

Para saber um pouco mais sobre o setup de consentimento incremental recomendo o artigo brilhante que o Talles já escreveu no blog dele.

Utilizando o consentimento incremental do Azure AD
No post de hoje, irei falar sobre um desafio que tive que resolver durante o desenvolvimento de uma aplicação, utilizando o incremental…

Nesse artigo quero apenas trabalhar com um detalhe nos projetos de asp.net core, o redirecionamento para a tela de consentimento quando o usuário logado ainda não deu permissão.

Quando utilizamos o atributo [AuthorizeForScopes] o esperado é que o usuário seja redirecionado para a tela de permissão caso o consentimento ainda não tenha sido realizado, mas ao invés disso recebemos um erro:

ErrorCode: invalid_grant
Microsoft.Identity.Client.MsalUiRequiredException: AADSTS65001: The user or administrator has not consented to use the application with ID 'client-id' named 'app-name'. Send an interactive authorization request for this user and resource.

A documentação do pacote não é muito clara em afirmar que precisamos adicionar um bloco try/catch para lidar com o redirecionamento.

Managing incremental consent and conditional access
Helps creating protected web apps and web APIs with Microsoft identity platform and Azure AD B2C - AzureAD/microsoft-identity-web
[HttpGet]
      [AuthorizeForScopes(Scopes = new string[] { "https://analysis.windows.net/powerbi/api/Workspace.ReadWrite.All", "Group.Read.All", "GroupMember.Read.All",
          "https://analysis.windows.net/powerbi/api/Tenant.ReadWrite.All"})]
      public async Task<IActionResult> GenerateToken(
          [FromServices] IAuthorizationHeaderProvider authorizationHeaderProvider,
          [FromServices] MicrosoftIdentityConsentAndConditionalAccessHandler consentHandler,
          [FromServices] ILogger<MigrationController> logger)
      {
          try
          {
              var accessToken = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(MigrationPermissions);
              ViewBag.AccessToken = accessToken;
          }
          catch (MicrosoftIdentityWebChallengeUserException)
          {
              try
              {
                  consentHandler.ChallengeUser(MigrationPermissions);
              }
              catch (Exception exception)
              {
                  consentHandler.HandleException(exception);
              }

              return new EmptyResult();
          }
          catch (Exception ex)
          {
              logger.LogError(ex, "It was not possible generate a user token for the migration script.");
          }
          return View("Index", MigrationPermissions);
      }

Para realizarmos os redirecionamentos adequados basta tratarmos a exception do tipo MicrosoftIdentityWebChallengeUserException e o pacote fara o resto que precisamos.

Uma dica simples, mas que pode salvar horas de debugger.
[]s e até a próxima.

💡
Podemos te ajudar com uma revisão 100% gratuita do seu ambiente cloud.
Share this post