2012-05-31 15 views
5

Attualmente sto tentando di utilizzare il flusso utente-agente OAuth 2.0 con un'applicazione C# clientide e sto incontrando una certa confusione relativa all'URI di reindirizzamento.OAuth Flusso utente-agente con l'app desktop C#

Poiché sto lavorando con un'applicazione client, non posso fornire un URL di reindirizzamento standard a un server web. Tuttavia, in base alle persone con cui sto provando ad autenticarsi (Salesforce, in questo caso), il flusso User-Agent è quello corretto da utilizzare per un'applicazione client.

La mia domanda è, cosa posso fare per catturare il token di accesso in questa situazione? Apparentemente posso creare una "risorsa locale accessibile al cliente", ma non conosco i meccanismi alla base di questo, e non riesco a trovare alcuna risorsa sull'argomento (in parte perché non so cosa cercare).

Qualsiasi suggerimento su dove dovrei iniziare a guardare sarebbe molto apprezzato.


Edit: Alcuni più di scavo ha rivelato la seguente questione StackOverflow:

How do I develop against OAuth locally?

sto facendo un po 'di indagare con quello che hanno suggerito, ma altri suggerimenti sarebbe grande pure.


Edit: Alcuni più alla ricerca ha rivelato questo articolo:

http://sarangasl.blogspot.com/2010/09/create-simple-web-service-in-visual.html

sente ancora come sto rovistando nel buio senza una comprensione del quadro più ampio, ma credo che ho bisogno di impostare un servizio Web locale utilizzando localhost e puntare il mio URI di reindirizzamento lì. Quindi utilizzerò il mio servizio Web per scartare la risposta dal server OAuth e far rispondere la mia domanda in modo appropriato. Altri aggiornamenti a venire.


Ooookay. Quindi, da quello che sono stato in grado di raccogliere, ho bisogno di creare un servizio web locale da fornire come callback per OAuth. Ho bisogno di ascoltare il servizio web e prendere il callback per passarlo alla mia app. Tuttavia, il servizio Web ASP.NET predefinito fornito da VS2010 non supporta i parametri URL, solo le chiamate API, pertanto, a quanto pare, è necessario utilizzare il kit di avviamento WCF Rest.

Sono completamente estraneo a tutto questo, quindi qualsiasi suggerimento sarebbe una manna dal cielo a questo punto. In generale, sto pensando di impostare un servizio di ripristino WCF locale, fornire l'URI locale a OAuth come callback e quindi catturare l'URL di callback utilizzando il servizio Rest. Quindi analizzo l'URL ed estrai il token di accesso. A questo punto, la mia app richiede il token di accesso o il mio servizio web "fornisce" il token alla mia app? I.e, dove dovrebbe essere il luogo di controllo?

risposta

4

Calcolato un modo intelligente per aggirare questo problema. Invece di impostare un servizio per ascoltare l'URL di reindirizzamento di OAuth, ho incorporato un controllo WebBrowser all'interno del mio modulo di Windows.

Ho indirizzato questo WebBrowser incorporato all'URL di autenticazione e ho permesso all'utente di accedere e autenticarsi con Salesforce e concedere le autorizzazioni alla mia app.Quindi, ho permesso a Salesforce di reindirizzare il mio browser incorporato a un URL di reindirizzamento fittizio che fornisco. Questo reindirizzamento non va mai in qualsiasi luogo, si presenta come un 404.

Tuttavia, monitorando WebBrowser.Url, posso raccogliere l'intero URL a cui è diretto il controllo del WebBrowser incorporato, incluso il token di accesso che viene aggiunto da Salesforce. Fondamentalmente, dopo che l'utente autentica e concede le autorizzazioni, il browser incorporato viene reindirizzato a "http://www.dummyurl.com". Salesforce aggiunge il token di accesso, in modo da WebBrowser.Url finisce per guardare qualcosa di simile:

http://www.dummyurl.com#access_token=ABCDEF&instance_url=ABCDEF

Da qui, posso solo analizzare l'URL e andare per la mia strada. Non sono richiesti server Web di terzi o servizi Web locali. :)

+2

Questa sarebbe un'opzione. Ma fai attenzione: l'utente può utilizzare alcuni trucchi sul tuo browser web come andare avanti e indietro nella cronologia del browser, l'aggiornamento della pagina, i timeout, l'interruzione della rete. Dovrai gestire tutti i codici di errore HTTP + tutti i trucchi del browser incorporato. Buona fortuna :) –

+0

Inoltre, considera l'interfaccia utente della tua app che, probabilmente, sarà diversa da quella proposta da Salesforce, e non puoi modificarne l'impostazione predefinita perché non hai il controllo su di essa. –

+0

Ugh, hai ragione. Dovrò dare un'occhiata alla sicurezza del browser embedded successiva. Per quanto riguarda l'interfaccia utente, la mia app è un processo in background che genera un popup su determinati eventi, quindi l'autenticazione è richiesta solo una volta per l'avvio dell'app (di solito una volta al giorno, al mattino). Grazie comunque per i suggerimenti, ho dimenticato le falle di sicurezza che potrebbero essere aperte con un'istanza IE incorporata. – sichinumi

1

Chiama il tipo di autorizzazione necessario Cliente autorizzato http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com#Obtaining_a_Token_in_an_Autonomous_Client_.28Username-Password_Flow.29. Leggi l'URL che devi inviare lì.

grant_type=password&client_id=<your_client_id>&client_secret=<your_client_secret>&username=<your_username>&password=<your_password> 
+0

non posso usare quel flusso, purtroppo. Se l'IP che tenta di autenticare non è nella whitelist, la password deve essere aggiunta al token di sicurezza dell'utente, che non è un'opzione per la mia applicazione. – sichinumi

+0

Mettilo però con il tuo proxy che verrà inserito nella whitelist. Inoltre il link è 'POST'ed - quindi i parametri di richiesta verranno crittografati da HTTPS. Hai qualche problema con questo approccio? –

+0

Hmm, non ho pensato di trasmetterlo. Tuttavia, sto sviluppando questa app per altri utenti in altri ambienti aziendali e il routing di tutto il traffico tramite un proxy di terze parti non è un'opzione. Inoltre, non ho il controllo sulle whitelist per le diverse organizzazioni dei miei utenti. Infine, mi è stato detto esplicitamente dagli sviluppatori API di evitare il flusso OAuth della password utente. Tuttavia, non ho alcun problema personale, ma dai un'occhiata alla mia altra risposta e fammi sapere cosa ne pensi. :) – sichinumi

0

È possibile utilizzare la libreria DotNetOpenAuth. C'è un esempio che usa WPF, dove usa un controllo winform chiamato ClientAuthorizationView fornito dalla libreria DotNetOpenAuth.

È un controllo che ospita un browser che consente all'utente di autorizzare il client senza uscire dall'applicazione.

Spero che questo aiuto.

saluti