¿Cómo obtener atributos de anotación personalizados para una acción de controlador en ASP.NET MVC 4?

Estoy trabajando con un sistema de autorización basado en permisos para mi aplicación en ASP.NET MVC. Para ello he creado un atributo de autorización personalizado.

public class MyAuthorizationAttribute : AuthorizeAttribute
{
    string Roles {get; set;}
    string Permission {get; set;}
}

de modo que pueda autorizar a un usuario por rol o por una clave de permiso específica con anotación para acciones 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()
}

luego anulo el método AuthorizeCore () en la clase MyAuthorizationAttribute con lógica similar (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;
}

Hasta esto está funcionando bien.

Ahora necesito algún tipo de métodos de extensión para poder generar dinámicamente la URL de acción en las páginas de vista que devolverán la URL de acción según la lógica de autorización del atributo MyAuthorization para la acción dada. Me gusta

@Url.MyAuthorizedAction("Add", "User")

devolverá la url a "Usuario / Agregar" si el usuario tiene un rol de administrador o tiene el permiso de "USER_ADD" (como se define en los atributos de la acción) o devolverá una cadena vacía de lo contrario.

Pero después de buscar en internet por unos días no pude resolverlo. :(

Hasta ahora solo he encontrado esto¿Enlace de acción "consciente de la seguridad"? que funciona ejecutando todos los filtros de acción para la acción hasta que falla.

Está bien, pero creo que sería una sobrecarga ejecutar todos los filtros de acción cada vez que llamo al método MyAuthorizedAction (). Además tampoco funcionó con mi versión (MVC 4 y .NET 4.5)

Lo único que necesito es verificar la función del usuario autenticado, los permisos (se almacenarán en la sesión) contra la función autorizada y el permiso para la acción dada. Me gusta algo como siguiente (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
}

Estoy buscando la solución de obtener valor de atributos de acción durante bastante tiempo, no he podido encontrar suficientes recursos en absoluto. ¿Estoy perdiendo las palabras clave adecuadas? : /

Si alguien me puede proporcionar la solución, sería una gran ayuda. Gracias de antemano por las soluciones.

Respuestas a la pregunta(3)

Su respuesta a la pregunta