Armazene/atribua funções de usuários autenticados
-
10-07-2019 - |
Pergunta
Estou atualizando um site para usar o MVC e estou procurando a melhor maneira de configurar a autenticação.
Neste ponto, tenho o login trabalhando no Active Directory: validando um nome de usuário e senha e, em seguida, configurando o cookie de autenticação.
Como armazenar as informações de função do usuário no momento do login, para que meus controladores vejam essas funções à medida que o usuário navega pelo site?
[Authorize(Roles = "admin")]
Não tenho nenhum problema em obter uma lista de funções do Active Directory. Só não sei onde colocá -los para que os controladores os vejam.
Solução
Quando você autentica seu usuário, você gera uma nova instância genérica. O construtor pega uma variedade de strings que são as funções para o usuário. Agora defina httpcontext.current.user igual ao diretor genérico e escreva o cookie de autenticação, e isso deve fazê -lo.
Outras dicas
Funções são adicionadas ao IPrincipal do httpContext. Você pode criar um Genérico princípio, analise a lista de funções no construtor e defina -a como httpcontext.user. O genérico princípio será então acessível através User.IsInRole("role")
ou o [Authorize(Roles="role")]
atributo
Uma maneira de fazer isso (em C#) é adicionar suas funções como uma string separada por vírgula no parâmetro de dados do usuário ao criar seu ticket de autenticação
string roles = "Admin,Member";
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
userId, //user id
DateTime.Now,
DateTime.Now.AddMinutes(20), // expiry
false, //do not remember
roles,
"/");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);
Em seguida, acesse a lista de função a partir do ticket de autenticação e crie um GenicPrincipal do seu global.asax.cs
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
HttpCookie authCookie =
Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null) {
FormsAuthenticationTicket authTicket =
FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(new Char[] { ',' });
GenericPrincipal userPrincipal =
new GenericPrincipal(new GenericIdentity(authTicket.Name),roles);
Context.User = userPrincipal;
}
}
Para aqueles que usam o MVC 4 ou maior, precisará seguir o conselho de Jaroslaw Waliszko ao fazer uso da resposta de David Glenn:
"Eu o testei no ASP.NET MVC 4 e sugiro usar o Application_postauthenticaterequest. Caso contrário, o diretor genérico será substituído". - Jaroslaw Waliszko 7 de setembro às 16:18
Assim, como afirmado acima, tudo o que você precisa fazer é substituir o nome do método Application_authenticaterequest por application_postauthenticaterequest para fazer com que isso funcione. Caiu como uma luva para mim! Se eu tivesse permissão para voar Jaroslaw e David, eu o faria.
Eu estaria inclinado a apenas criar um provedor de função personalizado. Exemplo aqui:
Você não poderia cair em um Gerente de função do armazenamento de autorização ou Encontre (por exemplo, no codeplex) ou Escreva Outro provedor de função que trabalha com o Active Directory para obter as informações dos grupos?
Isso economizaria o incômodo de autenticar o usuário, obter suas funções e depois reassar essas informações no construtor, e todos aconteceriam automaticamente para você como parte da estrutura.