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

questionAnswers(3)

yourAnswerToTheQuestion