我目前正在研究.net的REST库,我想听听有关我拥有的一个开放点的一些意见:REST和身份验证。
这是与库一起使用的RESTful接口的示例:
[RestRoot("/user")]
public interface IUserInterface
{
[RestPut("/")]
void Add(User user);
[RestGet("/")]
int[] List();
[RestGet("/get/{id}")]
User Get(int id);
[RestDelete("/delete/{id}")]
void Delete(int id);
}
然后,服务器代码仅实现该接口,客户端可以通过工厂获得相同的接口。或者,如果客户端未使用库,则标准HTTP请求也可以使用。
我知道,有使用HTTP基本身份验证或将令牌发送到需要经过身份验证的用户的请求的主要方法。
第一种方法(HTTP基本身份验证)具有以下问题(部分特定于Web浏览器):
- 密码随每个请求一起发送-即使使用SSL,也会有某种“不好的感觉”。
- 由于密码是与请求标头一起发送的,因此本地攻击者很容易查看发送的标头以获取密码。
- 密码在浏览器的内存中可用。
- 没有使用户“会话”过期的标准方法。
- 使用浏览器登录会中断页面的外观。
第二种方法的问题更多地集中在实现和库使用上:
- 每个需要认证的请求URI必须具有用于令牌的参数,该参数非常重复。
- 如果每个方法实现都需要检查令牌是否有效,则还有很多代码要编写。
- 该界面将变得不那么具体如
[RestGet("/get/{id}")]
对[RestGet("/get/{id}/{token}")]
。 - 将令牌放在何处:URI的末尾?后根?别的地方?
我的想法是将令牌作为参数传递给URL,例如http:/server/user/get/1234?token=token_id
。
另一种可能性是将参数作为HTTP标头发送,但是我猜这会使普通HTTP客户端的使用变得复杂。
令牌将作为每个请求的自定义HTTP标头(“ X-Session-Id”)传递回客户端。
然后可以从接口中完全提取该令牌,并且任何需要身份验证的实现都可以询问令牌(如果给定)属于哪个用户。
您是否认为这会严重违反REST或您有更好的主意?