Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no Data Anottation [Authorize(Roles = "Administrador")]

Professor, boa tarde.

Ainda não cheguei no curso AspNet Identity parte 3, estou ainda neste curso parte 2, mas como Roles é algo que me gera bastante dúvidas decidi ver a aula 4 da parte 3 adiantado.

Uma dúvida: é provavel que em aplicações reais do cotidiano as roles sejam gerenciadas de acordo com a regra de negócio. Por isto, imagino que não seja interessante fixar o nome da role diretamente no código.

Desta forma, no Data Anottation [Authorize(Roles = "Administrador")] é possível fazer com que o nome da Role seja dinâmico ao invés de estar fixado?

1 resposta
solução!

Oi Daniel, tudo bem?

Infelizmente, os parâmetros do atributo são avaliados em tempo de compilação, e não em tempo de execução. Isso limita o seu uso. O que você pode fazer é avaliar os papéis do usuário dinamicamente dentro do método:

[Authorize]
public void AlgumMetodo()
{
   var role = "grupo1";

    if (!User.IsInRole(role))
    {
        return StatusCode(HttpStatusCode.Forbidden);
    }
    ...
}

Ou então encapsular essa lógica criando seu próprio atributo, como neste exemplo:

https://stackoverflow.com/a/11494091/1123307

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
        {
            // Administrator => let him in
            return true;
        }

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // No id was specified => we do not allow access
            return false;
        }

        return IsOwnerOfPost(user.Identity.Name, id);
    }

    private bool IsOwnerOfPost(string username, string postId)
    {
        // TODO: you know what to do here
        throw new NotImplementedException();
    }
}

E para consumir este atributo, basta fazer:

[AuthorizeAdminOrOwnerOfPost]
public ActionResult EditPosts(int id)
{
    return View();
}