2012-05-31 15 views
5

Actualmente estoy tratando de utilizar el User-Agent flujo de OAuth 2.0 con una aplicación del lado del cliente C#, y estoy corriendo en una cierta confusión con respecto a la URI de redireccionamiento.OAuth User-Agent de flujo con C# aplicación de escritorio

porque estoy trabajando con una aplicación del lado del cliente, no puede suministrar una URL de redireccionamiento estándar a un servidor web. Sin embargo, de acuerdo con las personas con las que intento autenticar (Salesforce, en este caso), User-Agent Flow es el correcto para usar en una aplicación cliente.

Mi pregunta es, ¿qué puedo hacer para capturar el token de acceso en esta situación? Aparentemente puedo crear un "recurso local accesible para el cliente", pero no estoy familiarizado con la mecánica detrás de esto, y no puedo encontrar ningún recurso sobre el tema (en parte porque no sé qué buscar).

Cualquier puntero sobre dónde debería empezar a mirar sería muy apreciado.


Editar: Un poco más de excavación ha revelado la siguiente pregunta StackOverflow:

How do I develop against OAuth locally?

que estoy haciendo un poco más de investigación con lo que sugirieron, pero cualquier otra sugerencia sería muy bueno también.


Editar: Un poco más búsqueda reveló este artículo:

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

todavía se siente como si estuviera hurgando en la oscuridad sin una comprensión de la imagen más grande, pero creo que necesito configurar un servicio web local utilizando localhost y señalar mi URI de redirección allí. Luego usaré mi servicio web para desenvolver la respuesta del servidor de OAuth y hacer que mi aplicación responda de manera adecuada. Más actualizaciones por venir.


Ooookay. Por lo que he podido reunir, necesito configurar un servicio web local para que lo proporcione como devolución de llamada para OAuth. Necesito escuchar en dicho servicio web y tomar la devolución de llamada para pasarla a mi aplicación. Sin embargo, el servicio web predeterminado de ASP.NET proporcionado por VS2010 no admite parámetros de URL, solo llamadas de API, por lo que aparentemente necesito usar el kit de inicio WCF Rest.

Soy completamente ajeno a todo esto, por lo que cualquier consejo sería un regalo del cielo en este momento. En general, estoy pensando en configurar un servicio WCF Rest local, suministrar ese URI local a OAuth como devolución de llamada, y luego capturar la URL de devolución de llamada utilizando el servicio Rest. Luego analizo la URL y extraigo el token de acceso. En este punto, ¿mi aplicación solicita el token de acceso o mi servicio web puede "dar" el token a mi aplicación? Es decir, ¿dónde debería estar el lugar de control?

Respuesta

4

Encontré una manera inteligente de evitar esto. En lugar de configurar un servicio para escuchar la URL de redireccionamiento de OAuth, incrustó un control WebBrowser dentro de mi formulario de Windows.

me señalamos WebBrowser incorporado a la URL de autenticación y dejar que el usuario inicie sesión en y autenticar con Salesforce y conceder permisos a mi aplicación.Luego, dejo que Salesforce redirija mi navegador incrustado a una URL de redireccionamiento ficticia que yo proporciono. Esta redirección nunca llega a ninguna parte, simplemente aparece como 404.

Sin embargo, al monitorear WebBrowser.Url, puedo recoger toda la URL a la que se dirige mi control WebBrowser incrustado, incluido el token de acceso adjunto por Salesforce. Básicamente, una vez que el usuario autentica y otorga los permisos, el navegador integrado se redirige a "http://www.dummyurl.com". Salesforce añade el token de acceso, por lo WebBrowser.Url termina buscando algo como esto:

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

A partir de aquí, sólo puede analizar la URL e ir en mi camino. No se requiere un servidor web de terceros o un servicio web local. :)

+2

Esta sería una opción. Pero tenga cuidado: el usuario puede usar algunos trucos en su WebBrowser, como avanzar y retroceder dentro del historial del navegador, la actualización de la página, los tiempos de espera y la interrupción de la red. USTED tendrá que manejar todos los códigos de error HTTP + todos los trucos desagradables del navegador incorporado. Buena suerte :) –

+0

Además, considere la interfaz de usuario de su aplicación que, probablemente, será diferente de la propuesta por Salesforce, y no puede cambiar su valor predeterminado porque no tiene control sobre ella. –

+0

Ugh, tienes razón. Tendré que echar un vistazo a la seguridad del navegador incorporado a continuación. En cuanto a la interfaz de usuario, sin embargo, mi aplicación es un proceso en segundo plano que genera una ventana emergente en ciertos eventos, por lo que la autenticación solo se requiere una vez por lanzamiento de la aplicación (por lo general una vez al día, por la mañana). Sin embargo, gracias por los consejos, me olvidé de los agujeros de seguridad que potencialmente se abrirían con una instancia de IE incorporada. – sichinumi

1

La llamada del tipo de autorización que necesita Authonomous cliente 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. Lea sobre la URL que debe enviar allí.

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

No puedo usar ese flujo, desafortunadamente. Si el IP que intenta autenticarse no está incluido en la lista blanca, la contraseña debe adjuntarse con el token de seguridad del usuario, que no es una opción para mi aplicación. – sichinumi

+0

Ponlo a través de tu proxy que se incluirá en la lista blanca. Además, el enlace es 'POST'ed, por lo que los parámetros de la solicitud serán encriptados por HTTPS. ¿Tienes algún problema con este enfoque? –

+0

Hmm, no pensé en proxying. Sin embargo, estoy desarrollando esta aplicación para otros usuarios en otros entornos empresariales, y enrutar todo el tráfico a través de un proxy de terceros no es una opción. Tampoco tengo control sobre las listas blancas para las diferentes organizaciones de mis usuarios. Por último, los desarrolladores de API me dijeron explícitamente que evitaran el flujo de OAuth de contraseña de usuario. Sin embargo, no tengo problemas personales, pero eche un vistazo a mi otra respuesta y dígame qué piensa al respecto. :) – sichinumi

0

Puede usar la biblioteca DotNetOpenAuth. Hay un ejemplo que usa WPF, donde usa un control de formas de inversión llamado ClientAuthorizationView proporcionado por la biblioteca DotNetOpenAuth.

Es un control que aloja un navegador que permite al usuario autorizar al cliente sin salir de la aplicación.

Espero que esta ayuda.

Saludos

Cuestiones relacionadas