asp.net-mvc redirect login

ASP.NET MVC Login ¿ReturnUrl siempre NULL?



asp.net-mvc redirect (5)

Básicamente, Asp.net MVC tiene algunas características ocultas. Por ejemplo, cuando pasa la variable ''id'' a la acción del controlador, interpreta ''id'' como identificador predeterminado y lo pone en la consulta del navegador con barra diagonal. Al usar otro nombre en lugar de ''id'', veremos ''?'' en lugar de barra diagonal. Debido a establecer el nombre ''id'' en el método RegisterRoutes en el archivo global.asax .

En este problema, ha creado un pasador de datos personalizado para el controlador utilizando este código:

using(Html.BeginForm("LogOn", "Account", FormMethod.Post)) { //form fields }

Así que Asp.net MVC ignora otros datos útiles para pasar a la acción del controlador, y veremos returnUrl siempre null .

Mientras que, al usar esto, Asp.net MVC actúa correctamente y returnUrl se monta:

using(Html.BeginForm()) { //form fields in LogOn View }

Por cierto, cuando utilizamos un pasador de datos personalizado para la acción del controlador, debemos pasar otra información manualmente de esta manera:

using(Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] })) { //form fields }

Al usar la Autenticación de formularios en ASP.NET MVC cuando se intenta volver a iniciar sesión en un sitio, se pone un parámetro ReturnUrl en la cadena de consulta. Mi método de acción de inicio de sesión acepta una cadena "returnUrl". Sin embargo, parece que returnUrl cadena siempre es nula, incluso cuando está claramente en la cadena de consulta. ¿Alguna idea de por qué este podría ser el caso o una posible solución?


Esto tiende a suceder cuando está utilizando un formulario de inicio de sesión genérico, pero especifica explícitamente el Controlador y ActionMethod (que está causando una publicación de formulario, pero perdiendo la cadena de consulta)

Solo para aclarar, este es el aspecto que debería tener su código en su BeginForm:

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })

EDITAR : Esto es por diseño como RickA y menciona en los comentarios a continuación. Sin embargo, no permite el patrón de IU de estar en lo más profundo de un sitio, hacer clic en Iniciar sesión y volver a la página en la que estaba anteriormente, si permite a los usuarios anónimos. Es un patrón comúnmente solicitado. El enfoque de David Allen para LogOff también funcionaría muy bien para una redirección limpia en LogOn.


Hay dos maneras en que puedo pensar para lidiar con los escenarios de inicio de sesión y cierre de sesión. Dave Beer esbozó una forma, arriba. Hay otro enfoque que funciona en muchas situaciones. Lo usé cuando codifiqué el tutorial NerdDinner. El tutorial nos proporciona una función de cierre de sesión que te conecta y te lleva a casa. No quería eso. Quería volver a la página en la que estaba antes de cerrar la sesión. Así que modifiqué la acción de cierre de sesión de mi controlador de cuenta para que se vea así

public ActionResult LogOff() { FormsService.SignOut(); return Redirect(Request.UrlReferrer.ToString()); }

Puede hacerse más elegante y pasar un returnUrl y probarlo, en caso de que quiera anular este comportamiento. Pero no necesito eso. Esto logra el resultado deseado. El inicio de sesión puede funcionar de manera similar. Quizás haya formas de usar el framework MVC para hacer esto por mí, pero hasta que las aprenda, esto es MUY simple y funciona de manera confiable.


Pruebe lo siguiente:

public static MvcForm BeginForm(this HtmlHelper htmlHelper, string id) { string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl; TagBuilder tagBuilder = new TagBuilder("form"); tagBuilder.MergeAttribute("id", id); tagBuilder.MergeAttribute("action", formAction); tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true); HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response; httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag)); return new MvcForm(htmlHelper.ViewContext.HttpContext.Response); }

Primero asegúrese de haber configurado la URL de inicio de sesión en web.config, luego, asegúrese de que su formulario de inicio de sesión no contenga nada parecido a una acción, por ejemplo:

Ver:

Si especifica una acción, siempre obtendrá nulo para la URL de retorno:

Controlador:

[AcceptVerbs(HttpVerbs.Post)] public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl) { }


¿Quizás no incluyas el parámetro ReturnURL en el atributo de acción del formulario de inicio de sesión, y lo publicas en una URL sin ese parámetro?