2012-05-31 85 views
5

我目前正在尝试与客户端C#应用程序一起使用OAuth 2.0用户代理流程,我遇到了一些与重定向URI有关的混淆。OAuth用户代理流程与C#桌面应用程序

因为我正在使用客户端应用程序,所以我无法向Web服务器提供标准重定向URL。但是,根据我试图认证的人员(Salesforce,在这种情况下),User-Agent Flow是用于客户端应用程序的正确方法。

我的问题是,在这种情况下我能做些什么来获取访问令牌?显然,我可以创建一个“本地资源可以访问客户端”,但我不熟悉这个背后的机制,并且我无法找到关于该主题的任何资源(部分原因是我不知道要寻找什么)。

任何指针,我应该从哪里开始寻找将不胜感激。


编辑:一些更多的挖掘已经显露出以下计算器问题:

How do I develop against OAuth locally?

我做的多一些与他们建议什么调查,但任何其他建议将是巨大的,以及。


编辑:一些更多的搜索发现这篇文章:

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

仍然感觉就像我在黑暗中闲逛,而不大局的理解,但我相信我需要使用localhost设置本地Web服务,并在那里指向我的重定向URI。然后,我将使用我的Web服务来解开OAuth服务器的响应,并让我的应用程序作出适当的响应。更多更新来。


Ooookay。因此,从我能够收集的信息中,我需要设置一个本地Web服务来提供OAuth回调。我需要自己聆听上述Web服务,并将回调传递给我的应用程序。但是,VS2010提供的默认ASP.NET Web服务不支持URL参数,只是API调用,所以我显然需要使用WCF Rest入门套件。

我对这一切都是完全陌生的,所以任何提示在这一点上都是天赐之物。一般来说,我在考虑设置本地WCF Rest服务,将该本地URI作为回调提供给OAuth,然后使用Rest服务捕获回调URL。然后我解析URL并提取访问令牌。此时,我的应用程序是否请求访问令牌,或者我的Web服务是否可以将令牌“授予”我的应用程序?也就是说,控制的位置应该在哪里?

回答

4

想出了一个巧妙的方法来解决这个问题。我没有设置服务来侦听OAuth的重定向URL,而是在Windows窗体中嵌入了WebBrowser控件。

我将此嵌入式WebBrowser指向认证URL,并让用户登录并使用Salesforce进行身份验证,并将权限授予我的应用。然后,我让Salesforce将我的嵌入式浏览器重定向到我提供的虚拟重定向URL。但是,通过监控WebBrowser.Url,我可以获取嵌入式WebBrowser控件所指向的整个URL,包括附加的访问令牌由Salesforce。基本上,在用户验证并授予权限后,嵌入式浏览器会重定向到“http://www.dummyurl.com”。 Salesforce的追加访问令牌,所以WebBrowser.Url最终看起来是这样的:

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

从这里,我可以解析URL,并继续我的路。不需要第三方网络服务器或本地网络服务。 :)

+2

这将是一个选项。但要小心:用户可以在Web浏览器中使用一些技巧,例如在浏览器历史记录,页面刷新,超时,网络中断等方面前进和后退。你将不得不处理所有的HTTP错误代码+所有嵌入式浏览器令人讨厌的技巧。祝你好运:) –

+0

另外考虑你的应用程序的用户界面,这可能与Salesforce提出的用户界面不同 - 并且你无法更改默认值,因为你无法控制它。 –

+0

呃,你说得对。接下来我将不得不看看嵌入式浏览器安全。就用户界面而言,我的应用程序是一个后台进程,可以在某些事件上生成一个弹出窗口,因此每次启动应用程序时都只需要一次验证(通常每天一次,早上)。感谢您的提示,但我忘记了可能会被嵌入式IE实例打开的安全漏洞。 – sichinumi

1

您需要授权类型的调用Authonomous Client 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。阅读您必须在那里发送的URL。

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

不幸的是,我无法使用该流程。如果尝试进行身份验证的IP未列入白名单,则密码必须附加用户的安全令牌,这对我的应用程序来说不是一种选择。 – sichinumi

+0

通过您的代理将其列入白名单。加上链接是'POST'ed - 所以请求参数将被HTTPS加密。你对这种方法有任何问题吗? –

+0

嗯,我没有想到代理它。但是,我正在为其他商业环境中的其他用户开发此应用程序,并且通过第三方代理路由所有流量不是一种选择。我也无法控制用户不同组织的白名单。最后,API开发人员明确告知我要避免使用用户密码OAuth流程。不过,我个人没有任何问题,但请看看我的其他答案,并让我知道您对此有何看法。 :) – sichinumi

0

您可以使用DotNetOpenAuth库。有一个使用WPF的例子,它使用由DotNetOpenAuth库提供的名为ClientAuthorizationView的Winforms控件。

它是一个托管浏览器的控件,允许用户在不离开应用程序的情况下授权客户端。

希望得到这个帮助。

Regards