2012-07-17 30 views
6

Estoy usando DotNetOpenAuth para conectarme a Facebook y Google a través de OAuth2. Las especificaciones de OAuth piden que no se proporcionen parámetros adicionales en el request_uri y Google en realidad lo impone forzándolo a especificar una devolución de llamada exacta cuando usted define su Google App con ellos.DotNetOpenAuth OAuth2.0 parámetro de estado

Lo que quiero lograr es poder devolver al usuario a una URL específica después de que se hayan autenticado con Facebook o Google. El flujo es el siguiente, el usuario hace clic en un enlace protegido, se reenvía a mi página de inicio de sesión con un parámetro returnUrl y luego inicio el proceso de autorización en función del servidor de autorizaciones OAuth2 que elija.

Dado que request_uri no puede tener ningún parámetro (aunque Facebook le permite salirse con la suya), no puedo enviar el parámetro returnUrl al servidor de autorizaciones y recuperarlo de modo que cuando el usuario vuelva a utilizarlo mi sitio, los reenvío a la página protegida a la que intentaban acceder. Lo mejor que puedo hacer es reenviarlos a la página de inicio o a la página de bienvenida de un miembro.

La manera de solucionar esto es usar el parámetro "estado" que el servidor de autorización enviará de vuelta a request_uri, pero no puedo encontrar una manera de especificar esto con DotNetOpenAuth.

De forma predeterminada, parece que el código usa el ID de sesión como el parámetro de estado para verificar la solicitud que vuelve del servidor de autorización. Especificar un IClientAuthorizationTracker en la clase WebServerClient me permite conectar mi lógica cuando la respuesta vuelve del servidor de autorizaciones, pero no se llama cuando se prepara la solicitud de autorización, por lo que no puedo conectar mi estado adicional.

Este es el código de PrepareRequestUserAuthorization de WebServerClient.cs:

  // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but 
     // verifiable for the same user/session. 
     // If the host is implementing the authorization tracker though, they're handling this protection themselves. 
     if (this.AuthorizationTracker == null) { 
      var context = this.Channel.GetHttpContext(); 
      if (context.Session != null) { 
       request.ClientState = context.Session.SessionID; 
      } else { 
       Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks."); 
      } 
     } 

No existe un bloque más aquí que es lo que habría esperado a ser capaz de jugar a lo largo y enchufe en mis propios datos.

¿Algún consejo sobre lo que me estoy perdiendo?

+0

Quise decir callback_uri en lugar de request_uri – Ameen

Respuesta

0

El parámetro de estado está necesariamente preocupado con la mitigación de ataques XSRF. Como ya tiene una sesión de usuario, ¿puede simplemente almacenar el returnUrl en el diccionario de sesión?

Como alternativa, puede file an issue con DotNetOpenAuth pidiendo que se le permita agrupar sus propios datos en el parámetro de estado (junto con el propio código de mitigación XSRF de DNOA).

+1

perdón por desenterrar este hilo antiguo pero necesitamos la capacidad de establecer el valor de estado para seguir el viaje OAuth2. En WebServerClient.cs, si AuthorizationTracker NO es nulo, el token xsrf no se agrega, pero no hay ningún "else" que permita establecerlo en el valor de AuthorizationTracker clientState o de lo contrario permitir que un valor proporcionado por el usuario en lugar del token xsrf . Eso suena como un descuido a menos que sea una decisión de diseño deliberada sobre la que pueda elaborar. – Lukos

+0

En mi caso, no puedo diferenciar al usuario en base a diferentes URL, necesito hacer un seguimiento del tipo de suscripción que están realizando para que lleguen a una página de destino diferente después de que OAuth2 haya finalizado. Creo que el estado es la única forma de lograr esto sin modificar el viaje de registro para dividirlo más adelante (lo que me gustaría evitar). – Lukos

Cuestiones relacionadas