| Data de elaboração | 16/08/2024 |
|---|---|
| Responsável pelo estudo | Paulo Indre B F Santos |
| Equipe do estudo | Tropa de elite |
| Alvo | Solar |
| Origem |
o que originou o estudo? Necessidade do usuário do SOLAR utilizar mais de um perfil. Objetivo estratégico: Facilitar a utilização de múltiplos perfis no sistema para otimizar o desempenho das atribuições do usuário, garantindo acesso a funcionalidades específicas de acordo com as demandas de cada função desempenhada. Essa abordagem visa aumentar a eficiência operacional, melhorar a experiência do usuário e assegurar que as informações e recursos estejam disponíveis de forma adequada para cada contexto de trabalho. Implementação: Usuário selecionar um perfil ao fazer login para acessar as funcionalidades relacionadas a esse perfil. Usuário poder trocar de perfil durante a sessão sem precisar deslogar para facilitar a navegação entre diferentes escopos Projeto: Anoitecer (Solar) - https://setic.atlassian.net/browse/GP-238 Melhoria: Foi realizada a implementação da permissão de cadastro em mais de um perfil. O usuário com cadastro no SAURON que possui perfil no SOLAR pode cadastrar-se em outro perfil. Reparo: - |
| Objetivo | ex: diminuir tempo de atendimento adequando o padrão para 12 horas (dois dias de expediente de trabalho). pode-se utilizar objetivos smart |
| Documentação correlata (opcional) | -- |
| Observações | O esquema de seleção de perfil foi baseado no Sistema Integrado de Descanso- SID |
Claim: Uma afirmação sobre o usuário (como identidade, autorização ou perfil) que é armazenada como parte do token de autenticação. No contexto deste estudo, uma Claim é usada para armazenar o perfil selecionado do usuário.
ClaimsPrincipal: Representa o usuário autenticado e contém uma coleção de Claims associadas a ele. No ASP.NET, o ClaimsPrincipal é usado para acessar as Claims do usuário durante uma sessão.
ClaimsIdentity: Um tipo específico de identidade que usa Claims para representar informações sobre o usuário. No ASP.NET, cada identidade é representada como uma ClaimsIdentity.
selected_profile: Uma Claim personalizada criada para armazenar o perfil selecionado pelo usuário. Essa Claim é verificada pelo sistema para determinar qual perfil está ativo durante a sessão.
IdentityServer4: Um framework open-source para implementar autenticação e autorização em aplicações ASP.NET Core. Neste estudo, ele é o provedor de Single Sign-On (SSO) que emite Claims representando os perfis do usuário.
ASP.NET MVC: Um framework para construir aplicações web na plataforma .NET. Neste estudo, é o framework usado para criar o client que interage com o IdentityServer4.
Token de Identidade: Um conjunto de Claims que é emitido pelo IdentityServer4 e utilizado pelo client ASP.NET MVC para autenticar e autorizar o usuário.
Single Sign-On (SSO): Um sistema de autenticação que permite que um usuário faça login uma única vez e obtenha acesso a várias aplicações associadas. O IdentityServer4 é usado como o provedor de SSO neste estudo.
JavaScript: Uma linguagem de programação usada para implementar a lógica do lado do cliente. No estudo, JavaScript é utilizado para enviar a seleção de perfil do usuário para o servidor via AJAX.
AJAX: Um conjunto de técnicas de desenvolvimento web que permite que uma página web se comunique com o servidor de forma assíncrona. No estudo, o AJAX é utilizado para enviar a seleção de perfil do usuário sem recarregar a página.
ViewModel: Um objeto que encapsula os dados que serão exibidos em uma View. Neste estudo, o SelecionarPerfilViewModel é usado para passar a lista de perfis disponíveis do servidor para a View.
Cookies: Um pequeno pedaço de dados armazenado no navegador do usuário e enviado ao servidor com cada requisição. No ASP.NET, os cookies são usados para manter a sessão do usuário, incluindo as Claims de autenticação.
Sessão: Um mecanismo usado para armazenar dados do usuário entre requisições HTTP. Neste estudo, a sessão pode ser utilizada para armazenar e gerenciar a Claim selected_profile.
RedirectToAction: Um método no ASP.NET MVC que redireciona o fluxo de execução para outra ação do controlador. Neste estudo, é utilizado para redirecionar o usuário após a seleção de um perfil.
A necessidade de gerenciar múltiplos perfis de usuário dentro de um sistema é cada vez mais comum em ambientes corporativos complexos. O objetivo deste estudo é apresentar uma solução para implementar a seleção de perfil em um sistema que utiliza o IdentityServer4 como provedor de Single Sign-On (SSO) e um client ASP.NET MVC com .NET 8 e C# 12. A funcionalidade permitirá que os usuários selecionem um perfil específico ao logar e troquem de perfil sem precisar deslogar.
A solução proposta envolve três funcionalidades principais:
selected_profile.selected_profile para determinar o perfil ativo do usuário.No client, após o login, o sistema recuperará as Claims profile associadas ao usuário e exibirá essas opções para que ele selecione o perfil desejado.
Exemplo de Código para Listar Perfis:
[HttpGet]
[Authorize]
public IActionResult SelecionarPerfil()
{
// Recupera os perfis disponíveis a partir das Claims do usuário
var perfisDisponiveis = User.BuscarPerfis();
// Cria um ViewModel para passar os perfis para a View
var viewModel = new SelecionarPerfilViewModel
{
Perfis = perfisDisponiveis
};
return View(viewModel);
}
public static IList<string> BuscarPerfis(this ClaimsPrincipal user)
{
return user.Claims
.Where(claim => claim.Type == "profile")
.Select(claim => claim.Value)
.ToList();
}
Exemplo de View para Exibir os Perfis:
@model SelecionarPerfilViewModel
<div class="container">
<h2>Selecione o Perfil</h2>
<div class="row">
@foreach (var perfil in Model.Perfis)
{
<div class="col-md-4 text-center">
<button class="botao-perfil btn btn-primary"
data-perfil="@perfil"
onclick="SelecionarPerfil.EnviarSolicitacao(event)">
@perfil
</button>
</div>
}
</div>
</div>
Quando o usuário seleciona um perfil, o sistema armazenará essa seleção como uma nova Claim selected_profile.
SelecionarPerfil.EnviarSolicitacao = function (event) {
const botao = event.currentTarget;
const dados = {
perfil: botao.dataset.perfil
};
$.ajax({
method: "GET",
url: "/Regularize/AdicionarPerfil",
async: true,
data: dados,
success: function (result) {
window.location.href = result.redirectToUrl;
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log(errorThrown);
}
});
}
Backend para Armazenar a Claim:
[HttpGet]
[Authorize]
public async Task<IActionResult> AdicionarPerfil(string perfil, [FromServices] IClaimsIdentityService claimsIdentityService)
{
var identity = (ClaimsIdentity)User.Identity;
// Remove a Claim anterior, se existir
var existingClaim = identity.FindFirst("selected_profile");
if (existingClaim != null)
{
identity.RemoveClaim(existingClaim);
}
// Adiciona a nova Claim
identity.AddClaim(new Claim("selected_profile", perfil));
// Atualiza a autenticação
await HttpContext.SignInAsync("Cookies", new ClaimsPrincipal(identity));
return RedirectToAction("Index", "Home");
}
A cada requisição, o sistema verificará a Claim selected_profile para determinar qual perfil está ativo e ajustar o comportamento do sistema conforme necessário.
Exemplo de Verificação da Claim:
public IActionResult Index()
{
var perfilSelecionado = User.FindFirst("selected_profile")?.Value;
if (string.IsNullOrEmpty(perfilSelecionado))
{
return RedirectToAction("SelecionarPerfil");
}
// Usar o perfil selecionado para determinar o comportamento do sistema
ViewBag.PerfilAtual = perfilSelecionado;
return View();
}
selected_profile para armazenar e gerenciar o perfil ativo do usuário.A implementação da seleção de perfil no Solar utilizando Claims oferece uma solução simples e eficaz para gerenciar múltiplos perfis de usuário, permitindo uma experiência de usuário mais fluida e personalizada.
Microsoft Documentation - ASP.NET Core Identity:
IdentityServer4 Documentation:
OWIN Authentication Middleware:
Microsoft Documentation - Claims-based authorization in ASP.NET Core:
Mozilla Developer Network (MDN) - AJAX:
Microsoft Documentation - ASP.NET MVC Overview: