2010-04-05 110 views
0

我有一组半公共REST API的,我们正在建立一个简单的身份验证方案:WCF基于REST的服务的身份验证方案

    /-----------------------\ 
        | Client POST's ID/Pass | 
        | to an Auth Service | 
        \-----------------------/ 
    [Client] ------------POST----------------------> [Service/Authenticate] 
                  | 
              /-------------------------------\ 
              | Service checks credentials | 
    [Client] <---------Session Cookie------- | and generates a session token | 
     |          |   in a cookie.   | 
     |          \-------------------------------/ 
     | 
    [Client] -----------GET /w Cookie -------------> [Service/Something] 
           |           
       /----------------------------------\ 
       | Client must pass session cookie | 
       |  with each API request  | 
       |  or will get a 401.   | 
       \----------------------------------/ 

这工作很好,因为客户端永远不会需要做的只是得到了什么一cookie,然后传给它。对于浏览器应用程序,这是浏览器自动发生的,对于非浏览器应用程序,保存cookie并将其与每个请求一起发送非常简单。

但是,我还没有想出一个从浏览器应用程序进行初始握手的好方法。例如,如果这一切都是使用AJAX技术进行的,那么阻止用户访问ID/Pass客户端的用途是与服务握手?

这似乎是这是这种方法的唯一绊脚石,我很难过。

+0

你到底想要保护什么? 这听起来像“客户端”和“用户”是不同的演员,你试图掩盖“客户端”具有硬编码凭证这一事实吗? 如果“用户”和“客户端”对同一台计算机具有相同的访问权限,那么现在就可以通过默默无闻的方式实现安全性。其次,对于API,如果您要使用身份验证/授权方案,我强烈建议您考虑使用OAuth而不是自行创建。 – 2010-04-05 01:28:45

+0

正确的说,客户端是另一个想要使用我们内容的网站,他们可能希望通过REST/JSONP来完成这个客户端。我想我的主要希望是能够控制使用我们API的各种第三方。 – FlySwat 2010-04-05 01:33:44

回答

1

一种可能性是为每个服务器AJAX页面生成一次性填充,并将该填充附加到会话cookie。现在用户无法在没有一次性键盘的情况下启动会话。当然,他们可以请求一个新的页面来获得垫。

0

您无法获得此类服务。 This thread讨论了一些方法,但它们都不是一个好的解决方案。

如果要使用API​​控制第三方,强制他们使用服务器到服务器的连接。