在restful web api中进行双因素身份验证

时间:2012-12-14 04:59:26

标签: rest asp.net-web-api two-factor-authentication

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

我正在模仿使用双因素身份验证并使用asp.net网络表单的现有应用程序。双因素身份验证不用于登录,而是用于通过站点和插件远程连接到另一台计算机的其他任务。

现有Web应用程序使用会话状态来存储生成并通过电子邮件发送给用户的PIN。然后,当用户输入引脚时,将检查处于会话状态的引脚。

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

  1. 加密服务器上生成的引脚并将其发送回 客户端在JavaScript中。此选项似乎存在安全风险。这将是一个宁静的选择。
  2. 一位同事建议使用类似Amazon S3使用公钥/私钥对的东西。
  3. 尽管使用了web api,但仍使用会话状态。
  4. 那么这些选项中最好的选择是什么?还有其他可能性吗?

2 个答案:

答案 0 :(得分:1)

我不是100%确定我理解您的架构,但似乎非常相关,您的安全性绝不应该依赖于客户端。

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

因此,辅助PIN质询应该在服务器端嵌入到“远程处理”协议中。 如果它是基于RDP或VNC的东西,应该可以动态地将给定用户的连接密码更改为一次性生成的PIN。

答案 1 :(得分:0)

我胆怯,你不应该过分关注RESTful原则(等等,我说的是什么?:))...你看,一方是理论而另一方是实践。在实践中,您经常需要打破RESTful原则以确保安全!让我们取nonce - 它是为每个请求生成的一个大随机数,然后在服务器上检查,如果以前没有发送过相同的nonce。这涉及存储状态(nonce) - 即,它不是无状态的,但它有时对安全性至关重要。此外,顺便说一句,经常使用的OAuth不是RESTful。

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

  1. 使用XMLHTTPRequest生成对端点网址的请求(例如/api/encrypt)。
  2. 服务器获取此请求并加密服务器上的PIN,即PIN不会以明文状态进入浏览器。
  3. 服务器将加密的PIN返回给JavaScript客户端。
  4. 客户端将加密的PIN发送给客户。
  5. 你的同事提出了一个很好的建议! Amazon是最好的REST API实现之一。

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