3

我正在使用直接 html 5 和 web api restful 服务构建一个新的 asp.net web api 应用程序。我已经在使用表单身份验证和 [Authorize] 属性来保护我的 Web api 调用。我试图尽可能地忠于宁静的原则。

我正在模仿现有应用程序的功能,该应用程序使用两因素身份验证并使用 asp.net Web 表单。双重身份验证不用于登录,而是用于通过站点和插件远程访问另一台计算机的附加任务。

现有的 Web 应用程序使用会话状态来存储生成并通过电子邮件发送给用户的 pin。然后,当用户输入 pin 时,会根据会话状态中的 pin 进行检查。

所以看起来我的选择是......

  1. 加密在服务器上生成的 pin 并在 javascript 中将其发送回客户端。此选项似乎存在安全风险。这将是一个更宁静的选择。
  2. 一位同事建议使用类似于 Amazon S3 使用公钥/私钥对的方法。
  3. 尽管使用了 web api,但仍使用会话状态。

那么在这些选项中,最好的选择是什么?还有其他可能性吗?

4

2 回答 2

1

我不是 100% 确定我了解您的架构,但您的安全性在任何时候都不应依赖于客户端,这似乎非常相关。

假设用户在他们的浏览器中有一个 javascript 调试器(大多数人实际上没有意识到),以及一个自定义构建的插件。

因此,二级 PIN 挑战应该嵌入到服务器端的“远程处理”协议中。如果它是基于 RDP 或 VNC 的东西,应该可以将给定用户的连接密码即时更改为一次性生成的 PIN。

于 2013-01-08T11:46:35.463 回答
0

我相信,你不应该过多关注 RESTful 原则(等等,我说过了吗?:))... 你看,一方面是理论,另一方面是实践。在实践中,您经常需要为了安全而打破 RESTful 原则!让我们来看看nonce- 它是为每个请求生成的一个很大的随机数,如果nonce之前没有发送过相同的请求,那么它会在服务器上进行检查。这涉及存储状态(随机数) - 即,它不是无状态的,但它有时对安全性至关重要。另外,顺便说一下,经常使用的 OAuth 不是 RESTful。

为了加密 PIN,您不应该使用 JavaScript 客户端!但是,您可以在使用的域 JavaScript 客户端上实现某种加密端点:

  1. 使用XMLHTTPRequest生成对端点 URL 的请求(例如,/api/encrypt)。
  2. 服务器收到这个请求并在服务器上加密PIN,即PIN在清除状态下不会进入浏览器。
  3. 服务器将加密的 PIN 返回给 JavaScript 客户端。
  4. 客户端将加密的 PIN 发送给客户。

你的同事给了一个很好的建议!Amazon 是最好的 REST API 实现之一。

还要检查我的想法: https ://stackoverflow.com/questions/15418764/looking-for-feedback-on-my-rest-style-api-authentication-design-and-two-factor-a 。

于 2013-03-15T12:57:59.753 回答