Convites
Um convite traz as pessoas para o portal de propósito: a equipe escolhe quem o recebe e quais funções ele concede, e cada destinatário recebe um link próprio. Depois, cria o login no contato que já existe para eles — com senha ou login externo — ou, se já tiverem um, adiciona os papéis a ele. É assim que um portal que não permite o cadastro de estranhos traz seus usuários a bordo.
Como um convite viaja
Um convite é escrito como rascunho, e enviá-lo só muda seu status. O próprio processo temporizado do portal — rodando a cada cinco minutos em cada instância — percebe, calcula os destinatários e envia por e-mail a cada um um link com seu próprio código. Apenas o hash do código é armazenado, então ler a tabela não dá a ninguém um link funcionando.
- Rascunho — escolha quem recebe, as vagas que ele concede, seu vencimento e o e-mail por que é enviado.
- Pronto para enviar — Enviar foi pressionado; o portal o capta em poucos minutos.
- Enviado — os destinatários existem e seus links funcionam até expirar (30 dias após o envio, a menos que você defina uma data).
- Expirado ou Cancelado — os links param de funcionar.
Quem recebe
Um convite vai para um contato, para uma conta — todo contato ativo que ela tem — ou para qualquer critério escrito com o retorno do construtor de consultas FetchXML. Os destinatários são calculados quando o convite é enviado, com acesso da pessoa que enviou, e enviá-lo novamente depois alcança quem corresponder até lá e não o recebeu, sem enviar e-mail para ninguém duas vezes. Contatos sem endereço de e-mail são pulados e, portanto, a menos que o convite diga o contrário, são os contatos que já têm login no portal.
Quem recebe é fixo assim que é enviado
Uma vez que um convite sai do Rascunho, quem o recebe e os papéis que ele concede não podem mudar — os papéis são lidos quando alguém aceita, então mudá-los mudaria o que as pessoas que já possuem um link recebem. A data de expiração ainda pode ser movida. Cada destinatário pode ser reenviado por um novo link ou revogado por conta própria.
O e-mail
Deixado por conta própria, o portal envia seu próprio e-mail, a partir da localização (app.email-templates.invitation). Para escrever o seu, crie um modelo de contato ou e-mail global no Dataverse, coloque {{invitation-link}} onde o link deve ir e escolha no convite. Um modelo sem o marcador falha no destinatário, em vez de enviar um e-mail que ninguém pode agir.
Aceitando
O link se abre /Account/Invitation. Alguém sem login cria um ali — o endereço de e-mail do contato convidado, com senha ou qualquer login externo configurado — mesmo quando o cadastro está desativado. Alguém com login faz login e aceita; alguém que fez login como outra pessoa é solicitado a sair da sessão. Seguir um link enviado para o endereço conta como confirmação, então nenhum e-mail de confirmação segue. Um código desconhecido, usado, revogado, expirado ou para outro portal diz a mesma coisa.
O discurso público
O processo temporizado funciona fora de qualquer requisição, então ele lê o endereço de PowerPortalsPro:PublicUrl onde o portal é alcançado — necessário, para cada portal. Seus links apontam para lá, e é o endereço que a licença do portal é verificada ao decidir quais convites são seus. Defina por ambiente para que os links do UAT apontem para o UAT; no Azure App Service é a PowerPortalsPro__PublicUrl configuração do aplicativo, marcada como uma configuração de slot de implantação. Um portal rodando localhost não envia convites a menos que PowerPortalsPro:Invitations:DevelopmentWebsiteId nomeie o registro do site para agir como um local.
{
"PowerPortalsPro": {
"PublicUrl": "https://portal.contoso.com"
}
}
Ligando a fiação
InvitationAdmin lista os convites, com Enviar e Cancelar; InvitationForm edita um, com seus destinatários abaixo. Gate a página na verificação de administrador do portal, como nas outras páginas de administrador, e dê ao formulário uma página própria: os critérios são escritos com o construtor de consultas FetchXML, que quer a sala. Cada alteração é feita como membro da equipe logado, então a segurança do Dataverse se aplica aqui como no aplicativo orientado a modelos.
// Abre cada convite em uma página própria
<InvitationAdmin
invitationUrl={(id) => `/InvitationAdmin/Invitation/${id ?? 'new'}`}
onNavigate={(url) => navigate(url)}
/>@attribute [Route("InvitationAdmin")]
@attribute [AuthorizeSystemAdmin]
@using PowerPortalsPro.Web.Blazor.FluentUI.Components
<SystemAdminView>
<Authorized>
<InvitationAdmin InvitationUrl="InvitationAdmin/Invitation?invitationId={0}" />
</Authorized>
</SystemAdminView>// Um convite, em um RecordContext com um botão de Salvar
const { id } = useParams();
const isCreateMode = id === 'new';
<RecordContext table="ppp_invitation" {...(isCreateMode ? {} : { id })}>
<SaveContextButton appearance="primary" />
<InvitationForm />
</RecordContext>
InvitationAdmin
InvitationAdmin Classe
Parâmetros
Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
InvitationUrl | string? | Quando um convite é editado, como uma URL cujo |
InvitationUrlFormulário de Convite
InvitationForm Classe
Propriedades
Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
Record | TableRecord? | O convite sendo editado. |
Record