2013-09-25 136 views
1

RESTful服务的新手,但在主题上阅读了很多。在VS2010中实现C#Restful登录 - 正确实施

类似(几乎相同)的问题已经在stackoverflow上被询问和回答,但老实说,我没有从响应中学到任何东西。

我想实现一个AuthenticatUser调用,其中发送用户名和密码并返回一个验证密钥。

鉴于这需要使用GET,POST,PUT或DELETE来完成,看起来GET最合适。

所以也许能使MYDOMAIN /为MyService /认证/ {名}/{}密码

,因为用户名和密码的URI传递我不喜欢这个,但据我所知它是不是一个好在GET中发送主体的想法。所以POST或者PUT可以工作,但是这似乎与RESTFul哲学不同。

问题1:可以在URL中发送密码等敏感数据吗?该网站将使用SSL。

问题2:在传递多个参数时,看起来URI概念会变得有点疯狂,复杂查询应该如何被RESTfully处理?

问题3:在RESTful API中,首选(正常,最常见)的身份验证方法是什么?

+0

我认为你需要阅读什么是“RESTful”,它会诚实地回答你的大部分问题。除此之外,URL在浏览器中是可读的,因此在URL中放置任何机密信息都是不明智的。 –

+1

通常,您的身份验证方案将涉及*创建会话对象(通常位于服务器上的数据库中),因此使用用户证书的PUT或POST完全适合。 – JDB

+0

有意思的是创建一个服务器端会话对象的POST,但它似乎以技术性击败了体系结构的精神。就阅读而言,我有 - 它仍然凝胶化,我甚至读过菲尔丁博士的论文。我使用了亚马逊的S3,我了解它是REST,但是在购买时我们会分配一个验证密钥,并且它用于请求服务。 – kpg

回答

1

在url中传递密码是不正确的。我对此做了一些研究。首先,如果可能的话,您应该使用SSL上的基本身份验证。在验证头中传递用户名和密码。现在就休息而言,该会话不在服务器中维护。所以你需要为每个呼叫传递用户ID和密码。将密码存储在本地存储中是有风险的。因此,使用POST呼叫进行首次认证并传递用户名和密码。然后,在成功认证返回时,服务器返回一个tokenkey和tokenvalue。 tokenkey和tokenvalue最初与Amazon私钥共享类似。从下一个请求开始,发送令牌密钥并使用令牌值签署您的数据。每次传递令牌密钥和签名。在服务器上,服务器验证签名,因为它有一个令牌值副本。如果可能的话,tokenkey和tokenvalue可以存储在本地。您不能永远使用tokenkey和tokenvalue。因此,在每个请求中,服务器发送一个随机数作为响应。该随机数存储在服务器端的数据库中,并针对每个请求进行更改。当您向服务器发送包含此随机数的请求时。随机数使用时间戳形成。如果在15分钟后发送请求,那么该随机数将被解密,并且发现时间戳超过15分钟,因此您将其重定向到登录页面。 Nonce的形成在http://www.ietf.org/rfc/rfc2617.txt中给出。一旦nonce被成功验证,这个nonce被丢弃,并且现在发送一个新的nonce(用最新的时间戳再次形成)。这也有助于防止重放攻击。