2012-07-20 8 views
5

Sto tentando di creare un account di accesso utente per Facebook e Windows Live ID utilizzando DotNetOpenAuth 4.1.0.12182Facebook con DotNetOpenAuth 4.1.0.12182

Tuttavia gli esempi nel download fanno uso di DotNetOpenAuth.ApplicationBlock e DotNetOpenAuth.ApplicationBlock.Facebook che non lo fanno esiste nella build attuale.

Invece c'è lo spazio dei nomi DotNetOpenAuth.AspNet.Clients che include FacebookClient e WindowsLiveClient - tuttavia non riesco a trovare alcun esempio su come utilizzarli.

Esistono esempi o documenti?

risposta

15

sono stato in grado di ottenere la versione DNOA 4.1.0.12182, Net 3.5 e Facebook per lavorare con l'altro creando un FacebookAuthClient che deriva al largo di il DotNetOpenAuth.OAuth2.WebServerClient. Una piccola cosa che ho trovato è che se si utilizzano sessioni basate su cookie, è necessario accedere alla sessione prima di utilizzare la funzionalità OAuth. Da quello che posso dire questo è perché DNOA utilizza l'ID sessione come parametro di stato e se la sessione non è mai stata aperta può cambiare tra le richieste. Ciò causerà un errore di mancata corrispondenza dei parametri di stato quando la risposta ritorna da 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); 
     } 
    } 
} 

Questa è solo un'applicazione di test quindi non c'è la gestione degli errori, ma sembra funzionare.

Edit ho usato la (unificato) Pacchetto DotNetOpenAuth NuGet per tutto questo.

Modifica Aggiunto mancante .PostParameter chiamare per la creazione del ClientCredentialApplicator.

+0

Grazie per aver condiviso Josh - Spero solo che non abbia coinvolto una generosità SO per portare questo alla luce! (Non rivolto a te oa nessuno) –

+0

'DotNetOpenAuth.OAuth2.ClientCredentialApplicator' dice che è un tipo, ma posso usare' .NetworkCredential' da esso. Ma poi ottengo la richiesta errata di errore 400. – BrunoLM

+0

BrunoLM - Grazie per aver segnalato che ho aggiornato il codice con DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter. Nota la parte PostParameter che mancava –

1

Avrete bisogno di usare ctp versione 3.5 di DNOA. La versione 4+ è stata creata per funzionare con una bozza successiva di OAuth 2, quindi Facebook utilizza.

Lo si può trovare sui proprietari GitHub: https://github.com/AArnott/dotnetopenid

+1

Se questo è il caso, allora perché la classe 'FacebookClient' esiste nella libreria? –

+0

Ho avuto una discussione piuttosto lunga su questo con il creatore di DNOA, ha sottolineato che è dovuto al fatto che probabilmente funzionerà più tardi quando Facebook deciderà fino alla più recente bozza. Fino ad allora non c'è altra soluzione, tranne gestire le richieste da soli. –

+3

Sarebbe molto utile se ci fossero delle domande frequenti su DNOA su questo (altri) problemi. DNOA è molto utile per semplificare l'uso di OpenID/OAuth - ma problemi come questo introducono nuove domande –