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?

Foi útil?

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.

O Identity Owin requer LazyLoading?

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

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