Como obter atributos de anotação personalizados para uma ação de controlador no ASP.NET MVC 4?
Eu estou trabalhando com um sistema de autorização baseado em permissão para o meu aplicativo no asp.net MVC. Para isso, criei um atributo de autorização customizado
public class MyAuthorizationAttribute : AuthorizeAttribute
{
string Roles {get; set;}
string Permission {get; set;}
}
para que eu possa autorizar um usuário por função ou por uma chave de permissão específica com anotação para ações como
public class UserController : Controller
{
[MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")]
public ActionResult Add()
[MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")]
public ActionResult Edit()
[MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")]
public ActionResult Delete()
}
Em seguida, eu substituir método AuthorizeCore () na classe MyAuthorizationAttribute com lógica semelhante (pseudo código)
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(user not authenticated)
return false;
if(user has any role of Roles)
return true;
if(user has any permission of Permissions)
return true;
return false;
}
Até isso está funcionando bem.
Agora eu preciso de algum tipo de métodos de extensão para que eu possa gerar dinamicamente URL de ação nas páginas de visualização que retornarão o URL de ação com base na lógica de autorização do atributo MyAuthorization para a ação determinada. Gostar
@Url.MyAuthorizedAction("Add", "User")
irá retornar url para "User / Add" se o usuário tiver função de administrador ou tiver permissão de "USER_ADD" (conforme definido nos atributos para a ação) ou retornar uma string vazia de outra forma.
Mas depois de pesquisar na internet por alguns dias, não consegui descobrir. :(
Até agora eu encontrei apenas issoLink de ação "ciente de segurança"? que funciona executando todos os filtros de ação para a ação até que ela falhe.
É legal, mas acho que seria uma sobrecarga executar todos os filtros de ação para cada vez que eu chamo o método MyAuthorizedAction (). Além disso, também não funcionou com a minha versão (MVC 4 e .NET 4.5)
Tudo o que preciso é verificar a função do usuário autenticado, as permissões (serão armazenadas na sessão) em relação à função autorizada e a permissão para a determinada ação. Como algo como seguir (pseudo código)
MyAuthorizedAction(string actionName, string controllerName)
{
ActionObject action = SomeUnknownClass.getAction(actionName, controllerName)
MyAuthorizationAttribute attr = action.returnsAnnationAttributes()
if(user roles contains any in attr.Roles
or
user permissions contains any attr.Permissions)
{
return url to action
}
return empty string
}
Eu estou procurando a solução de obter valor de atributos de ação por um longo tempo, não consegui encontrar recursos suficientes o suficiente em tudo. Estou perdendo as palavras-chave certas? : /
Se alguém puder me fornecer a solução que seria realmente uma grande ajuda. Agradecemos antecipadamente pelas soluções