AuthorizeAttribute com identidade ASP.NET
-
20-12-2019 - |
Pergunta
Eu tenho um controlador que é protegido pelo [Authorize]
atributo.
Isso funciona muito bem (sou enviado de volta ao login se não estiver logado), mas desejo adicionar algumas funções a este atributo, li que é possível fazer algo como [Authorize(Roles = "Customer"]
mas quando faço isso, sou imediatamente enviado de volta à página de login do meu aplicativo?
É isto Roles
substituir não funciona com a nova identidade do ASP.NET?Na criação do meu usuário, estou adicionando o usuário ao seguinte código:
var user = new ApplicationUser {UserName = model.Username};
var result = UserManager.Create(user, model.Password);
if (result.Succeeded)
{
UserManager.AddToRole(user.Id, "Customer");
SignIn(user, false);
return RedirectToAction("Done");
}
E de acordo com o banco de dados o usuário está nessa função.Por que isto não está funcionando?Estou faltando alguma configuração ou algum tipo?
Solução
Vou responder à minha própria pergunta.
A razão pela qual isso não estava funcionando (horas de pesquisa) foi porque meu contexto tinha o seguinte:
Configuration.ProxyCreationEnabled = false;
Isso desativou o carregamento lento e, portanto, funções não incluídas quando o usuário foi carregado!
Então a solução foi habilitar isso ou remover a linha.
ATUALIZAR:01-05-2015
Este foi um bug corrigido na versão 2.0.0-alpha1.Portanto, essa solução alternativa não será mais necessária no futuro e as funções serão carregadas independentemente dessa configuração.
Outras dicas
Crie uma função assim:
RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
Em seguida, adicione um usuário assim:
var currentUser = UserManager.FindByName(user.UserName);
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");
Por favor, deixe-me saber se isso funciona para você.
Funciona bem com o AspNet Identity no meu caso.Você tem certeza de que:
- não personalizou os filtros de autorização ou fez certo?
- não reconfigurou a autenticação/autorização no web.config?
- têm entradas adequadas nas tabelas AspNet Identity:AspNetUsers, AspNetRoles, AspNetUserRoles (a função existe e o usuário a possui)?
Confira esta resposta: As funções de usuário de verificação de identidade do ASP.NET não estão funcionando
No seu caso, ao verificar o caso, compare o caso do registro IdentityRole e do atributo Authorize.Não compare com o UserManager.AddToRole(user.Id, "Customer");
eu escrevo uma amostra para testar, funciona bem. então acho que há 2 pontos
1. seu cookie não é salvo no navegador
2. seu cookie não contém informações de função
verifique seu cookie, existe um cookie chamado ".AspNet.ApplicationCookie" (nome padrão)
se não, verifique se seu navegador permite gravar cookie ou o código que você escreve cookie
se existir, você pode criar uma classe estendida
ISecureDataFormat<AuthenticationTicket>
e configuração
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
TicketDataFormat=new T()
});
new T() é a classe
nesta aula você precisa fazer
public string Protect(AuthenticationTicket data)
e
public AuthenticationTicket Unprotect(string protectedText)
é alguma coisa sobre serializar
você pode definir um ponto de interrupção e verificar os dados,
em data.Identity.Claims (um IEnumerable< Claim>) deve ter uma reivindicação com as informações da sua função