2010-03-29 26 views
11

Normalmente, cuando miro una aplicación ASP.Net MVC, la tabla de rutas se configura al inicio y no se toca para siempre.Cambie las rutas MVC de ASP.NET dinámicamente

Tengo un par de preguntas sobre eso, sino que están estrechamente relacionados entre sí:

  • ¿Es posible cambiar la tabla de rutas en tiempo de ejecución?
  • ¿Cómo/debería evitar problemas al enhebrar?
  • ¿Existe alguna forma mejor de proporcionar una URL dinámica? Sé que los ID, etc. pueden aparecer en la URL, pero no puedo ver cómo esto podría ser aplicable en lo que quiero lograr.
  • ¿Cómo puedo evitar eso, aunque tengo definida la ruta predeterminada de controlador/acción, esa ruta predeterminada no funciona para una combinación específica, p. la acción "Publicar" en el controlador "Comentarios" no está disponible a través de la ruta predeterminada?

Antecedentes: spammers Comentario general agarran la URL publicación de la página web y luego no se molestan en ir a través de la página web más para hacer su envío de correo basura automatizado. Si modifico regularmente la URL de mi publicación a alguna al azar, los remitentes de correo no deseado deberían volver al sitio y encontrar la URL de publicación correcta para intentar enviar correo no deseado. Si esa URL cambia constantemente, creo que eso podría hacer que el trabajo de los remitentes de spam sea más tedioso, lo que generalmente debería significar que renuncian a la URL afectada.

+0

¿Cómo resolvió este problema? ¿Puede compartir conmigo? –

Respuesta

3

Considerando el fondo real del problema, el enfoque habitual es incluir un número de transacción creado dinámicamente. Debe almacenarse en un campo de formulario oculto así como en el diccionario de sesión del lado del servidor y solo ser válido para exactamente una solicitud.

Creo que hoy en día muchos marcos proporcionan un mecanismo de seguridad de este tipo; mientras que este tipo de ataque se conoce como Cross-Site-Request-Forgery (csrf).

11

Considero implementar mi propio IRouteHandler y poner algo de lógica personalizada en mi ControllerActionInvoker personalizado. ¿Cómo funcionaría? La tabla de rutas no cambiará dinámicamente, pero puede comprobar en su ControllerActionInvoker personalizado un parámetro aleatorio en la ruta de la ruta e invocar o no la acción correspondiente.

Mi ruta:

routes.Add 
( 
    new Route 
     ( 
      "blog/comment/{*data}", 
      new RouteValueDictionary(new {controller = "blog", action = "comment", data = ""}), 
      new MyRouteHandler() 
     ) 
); 

Mi manejador de ruta I:

class MyRouteHandler : IRouteHandler 
{ 

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new MyHttpHandler(requestContext); 
    } 
}` 

Mi manejador:

class MyHttpHandler : MvcHandler 
{ 
    public MyHttpHandler(RequestContext requestContext) : base(requestContext) 
    { 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
     IController controller = new BlogController(); 
     (controller as Controller).ActionInvoker = new MyActionInvoker(); 
     controller.Execute(RequestContext); 
    } }` 

y mi acción ivoker donde la lógica personalizada para el manejo de una acción o no debe codificarse:

class MyActionInvoker : ControllerActionInvoker 
{ 
    protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> parameters) 
    { 

     var data = ControllerContext.RouteData.GetRequiredString("data"); 


// put my custom logic to check whetever I'll handle the action or not. The data could be a parameter in the database for that purpose. 

     return base.InvokeActionMethod(methodInfo, parameters); 
    } 
} 

No lo sé, es la mejor solución, pero por ahora es lo que me viene a la mente.

+0

Gracias, voy a ver eso también – flq

Cuestiones relacionadas