2011-08-07 12 views
8

ReturnUrl es un poco feo. Me gustaría usar redirect en su lugar. ¿Cómo puedo especificar el nombre del parámetro que se debe usar para las URL de redireccionamiento de autenticación de formularios junto con el atributo [Authorize]? ¿O tengo que crear una implementación IAuthorizationFilter? :(¿Cómo puedo cambiar el nombre del parámetro "ReturnUrl" utilizado por ASP.NET MVC?

Ejemplo:

[Authorize] 
public class Tools : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Cuando un usuario que no está conectado visitas http://example.com/tools, me gustaría que se reenvíen a http://example.com/account/logon?redirect=%2ftools, en lugar del predeterminado http://example.com/Account/LogOn?ReturnUrl=%2ftools

Para el/la cuenta/logon parte, puede modificar mis rutas en Global.asax y cambiar

<authentication mode="Forms"> 
    <forms loginUrl="~/account/logon" timeout="2880" /> 
</authentication> 

en web.config. Pero no sé cómo cambiar el Ret parámetro urnUrl

+0

Sé que llego muy tarde a esta discusión, pero tengo el mismo problema, así que publiqué una solicitud de mejora para esto con Microsoft. http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3049874-make-returnurl-a-configurable-key-name-instead-o Siéntase libre de votar, comentar, etc. Con suficientes votos, puede llamar su atención. –

Respuesta

1
No

la mejor solución en torno, pero funciona ...

<rule name="FormsAuthentication" stopProcessing="true"> 
    <match url="^account/log(i|o)n$" /> 
    <conditions> 
    <add input="{QUERY_STRING}" pattern="^ReturnUrl=([^=&amp;]+)$" /> 
    </conditions> 
    <action type="Redirect" url="account/logon?redirect={C:1}" appendQueryString="false" /> 
</rule> 
0

El problema aquí es que una redirección no es una publicación. Es un get. La única forma de pasar una variable en get es usar un parámetro de cadena de consulta de algún tipo. Puede ocultar esta reescritura de url, pero sigue siendo un parámetro de consulta y se transmite a la URL.

¿Quizás podría estar un poco más claro sobre lo que está buscando?

+0

No estoy seguro de haber entendido mi pregunta ... Agregué un ejemplo, con suerte eso hará que lo que estoy preguntando sea más claro. –

+0

Sí, entiendo lo que quieres decir ahora ... Esto parece suceder más arriba en la cadena. Cuando se devuelve el 401, se captura la cadena y se emite el redireccionamiento. Estoy investigando. –

0

No hay forma de cambiar el nombre del parámetro utilizando la configuración porque el nombre del parámetro "ReturnUrl" está codificado en la clase System.Web.Security.FormsAuthentication, que es la clase que se usa para la autenticación de formularios, incluyendo redirecciones.

Una forma de lograr el resultado deseado es extender el atributo Autorizar de manera que redirija a la página de inicio de sesión con su nombre de parámetro personalizado. Luego, dependiendo de los métodos adicionales de FormsAuthentication que use, puede modificarlos también, en particular FormsAuthentication.RedirectFromLoginPage.

-1

El nombre del parámetro no se puede cambiar, lo que es molesto. Lo resolví escribiendo mi propio módulo de autenticación, necesitas saber cómo funciona la autenticación en el interior, pero no es difícil, solo mira cómo se hace en el reflector (y posiblemente simplificarlo, terminé usando solo el cifrado/descifrado de cookies desde FormsAuthentication).

+0

En realidad, puede cambiar, consulte http://msdn.microsoft.com/en-us/library/hh975440.aspx –

10

Añadir esta clave a la sección de appSettings de su web.config

<add key="aspnet:FormsAuthReturnUrlVar" value="redirect" /> 
-1

Sólo añadir en su web.config la sección appSettings siguiente par clave-valor:

<add key="aspnet:FormsAuthReturnUrlVar" value="your-custom-parameter-name"/> 
2

La pregunta y las respuestas aquí parecen estar relacionadas con th e cosas viejas de autenticación de formularios. En las versiones más nuevas de MVC, p. MVC 5 (con Identidad 2.0), que haría algo como esto en el Startup.Auth.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/account/login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      }, 
      ReturnUrlParameter = "redirect" 
     }); 

La parte importante es, por supuesto ReturnUrlParameter = "redirect" (puede ser cualquier cosa). El resto puede ser diferente para tu proyecto.

Cuestiones relacionadas