2008-10-08 23 views
7

Estoy utilizando un atributo de autenticación en algunas de mis acciones en una página asp.net mvc para derivar personas a una pantalla de inicio de sesión si no se han autenticado. Mi problema es devolverlos a la página de referencia después de que hayan iniciado sesión. Solo estaba haciendo un seguimiento de la acción de referencia y el controlador de referencia, pero eso se vuelve problemático cuando también necesito hacer un seguimiento de algunos parámetros. ¿Hay algún ingenioso truco construido sobre el cual no sé?Volver a la página de referencia

Respuesta

3

En caso de que esté utilizando FormsAuthentication, cuando ASP.NET redirige al usuario a la página de inicio de sesión, la URL tiene la siguiente apariencia:

http://www.mysite.com/Login?ReturnUrl=/Something 

atributo de acción de la forma de la conexión debe tener el mismo parámetro ReturnUrl (ya sea de entrada como oculto o como parte de Url) de modo que FormsAuthentication puede recogerlo y redirigir, por ejemplo,

<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form> 

o

<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form> 
2

Lo que hice para lograr ese resultado podría ser exagerar, y me gustaría ver algunos otros métodos también. Sin embargo, aquí está mi código.

Tenga en cuenta que está usando Moq para burlarse de un contexto ... Y, aún no he hecho nada con la cadena de consulta (mis rutas no contienen ninguna cadena de querys).

var urlReferrer = Request.UrlReferrer; 
if (urlReferrer != null) 
{ 
    var url = "~" + Server.UrlDecode(urlReferrer.PathAndQuery); 

    // get routecollection 
    var routeCollection = new RouteCollection(); 
    GlobalApplication.RegisterRoutes(routeCollection); 

    // mcok context 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    context.Expect(ctx => ctx.Request).Returns(request.Object); 

    // mock request 
    // TODO: convert querystring to namevaluecollection 
    // now it's just stripped 
    if (url.IndexOf('?') > 0) 
    { 
     url = url.Substring(0, url.IndexOf('?')); 
    } 

    var mock = Mock.Get(context.Object.Request); 

    // TODO: insert namevaluecollection of querystring 
    mock.Expect(req => req.QueryString).Returns(new NameValueCollection()); 
    mock.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns(url); 
    mock.Expect(req => req.PathInfo).Returns(string.Empty); 

    // get routedata with mocked context 
    var routeData = routeCollection.GetRouteData(context.Object); 
    var values = routeData.Values; 

    return RedirectToAction(routeData.Values["action"].ToString(), values); 
} 

Como ya he dicho, es tal vez un poco excesivamente complicada :)

+0

Al igual que un comentario adicional, también uso el código anterior para modificar algunos de los valores de los datos de la ruta. – Casper

0

siempre debe asegurarse de que la URL de referencia está dentro de su dominio y una cadena plausible que podrían estar viniendo. De lo contrario, esto tiene el potencial de ser utilizado con flash u otras tecnologías del lado del cliente para hacer cosas como la división de respuesta u otros ataques conocidos y desconocidos.

El referer HTTP es una entrada del usuario, y debe ser validada como cualquier otra.

Cuestiones relacionadas