【问题标题】:How should I secure my SPA and Web.API?我应该如何保护我的 SPA 和 Web.API?
【发布时间】:2013-04-29 16:53:02
【问题描述】:

我必须实现一个网站(MVC4/单页应用程序 + 淘汰赛 + Web.API),我已经阅读了大量文章和论坛,但我仍然无法弄清楚安全/身份验证和保护登录页面和 Web.API 的方法。

该网站将完全在 SSL 下运行。用户第一次登录后,他/她将收到一封电子邮件,其中包含确认注册过程的链接。密码和“salt”值将加密存储在数据库中,不可能将密码解密回来。该 API 将仅用于此应用程序。

我有一些问题需要回答,然后才能继续深入:

  1. 就安全性而言,哪种方法最适合我的应用程序:Basic/SimpleMembership?还有其他可能吗?
  2. 对象 Principal/IPrincipal 是否仅用于基本身份验证?
  3. 据我所知,如果我使用 SimpleMembership,因为使用了 cookie,这不是打破 RESTful 范式吗?那么如果我构建一个 REST Web.API,我不应该避免使用 SimpleMembership 吗?
  4. 我正在使用令牌检查 ThinkTecture.IdentityModel。这是一种身份验证类型,例如 Basic、Forms 或 Auth,还是可以添加到其他身份验证类型中?

谢谢。

【问题讨论】:

    标签: asp.net-mvc security asp.net-web-api single-page-application thinktecture-ident-model


    【解决方案1】:

    这个问题很可能会因为过于本地化而被关闭。即使这样,我也会提出一些建议。这不是一个答案,但 cmets 部分太小了。

    1. 验证的方法和方式完全取决于您的子系统。没有一种方法对每个人都最有效。 SPA 与任何其他应用程序没有什么不同。您仍将基于身份验证授予对某些资源的访问权限。这可能是具有自定义授权属性的 API,可能是标头值,基于令牌,谁知道呢!随心所欲。
    2. 我建议您阅读更多内容以了解其工作原理。
    3. Cookie 的使用绝不表示它会破坏 REST。你会发现关于这个特定项目本身的大量文章。 Cookie 将随您的请求一起传递,就像您传递服务器为向您提供数据所需的任何特定信息一样。如果发送 cookie 会破坏 REST,那么向您的 API 发送参数也应该会破坏 REST!
    4. 现在,一种非常常见的方法(绝不是 ONE AND ALL 方法)是使用基于令牌的系统进行 SPA。原因虽然很多,但最容易解释的是,您的服务(Web API 或其他)可以单独托管,并且您的客户端作为 CORS 客户端工作。在这种情况下,您以您选择的任何形式进行身份验证,创建一个安全令牌并将其发送回客户端,并且每个需要经过身份验证的用户的资源都会根据令牌进行检查。令牌将作为每个请求的标头的一部分发送。没有令牌会导致简单的 401(未授权),或者无效令牌会导致 403(禁止)。

    没有人说 SPA 必须是所有静态 HTML,带有数据绑定,它也可能是您的 MVC 站点返回正在加载的部分(我过去做过的事情)。就仅使用 HTML 和 JS(特别是 Durandal)而言,有一些方法可以保护客户端应用程序的安全。最终,锁定来自服务器的数据,并在您收到 401/403 时将客户端路由到登录屏幕。

    如果您更关心 XSS 或请求伪造,即使只使用 HTML 和 JS,也有一些方法可以防止这种情况发生(尽管不像使用 MVC 删除防伪令牌那么容易)。

    我的两分钱。

    【讨论】:

    • Sujesh,非常感谢您的回答。我知道 SPA 与任何其他应用程序没有什么不同,我只是尝试设置场景以使可能的答案更清晰。我理解您在答案 1 上的意思,但我想进行身份验证的每种方法都有优点/缺点。关于您对令牌的最后评论,我想到了 AntiForgeryToken 属性的使用并且我知道如何使用它,但是如果我决定进行基于令牌的系统身份验证,这是否意味着我必须在我的请求中发送API,两个令牌? (身份验证和AntyForgery)。
    • 没错。通常,防伪令牌只不过是带有令牌的隐藏字段,然后随每个表单提交一起提交。在这种情况下,如果您只使用 HTML,您将显式读取令牌(将令牌放在主索引上,或者想出一种方法,它确实取决于身份验证),然后将其作为标题的一部分发送在你的ajax请求中。
    【解决方案2】:

    如果您进行“直接”身份验证 - 意味着您可以直接验证密码 - 您可以使用基本身份验证。

    我在这里写过: http://leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/

    此外,您可以考虑使用会话令牌来摆脱客户端上的密码: http://leastprivilege.com/2012/06/19/session-token-support-for-asp-net-web-api/

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 2021-04-02
      • 2021-05-17
      • 2020-04-07
      • 2011-05-16
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多