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?
Quise decir callback_uri en lugar de request_uri – Ameen