【问题标题】:How to secure WebAPI application / HTML+JS clients?如何保护 WebAPI 应用程序/HTML+JS 客户端?
【发布时间】:2013-04-12 19:47:15
【问题描述】:

过去一周我一直在研究 SO 和阅读有关身份验证的书籍,并开始为我的 WebAPI 推出基本身份验证,以便 HTML clients 可以让 users 登录/register/logout,但基本身份验证不利于注销,所以我回到第一方。

详情:

  1. 我不需要让用户使用其他服务登录。我不需要 facebook 或 google 登录。只是一个用户名/密码。

  2. 我需要用户能够从客户端应用程序(而不是浏览器)登录/注销/注册。

  3. 我不介意通过网络发送凭据,因为我将使用 SSL。

  4. 目前只有一个客户端,但会有其他客户端访问 API,所以我需要实现类似于 api 密钥的东西。也许这是一个单独的问题。

  5. 我有一个 RESTish WebAPI,它接受/返回 JSON 给其他域中的 html/js 客户端。

  6. 这是用于原型设计的,所以我不需要最好的解决方案,只需要对于预发布来说足够好并且实施时间短的东西。

我应该从哪里开始?你会怎么做,为什么?表单身份验证是一种选择吗?

【问题讨论】:

  • 你的攻击场景是什么?您只是保护您的服务器免受滥用客户端的侵害,还是需要保护用户的密码免受其机器上的恶意软件的侵害?注册时是否需要让非人类注册大量帐户变得昂贵?
  • 我没有想到攻击场景。只是客户。没有。
  • 很难回答“我如何{secure,harden} X?”这样的问题。不知道您保护 X 的目的是什么,这就是攻击场景所阐明的。

标签: .net asp.net-mvc security authentication asp.net-web-api


【解决方案1】:

在你的问题中

我不介意通过网络发送凭据,因为我将使用 SSL。

在你所说的答案的评论中

我只是不希望用户通过网络发送明文密码。

不确定您到底在寻找什么,但表单身份验证绝对是一种选择。您也可以使用基本身份验证,但它有您提到的一些缺点:没有注销等。您必须使用带有基本身份验证的 HTTPS。

如果浏览器弹出是主要问题,您可以通过在第一个请求中抢先发送凭据来解决这个问题。通常,第一个请求没有 Authorization 请求标头。服务以 401 响应并发回指示基本方案的 WWW-Authenticate 响应头。这是浏览器弹出对话框并询问用户ID和密码,将其打包在基本方案中并发送授权标头的时候。

【讨论】:

    【解决方案2】:

    首先,更重要的是; SSL、SSL SSL 这是一个非常简单的步骤,即使是主要网站都错过了,但它非常重要(即使 SSL 存在许多当前难以利用的缺陷)。

    您几乎可以通过 webapi 使用任何类型的身份验证;基本身份验证;证书;你可以看看使用 OAUTH 风格的身份验证(注意我说的是风格,因为规范的定义非常松散,它提供了几乎所有选项和多种实现方式)。

    首先,我将 WebApi 视为一种选择;你考虑过别的吗?例如http://www.servicestack.net/,其中包含一系列身份验证适配器https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization

    其次,了解您的身份验证内容及其身份验证内容(私人数据/上传/访问某些内容)会很有帮助;为了得到包含“足够安全”的答案。

    “可以”使用表单身份验证,并且假设您的客户端不是基于浏览器的,您可以通过服务返回登录名并使用您需要在一段时间内保存在某种上下文中的表单身份验证令牌进行响应来实现此目的使用;假设一旦软件完成使用 api 就设置了超时,用户下次必须再次登录才能重用它。


    就 web api / JS-Html 前端而言;引用我自己的话。

    作为一个 JS 应用程序,它可能值得快速浏览一下 owasp 与 JS 相关的前 10 名

    http://erlend.oftedal.no/blog/?blogid=125

    A1 - Injection
    A2 - Cross Site Scripting (XSS)
    A3 - Broken Authentication and Session Management
    A4 - Insecure Direct Object References
    A5 - Cross Site Request Forgery (CSRF)
    A6 - Security Misconfiguration
    A7 - Insecure Cryptographic Storage
    A8 - Failure to Restrict URL Access
    A9 - Insufficient Transport Layer Protection
    A10 - Unvalidated Redirects and Forwards
    

    这里有一篇关于为 WebApi 创建自定义授权过滤器的好帖子 http://www.west-wind.com/weblog/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter(操作方法/带有代码)

    【讨论】:

    • 感谢您的详细回复,克里斯。该应用程序已经使用 WebAPI 构建,因此没有其他选择。我有可以通过来自客户端应用程序的 JS 调用访问的方法,这些方法需要限制为登录用户。该应用程序只是一个抽认卡应用程序,没有什么疯狂的价值。我只是不希望用户通过网络发送明文密码。你说我可以使用基本身份验证 - 这是我现在拥有的,但我不喜欢浏览器窗口弹出,我不喜欢我不能让用户注销。
    • 您可以通过 js ala stackoverflow.com/questions/9692067/… 进行基本身份验证,这否定了浏览器窗口的使用;当然它是“在线”,但您在使用场景中受到限制,并且在使用 SSL 时采取了相对基本但重要的预防措施。
    • 这当然只是一条建议的路线(如答案所示)。表单身份验证是可能的,并且可以使用 Forms Authentication Ticket support.microsoft.com/kb/910443 通过 web-api 处理从那时起内置的 .net 内容与 MVC asp.net/web-api/overview/security/… 几乎相同
    • 基本上;如果您想要最简单、最快的方法,请使用框架为您提供的内容,并从 asp.net 网站安全部分的多个选项中进行选择 ala asp.net/web-api/overview/security/forms-authentication:D
    • 非常感谢克里斯。这很有帮助。我从 Basic 转到 Forms,我很喜欢 :)
    猜你喜欢
    • 2017-06-29
    • 2018-08-26
    • 2022-08-02
    • 2020-10-24
    • 2019-12-19
    • 1970-01-01
    • 2011-06-22
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多