2009-02-27 18 views
7

Cuando un usuario hace clic en un enlace en mi sitio que requiere autenticación, el navegador se redirige a la página de inicio de sesión. La página de inicio de sesión incluye un parámetro returnUrl querystring. El problema es que si el usuario se autentica usando OpenID, los proveedores redireccionan al usuario a la página de inicio de sesión y no incluye el parámetro returnUrl, que es bastante aburrido porque redirijo al usuario a la página de inicio en lugar de la página que se intentó .¿Cómo puedo cambiar ReturnUrl para OpenID?

Estoy usando DotNetOpenID, ¿hay alguna manera de arreglar esto?

Respuesta

11

Es realmente fácil, Bruno. Sólo tiene que llamar

IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]); 

que le dirá DotNetOpenId para preservar el argumento ReturnURL en la página de inicio de sesión y obtener el comportamiento que desea. Tengo que estar en desacuerdo con Franci sobre la separación de la URL que muestra la página de inicio de sesión desde la que procesa el resultado. Para los sitios ASP.NET MVC que pueden ser, pero para los formularios web ASP.NET eso no es realmente el camino a seguir, ya que además de mostrar cualquier error al usuario, sin duda también querrá mostrar el formulario de inicio de sesión. de nuevo. Además, en lo que respecta a la separación de la lógica, la biblioteca DotNetOpenId hace todo el trabajo pesado para usted, por lo que apenas hay lógica en su página de código subyacente de todos modos.

+1

Debería ser AddCallbackArgument ** s ** –

+0

Sí, gracias. He corregido mi respuesta. –

+0

No es tan simple: "Los argumentos de devolución de llamada solo se admiten cuando se proporciona IRelyingPartyAssociationStore a OpenIdRelyingParty". – Perry

3

Si desea que el proveedor de OpenID regrese a una url diferente, debe usar el método OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) al crear la solicitud de autenticación.

Sin embargo, generalmente no desea que el proveedor de OpenID redireccione a la url que inició la secuencia de inicio de sesión dentro de su aplicación. Desea volver al punto donde inició la autenticación de OpenID para procesar correctamente la respuesta. Ayuda a encapsular la capa OpenID del resto de la lógica en su aplicación.

He aquí un ejemplo:

En mi aplicación ASP.NET MVC, tengo un controlador User con Authenticate acción que maneja las solicitudes de inicio de sesión.

La acción Authenticate comprueba OpenIdRelyingParty.Response. Si es null, la acción llama al RedirectToProvider. El proveedor vuelve a la misma acción, donde verifico el Respons.Status. Si es AuthenticationStatus.Authenticated utilizo FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true) para volver a la página desde la que el usuario inició la sesión de seqeuencia.

Sin embargo, si el estado es AuthenticationStatus.Failed o 'AuthenticationStatus.Canceled', puedo ofrecer los pasos del usuario para resolver este problema. Puedo ofrecerles que corrijan su OpenID si están mal escritos o que inicien sesión con un nombre de usuario/contraseña en su lugar. (Admito OpenID y la autenticación de nombre de usuario/contraseña para las mismas identidades)

Mi casilla de acceso está en cada página. Si el proveedor de OpenID me redirigió a la página que inició la solicitud de inicio de sesión, es probable que la página no pueda procesar la falla correctamente.

+0

Lo hice similar al suyo, pero el problema es que cuando el proveedor redirige al usuario de regreso a mi acción de autenticación, el parámetro returnUrl se ha ido ... para que RedirectFromLoginPage no funcione ... – Bruno

+0

llame al método de autenticación con returnUrl en la consulta - http: // localhost/user/authenticate? returnurl =/somepage & uid = http: //myopenid.com/francip. cuando el proveedor de OpenID vuelve al método de autenticación, returnUrl debe estar en la consulta nuevamente. –