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.

Foi útil?

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:

http://www.danharman.net/2011/06/23/asp-nalt-mvc-3-custom-membership-provider-with-repository-injection/

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top