2

我一直在研究这个问题,断断续续,几个星期,到目前为止还没有找到真正的、具体的解决方案——所以我想知道我是否可以激发一些关于其他人如何解决这个问题的想法,如果有的话。

设想

  • 网站通过 AJAX 调用 WCF 服务(通过充当代理的 WebAPI,或直接,相同的最终结果)。
  • 网站希望以 JSON 格式返回结果。
  • 网站和 WCF 服务可能不在同一个盒子上,所以是跨域的。我知道可以在这里使用 WebAPI 来解决这个问题,但是,这并不总是可能的。
  • WCF 服务只能从该单一网站(或具有身份验证详细信息的网站)调用,我不希望任何机器人向它发送垃圾邮件以获取数据。

很简单,对吧?错误的。

主要问题

  • 基本身份验证 - 解决所有问题,对吗?不,如果您要跨域,则必须使用 JSONP 来获取 JSON 结果,其中您无法修改请求标头,因此无法通过标头中的身份验证详细信息发送。使用 http://test:test@url.com在某些主流浏览器 (IE) 中不起作用,CORS 也不起作用。

OAuth,可能是一个解决方案吗?我遇到的问题是,如果用户没有登录网站,那么如何进行双向握手,任何其他网站都不能简单地获取在查询字符串中发送的 API 密钥到服务?而且,如果 API 密钥有密码,它仍然只是以明文形式发送吗?我是否误解了这个过程,它对我的​​场景是否可行?

我看到这个看起来很有希望:http: //www.codeproject.com/Tips/372422/Secure-WCF-RESTful-service-using-OAUTH

但是,它的最后部分显示该服务仍被称为服务器端,而不是通过 jQuery。

拜托,拜托,对于我和可能在同一条船上的成千上万的其他人,那里有解决方案吗?

更新

最后,我确实最终使用了:http: //www.codeproject.com/Tips/372422/Secure-WCF-RESTful-service-using-OAUTH并沿着 OAuth 路由在请求之间进行身份验证。代码隐藏工作只是将参数和签名值注入页面上的 JavaScript 变量,然后通过 AJAX 请求将这些发送到服务。现在效果很好!

4

1 回答 1

0

因此,您希望从站点 B 上的网站访问站点 A 上的服务?从 B 到 A 的请求需要经过身份验证?

然后,您可以在站点 B 上实现一个代理,该代理对站点 A 上的服务进行经过身份验证的调用。此身份验证可以采用任何形式,但基本身份验证 + HTTPS 是可行的。或查看客户端证书。你必须配置一次,它不应该改变。现在没有人可以访问站点 A 上的服务,除非他们拥有基本身份验证凭据或客户端证书(或您提供的其他凭据)。

然后从站点 B 上的网站向站点 B 上的代理发出请求,该代理使用(服务器端)配置的凭据将请求重定向到站点 A 上的服务。

If you want everyone to be able to call the proxy on site B from the website on site B, even when not logged in on the website, but from nowhere else, you could let the website create a token (serverside), which is registered with the proxy. Then if the website issues a request to the proxy, it sends its token. A token could be valid for a limited amount of time or requests (perhaps even one request).

于 2012-11-16T09:54:46.500 回答