Personificação de Usuário
Alguns bugs só existem para uma pessoa. Um registro que não abre, um item de menu que não está lá, um total que parece errado — tudo depende dos papéis web, permissões de tabela e papéis de segurança do Dataverse ligados a esse contato. A personificação de usuário permite que um administrador interno faça login como esse contato e veja exatamente o que vê, depois saia novamente.
Quando ajuda
A personificação responde a perguntas que uma descrição do problema não consegue.
- Reproduzindo um problema de suporte. Em vez de raciocinar sobre qual permissão pode estar faltando, você olha para a página do jeito que a pessoa que denuncia faz.
- Verificando uma alteração de permissão. Após editar uma permissão de função web ou de tabela, confirme o efeito em um contato real em vez de inferir isso.
- Verificando o que um papel realmente expõe. Útil antes do lançamento, quando a diferença entre o acesso pretendido e o real é mais fácil de errar.
Usando
A possibilidade está no menu de perfil e aparece apenas para usuários autorizados a usá-la.
- Faça login como um usuário interno com a função de administrador, depois abra o menu do perfil e escolha Visualizar como outro usuário.
- Digite pelo menos três caracteres para buscar por nome ou endereço de e-mail, ou cole um ID de usuário para uma correspondência exata.
- Escolha a pessoa e confirme. O portal recarrega como ela — mesmas funções web, mesmas permissões de tabela, mesmas linhas.
- Um banner permanece fixado no topo de cada página enquanto durar. Escolha Parar para retornar à sua própria sessão.
Que pode se passar por
Duas condições são verificadas no servidor para cada chamada, independentemente do que a interface oferece:
- O usuário logado ocupa o
SystemAdminpapel. Seu projeto decide qual papel de segurança Dataverse concede — os templates gerados mapeiam o papel de Administrador de Sistema embutido mais um configurável através dePortalIdentityOptions.SystemAdminRoleName. - O usuário logado é um usuário interno genuíno do Dataverse. Isso é verificado separadamente da função, então um contato do portal nunca pode se passar por ele, mesmo que seu projeto conceda a vaga por engano.
O alvo é sempre um contato do portal, resolvido apenas pela tabela de contatos. Fornecer o ID de outro usuário interno simplesmente não resolve — não há caminho daqui para uma segunda conta de funcionário.
A personificação só reduz o acesso
Um usuário interno se torna um contato, nunca o contrário e nunca outro usuário interno. Essa direção é o que mantém o recurso seguro para lançar: a sessão personificada só pode fazer menos do que o administrador poderia, então não há privilégio a ser ganho ao usá-la.
Restringendo quem pode ser personificado
Por padrão, todo contato ativo é um candidato. Implemente IImpersonationTargetFilter para restringir isso — para excluir contatos vinculados a contas de funcionários, registros fora da unidade de negócios do administrador ou qualquer outra coisa que sua organização trate como proibida.
public sealed class StaffContactsAreOffLimits : IImpersonationTargetFilter
{
public async Task<bool> CanImpersonateAsync(
ClaimsPrincipal impersonator, Guid targetContactId, CancellationToken ct)
{
// Return false to hide the contact from search AND refuse impersonation.
return await this.IsOrdinaryPortalContactAsync(targetContactId, ct);
}
}
// Program.cs
builder.Services.AddScoped<IImpersonationTargetFilter, StaffContactsAreOffLimits>();
O filtro governa tanto a busca quanto a personificação. Um contato que você rejeita é invisível no seletor, e não apenas não selecionável — caso contrário, a busca silenciosamente se tornaria uma forma de enumerar pessoas que um administrador nunca poderá realmente se tornar.
A trilha de auditoria
Cada largada, parada e tentativa recusada é registrada. Recusas são registradas deliberadamente: uma trilha de sucessos sozinha não pode responder se alguém tentou.
O Dataverse não pode registrar quem estava por trás da sessão
O portal se conecta ao Dataverse como um único usuário de aplicação e expressa a sessão logada se passando pelo alvo. O administrador nunca é transmitido, então, no registro de auditoria do Dataverse, "um administrador atuando como contato" e "esse contato entrando normalmente" são indistinguíveis — e qualquer coisa escrita durante a personificação é atribuída ao contato em
createdbyemodifiedby. A trilha do portal é o único lugar onde essa informação existe, por isso não é opcional.
De imediato, todo evento é escrito no log da aplicação. Implemente IImpersonationAuditSink para persistir isso onde quer que sua organização mantenha seus registros de auditoria — os sinks são adicionados junto ao embutido, em vez de substituí-los.
public sealed class ImpersonationAuditTable : IImpersonationAuditSink
{
public Task OnStartedAsync(ImpersonationAuditEvent e, CancellationToken ct) => this.WriteAsync("started", e, ct);
public Task OnStoppedAsync(ImpersonationAuditEvent e, CancellationToken ct) => this.WriteAsync("stopped", e, ct);
// Denied attempts matter as much as successful ones — a trail of
// successes alone can't answer "did anyone try?".
public Task OnDeniedAsync(ImpersonationAuditEvent e, string reason, CancellationToken ct) => this.WriteAsync(reason, e, ct);
}
// Program.cs — added, not replaced: the framework's own logging sink stays.
builder.Services.AddTransient<IImpersonationAuditSink, ImpersonationAuditTable>();
Do React
A mesma experiência vem para o React: uma entrada no menu de perfil, o seletor e o banner. As ações subjacentes estão ativadas useAuth() se você preferir construir sua própria interface em torno delas.
const auth = useAuth();
// Search, then start. Both are refused server-side unless the caller
// is an internal user holding the SystemAdmin role.
const { results } = await auth.searchImpersonationTargets('smith');
await auth.impersonate(results[0].contactId);
// While impersonating, `auth.user` describes the CONTACT.
auth.user.isImpersonating; // true
auth.user.impersonatorName; // the administrator behind the session
await auth.stopImpersonation();
Vale a pena saber
- Se o contato personificado mudar a senha no meio da sessão, a sessão termina e você retorna ao estado de desconectado, em vez de para sua própria conta. Fazer login novamente restaura a conta.
- Personificação não pode ser aninhada. Pare a sessão atual antes de começar outra.
- Isso não dura mais do que a sessão do navegador — fechar o navegador encerra o processo.
