C# Restful登录-正确的实现

C# Restful登录-正确的实现,c#,visual-studio-2010,rest,C#,Visual Studio 2010,Rest,不熟悉RESTful服务,但阅读了很多相关内容。在VS2010中实现# 在stackoverflow上也有类似(几乎相同)的问题被问到和回答,但老实说,我从回答中什么也没学到 我想实现一个AuthenticatUser调用,其中发送用户名和密码并返回身份验证密钥 考虑到这需要通过GET、POST、PUT或DELETE来完成,因此GET似乎是最合适的 因此,也许可以获取mydomain/myservice/authenticate/{username}/{password} 我不喜欢这样,因为用户

不熟悉RESTful服务,但阅读了很多相关内容。在VS2010中实现#

在stackoverflow上也有类似(几乎相同)的问题被问到和回答,但老实说,我从回答中什么也没学到

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

考虑到这需要通过GET、POST、PUT或DELETE来完成,因此GET似乎是最合适的

因此,也许可以获取mydomain/myservice/authenticate/{username}/{password}

我不喜欢这样,因为用户名和密码是在URI中传递的,但据我所知,在GET中发送正文不是一个好主意。所以一个POST或PUT会起作用,但这似乎与RESTFul哲学有所不同

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

问题2:在GETs中,当传递多个参数时,URI的概念似乎有点疯狂,复杂的查询应该如何以REST方式处理


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

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

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

我认为您需要仔细阅读什么是“RESTful”,它将诚实地回答您的大多数问题。除此之外,URL在浏览器中是可读的,因此在URL中正确放置任何机密信息是不明智的。通常,您的身份验证方案将涉及创建会话对象(通常在服务器上的数据库中),因此,使用用户凭据的PUT或POST是完全合适的。创建服务器端会话对象的POST很有趣,但这似乎在技术上违背了体系结构的精神。就阅读而言,我已经——它仍然是胶状的,我甚至读过菲尔丁博士的论文。我曾经使用过亚马逊的S3,我知道它是REST,但在购买时我们会被分配一个身份验证密钥,用于请求服务。用户正在将其登录信息发布到服务器,以验证它是否没有返回。如果您忘记了密码,您将获得信息。如果您在Get请求中发送了一些唯一标识符,我认为您需要仔细阅读什么是“RESTful”,它将诚实地回答您的大多数问题。除此之外,URL在浏览器中是可读的,因此在URL中正确放置任何机密信息是不明智的。通常,您的身份验证方案将涉及创建会话对象(通常在服务器上的数据库中),因此,使用用户凭据的PUT或POST是完全合适的。创建服务器端会话对象的POST很有趣,但这似乎在技术上违背了体系结构的精神。远至r