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.
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.
[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.