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();
}