2010-09-15 65 views
31

Quiero eliminar "returnurl =/blabla" de la barra de direcciones cuando un usuario desea acceder a una página de inicio de sesión requerida. Porque estoy tratando de redirigir al usuario a una página estática después de iniciar sesión para hacer algunas selecciones.Como eliminar returnurl de la URL?

¿Cómo puedo hacer eso?

Respuesta

20

Esta es la naturaleza de Forms Authentication. (que estoy adivinando que estás usando).

Es decir, cuando accede a una página que requiere autenticación, ASP.NET lo redirigirá a la página de inicio de sesión, pasando ReturnUrl como parámetro para que pueda regresar a la página que vino desde el inicio de sesión.

Eliminar esta funcionalidad rompería la semántica y el diseño de la Autenticación de formularios. (IMO)

Mi sugerencia - si no lo necesita, no lo use.

estoy tratando de redirigir al usuario a una página estática después de iniciar sesión para hacer algunas selecciones .

Pedazo de torta - después de haber hecho su nombre de usuario, en lugar de hacer FormsAuthentication.RedirectFromLoginPage (que utiliza el parámetro de cadena de consulta muy ReturnUrl), sólo tiene que utilizar FormsAuthentication.SetAuthCookie y redirigir donde desee.

+0

FormsAuthentication.SetAuthCookie es lo que estoy haciendo now.I derecha sólo quieren quitarlo de la barra de direcciones. –

+0

Luego, mi primer comentario es: es mejor que no utilices la Autenticación de formularios. No hay una manera fácil de hacer esto (que yo sepa). Recordando CUALQUIER página puede redirigir a la página de inicio de sesión (y ASP.NET hace esto). La única forma en que puedo pensar es conectarme a un evento Global.asax y volver a escribir la URL. ¿Por qué te importa si la URL está allí? – RPM1984

+0

y ese comentario contradice su comentario "Porque estoy intentando redirigir al usuario a una página estática después de iniciar sesión para hacer algunas selecciones". El ReturnURL no le impedirá hacer su propio redireccionamiento después de iniciar sesión, A MENOS QUE esté usando RedirectFromLoginPage, que usted ha dicho que no es. Entonces no sé cuál es tu problema. ¿Cómo es que ReturnUrl le impide hacer un redireccionamiento? – RPM1984

8

Como RPM1984 señaló, que no tiene que redirigir al usuario a la URL especificada después de iniciar sesión.

Si es imprescindible que se quita el parámetro de cadena de consulta ReturnUrl hay un par de opciones. Probablemente, lo más fácil sea que en su página web de inicio de sesión/controlador verifique la existencia de un parámetro ReturnUrl en la colección Request.QueryStrings. Si existe, puede hacer un redireccionamiento a la página de inicio de sesión, pero sin el ReturnUrl.

Otra opción sería crear una implementación personalizada para el FormsAuthenticationModule, que es la clase que maneja la autenticación de un usuario según su boleta de autenticación y es responsable de redirigir a los usuarios no autorizados a la página de inicio de sesión. Desafortunadamente, los métodos de la clase FormsAuthenticationModule no son virtuales, por lo que no se puede crear una clase derivada y anular los métodos necesarios, pero la buena noticia es que la clase es bastante simple: tal vez 100-200 líneas de código en total y el uso Reflector puede crear rápidamente su propia clase personalizada FormsAuthenticationModule. Si sigue esta ruta (que no recomendaría), todo lo que tendría que hacer sería sacar el código en el método OnLeave que marca el parámetro ReturnUrl. (Además de modificar esta clase, también necesitaría configurar su archivo Web.config para que su aplicación use su clase personalizada FormsAuthenticationModule en lugar de la de .NET Framework.)

Happy Programming!

10

Crea una alfombrilla Autorizar Atributo

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(
         AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string loginUrl = "/"; // Default Login Url 
      filterContext.Result = new RedirectResult(loginUrl); 
     } 
    } 
} 

luego usarlo en su controlador

[CustomAuthorizeAttribute] 
public ActionResult Login() 
{ 


    return View(); 
} 
+2

Prefiero esta solución, aunque creo que tiene más sentido tener el código en 'HandleUnauthorizedRequest' y usar esta línea en su lugar' filterContext.Result = new RedirectResult (FormsAuthentication.LoginUrl); ' –

2

Añadir una etiqueta de ubicación a su web.config. Si su página está en un subdirectorio, agregue el web.config al subdirectorio.

<location path="ForgotPassword.aspx"> 
    <system.web> 
     <authorization> 
      <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 

ASP pasará por alto la adición de la cadena de consulta ReturnUrl y dirigir para iniciar sesión.

+0

wow, tuve este problema aquí http : //stackoverflow.com/questions/19301787/asp-net-links-wont-redirect-to-the-right-page Gracias me ayudó, y teníamos el mismo nombre de página :) – meda

12

Agregue esto a su archivo Global.asax.

public class MvcApplication : HttpApplication { 

    private const String ReturnUrlRegexPattern = @"\?ReturnUrl=.*$"; 

    public MvcApplication() { 

    PreSendRequestHeaders += MvcApplicationOnPreSendRequestHeaders; 

    } 

    private void MvcApplicationOnPreSendRequestHeaders(object sender, EventArgs e) { 

    String redirectUrl = Response.RedirectLocation; 

    if (String.IsNullOrEmpty(redirectUrl) 
     || !Regex.IsMatch(redirectUrl, ReturnUrlRegexPattern)) { 

     return; 

    } 

    Response.RedirectLocation = Regex.Replace(redirectUrl, 
               ReturnUrlRegexPattern, 
               String.Empty); 

    } 
+0

http: // stackoverflow. com/questions/13394999/form-authentication-and-url-rewriting Estoy usando Autenticación de formularios personalizados. Si utilizo el código que le ha dado al bucle de control una y otra vez, dice "Demasiados redireccionamientos". Creo que el problema es que cuando el Control va a la página de "Inicio de Sesión" como "mywebsite.com/Login", entonces verifica la autenticación y lo redirecciona a la página de "Login.aspx". y su código redirige de nuevo a la página de 'Inicio de sesión'. Este ciclo continúa Me puede ayudar con esto ??? –

+0

¿No necesitamos un ': base()' en el constructor de MvcApplication? – Roberto

1

si está utilizando el control asp.net LoginStatus continuación, haga clic en el estado de conexión f4 control de la prensa (para propiedades) en la sección comportamiento podemos ver logoutAction no seleccione Volver a inicio página.

Nota: Con el fin de poner en práctica con éxito debe tener una página de inicio de sesión con el nombre Login.aspx

+0

se llama "Redirigir a la página de inicio de sesión" (y en el marcado es LogoutAction = "RedirectToLoginPage") –

8

simple ...

[AllowAnonymous] 
public ActionResult Login() { return View(); } 

[AllowAnonymous] 
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); } 

Webconfig

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LoginRedirect" timeout="2880" /> 
</authentication> 
+0

En mi caso tuve que cambiar la ruta en startup.auth.cs y no en la configuración web: 'app.UseCookieAuthentication (new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString (("/ cuenta/LoginRedirect")), ... ' también utilicé RedirectToActionPermanent en lugar de RedirectToAction porque es pernament –

+0

Esta es una buena solución. - la única advertencia es que tendría la solicitud de LoginRedirect en el historial de su navegador, por lo que si alguien pulsa el botón Atrás una vez, los devolvería a LoginRedirect y luego de vuelta a Login. – Jim

-1
protected void LoginControl_LoggedIn(object sender, EventArgs e) 
{ 
    Response.Redirect("~/selection.aspx"); 
} 
0
void Application_BeginRequest(object s, EventArgs e) 
{ 
    // ................ 

    // strip return Return Url 
    if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.Path.IndexOf("login.aspx")!=-1) 
     System.Web.HttpContext.Current.Response.Redirect("~/login.aspx"); 
0

Puede usar HttpUtility.ParseQueryString para eliminar ese elemento. Si utiliza VB.NET entonces este código hace esto

Dim nvcQuery As NameValueCollection 
Dim strQuery As String = "" 

If Not IsNothing(Request.QueryString("ReturnUrl")) Then 
    If Request.QueryString("ReturnUrl").Length Then 
     nvcQuery = HttpUtility.ParseQueryString(Request.QueryString.ToString) 
     For Each strKey As String In nvcQuery.AllKeys 
      If strKey <> "ReturnUrl" Then 
       If strQuery.Length Then strQuery += "&" 
       strQuery += strKey + "=" + nvcQuery(strKey) 
      End If 
     Next 
     If strQuery.Length Then strQuery = "?" + strQuery 
     If Request.CurrentExecutionFilePath <> "/default.aspx" Then 
      Response.Redirect(Request.CurrentExecutionFilePath + strQuery) 
     Else 
      Response.Redirect("/" + strQuery) 
     End If 
     Response.Write(Server.HtmlEncode(strQuery)) 
    End If 
End If 

me volvería a poner esto en el caso Page.Init -, obviamente, tendrá que cambiar el "/default.aspx" para que coincida con la URL de la página de inicio de sesión .

1

Si desea eliminar returnURL de la solicitud y redirigir a una ruta específica, puede seguir estos pasos.

Primero, obtenga el contexto actual, verifique si el usuario está autenticado y finalmente redirija la ruta actual.

HttpContext context = HttpContext.Current; 
     //verify if the user is not authenticated 
     if (!context.User.Identity.IsAuthenticated) 
     { 
      //verify if the URL contains ReturnUrl 
      if (context.Request.Url.ToString().Contains("ReturnUrl")) 
      { 
       //redirect the current path 
       HttpContext.Current.Response.Redirect("~/login.aspx"); 
      } 

     } 

que poner este código en el método Page_Load de mi clase Login.aspx.cs

Cuestiones relacionadas