2012-07-20 25 views
5

Estoy intentando crear un inicio de sesión de usuario para Facebook y Windows Live ID utilizando DotNetOpenAuth 4.1.0.12182Facebook con DotNetOpenAuth 4.1.0.12182

Sin embargo, los ejemplos en la descarga hacen uso de DotNetOpenAuth.ApplicationBlock y cuáles no DotNetOpenAuth.ApplicationBlock.Facebook existir en la construcción actual.

En su lugar está el espacio de nombres DotNetOpenAuth.AspNet.Clients que incluye FacebookClient y WindowsLiveClient - sin embargo, no encuentro ningún ejemplo de cómo usarlos.

¿Existen ejemplos o documentación?

Respuesta

15

he podido obtener la versión 4.1.0.12182 DNOA, .Net 3.5 y Facebook para trabajar unos con otros mediante la creación de un FacebookAuthClient que se deriva fuera de el DotNetOpenAuth.OAuth2.WebServerClient. Una pequeña sorpresa que encontré es que si estás usando sesiones basadas en cookies, entonces tienes que acceder a la sesión antes de usar la funcionalidad OAuth. Por lo que puedo decir, esto se debe a que DNOA usa la ID de sesión como parámetro de estado y, si nunca se ha accedido a la sesión, puede cambiar entre las solicitudes. Esto causará un error de desajuste de los parámetros de estado cuando la respuesta regrese de Facebook.

FacebookAuthClient:

public class FacebookAuthClient : DotNetOpenAuth.OAuth2.WebServerClient 
{ 
    private static readonly DotNetOpenAuth.OAuth2.AuthorizationServerDescription Description = new DotNetOpenAuth.OAuth2.AuthorizationServerDescription 
    { 
     TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"), 
     AuthorzationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize")  
    }; 

    public static readonly string [] ScopeNeeded = { "publish_stream" }; 

    public FacebookAuthClient() 
     : base(Description) 

    { 
    } 
} 

Facebook.aspx.cs:

public partial class FacebookPage : System.Web.UI.Page 
{ 
    private FacebookAuthClient _client = new FacebookAuthClient 
    { 
     ClientIdentifier = ConfigurationManager.AppSettings["FBClientId"], //The FB app's Id 
     ClientCredentialApplicator = DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter(ConfigurationManager.AppSettings["FBClientSecret"]) // The FB app's secret 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     DotNetOpenAuth.OAuth2.IAuthorizationState auth = _client.ProcessUserAuthorization(); 
     if (_auth == null) 
     { 
      // Kick off authorization request with the required scope info 
      client.RequestUserAuthorization(FacebookAuthClient.ScopeNeeded); 
     } 
    } 
} 

Esto es sólo una aplicación de prueba lo que no hay control de errores, pero parece que funciona.

Editar Utilicé el paquete DotNetOpenAuth (unificado) NuGet para todo esto.

Editar Se ha añadido la llamada perdida .PostParameter a la creación del ClientCredentialApplicator.

+0

Gracias por compartir a Josh. ¡Solo desearía que no se tratara de una recompensa TAN para sacar esto a la luz! (No dirigido a usted ni a nadie) –

+0

'DotNetOpenAuth.OAuth2.ClientCredentialApplicator' dice que es un tipo, pero puedo usar' .NetworkCredential' de él. Pero luego recibo el error 400 de solicitud incorrecta. – BrunoLM

+0

BrunoLM - Gracias por señalar que he actualizado el código con DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter. Observe la parte PostParameter que faltaba –

1

Deberá usar ctp versión 3.5 de DNOA. La versión 4+ se ha creado para funcionar con un borrador posterior de OAuth 2 y Facebook lo usa.

Se puede encontrar en los propietarios de GitHub: https://github.com/AArnott/dotnetopenid

+1

Si este es el caso, entonces ¿por qué existe la clase 'FacebookClient' en la biblioteca? –

+0

Tuve una discusión bastante larga sobre esto con el creador de DNOA, señaló que se debe al hecho de que probablemente estará trabajando más adelante cuando Facebook decida subir al último borrador. Hasta entonces no hay otra solución, excepto manejar las solicitudes usted mismo. –

+3

Sería muy útil si hubiera preguntas frecuentes importantes sobre DNOA sobre este (otro) problema. DNOA hace un largo camino para simplificar el uso de OpenID/OAuth, pero problemas como este introducen preguntas nuevas. –

Cuestiones relacionadas