Ok, quiero agregar algo de seguridad a mi sitio a través del método ActionLink. Si el usuario tiene suficientes derechos para acceder a la acción/controlador, entonces ActionLink debería representar el enlace. Si no, debería devolver una cadena vacía. Ahora, el ActionLink es un método estático y eso lo hace todo más difícil. ¿Hay alguna manera de lograr lo que estoy tratando de hacer?Cómo anular el comportamiento de ActionLink
Respuesta
nuevo AuthorizeActionLink
método de extensión. Sobrecarga según sea necesario.
public static MvcHtmlString AuthorizeActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
if (HasActionPermission(helper, actionName, controllerName))
return helper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes);
return MvcHtmlString.Empty;
}
public static MvcHtmlString AuthorizeActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
{
if (HasActionPermission(helper, actionName, controllerName))
return helper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes);
return MvcHtmlString.Empty;
}
métodos que hacen el trabajo sucio en averiguar si el usuario está autorizado
static bool HasActionPermission(this HtmlHelper htmlHelper, string actionName, string controllerName)
{
ControllerBase controllerToLinkTo = string.IsNullOrEmpty(controllerName)
? htmlHelper.ViewContext.Controller
: GetControllerByName(htmlHelper, controllerName);
ControllerContext controllerContext = new ControllerContext(htmlHelper.ViewContext.RequestContext, controllerToLinkTo);
ReflectedControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerToLinkTo.GetType());
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
return ActionIsAuthorized(controllerContext, actionDescriptor);
}
static bool ActionIsAuthorized(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
return false;
AuthorizationContext authContext = new AuthorizationContext(controllerContext, actionDescriptor);
foreach (IAuthorizationFilter authFilter in actionDescriptor.GetFilters().AuthorizationFilters)
{
authFilter.OnAuthorization(authContext);
if (authContext.Result != null)
return false;
}
return true;
}
static ControllerBase GetControllerByName(HtmlHelper helper, string controllerName)
{
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(helper.ViewContext.RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
string.Format(
CultureInfo.CurrentUICulture,
"Controller factory {0} controller {1} returned null",
factory.GetType(),
controllerName));
}
return (ControllerBase)controller;
}
entonces no hay forma de hacerlo con el mismo método Html.ActionLink()? –
no, pero creo que esta es una gran forma reutilizable para hacer este tipo de visualización de enlace condicional en toda su aplicación – hunter
bien, entonces :) gracias –
- 1. Cómo anular el comportamiento estándar de ApplicationTagLib # createLink yg: ¿enlace?
- 2. Cómo anular el comportamiento de println para los tipos de referencia
- 3. ¿Cómo anular el operador []?
- 4. jquery datatables actionlink cómo agregar
- 5. MVC3 Cómo deshabilitar/habilitar ActionLink
- 6. ActionLink htmlAttributes
- 7. ¿Cómo poner el elemento span dentro de ActionLink MVC3?
- 8. Raw ActionLink linkText
- 9. ¿Cuál es la mejor manera de anular el comportamiento de destrucción de ActiveRecord de Rails?
- 10. MVC MapPageRoute y ActionLink
- 11. ActionLink con múltiples parámetros
- 12. creando https ActionLink
- 13. Cómo anular el borde: ninguno?
- 14. Cómo anular el ecos locales
- 15. ¿Cuáles son las opciones para anular el comportamiento de eliminación en cascada de Django?
- 16. ActionLink CS1026:) esperado
- 17. ActionButton en lugar de ActionLink
- 18. Cómo anular (desactivar) el comportamiento de "enviar" de una etiqueta de botón dentro de una etiqueta de formulario?
- 19. Cómo detectar el comportamiento indefinido
- 20. ASP MVC Areas y ActionLink
- 21. MVC3 - Ajax actionlink - OnBegin, onComplete
- 22. Acción T4MVC fuertemente tipada/ActionLink
- 23. Eliminar ActionLink con el cuadro de diálogo de confirmación
- 24. ¿Cómo anular el evento onclose en WPF?
- 25. En C# cómo anular el método Finalize()?
- 26. Cómo anular el enlace en GIN
- 27. Cómo anular contiene()?
- 28. ¿Cómo cambiar el comportamiento de los talones?
- 29. ¿Cómo controlar el comportamiento de json_encode?
- 30. Cómo anular ObjectOutputStream.writeStreamHeader()?
Eso no es muy buena seguridad. Si el usuario puede descubrir qué es el enlace, puede ingresarlo directamente. Ocultar el enlace puede ser algo más que hacer, pero su seguridad real debería tener lugar en el servidor. –
Sí, lo hice, es increíble cuando todo está conectado. Desenterraré algún código ... – hunter
@Matt, no es cierto si se hace correctamente. Puede crear ActionLinks que consulten el atributo 'Authorize' de la clase/método antes de representar el enlace. De modo que puede controlar la visibilidad del enlace y acceder al método con nada más que el atributo Autorizar. – hunter