asp.net-mvc - 我应该如何保护我的 SPA 和 Web.API?

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

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

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

我有一些问题需要先回答才能继续:

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

谢谢。

最佳答案

这个问题很可能会因为过于本地化而被关闭。即便如此,我还是会提出一些建议。这不是一个答案,但评论部分对于这个来说太小了。

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

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

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

我的两分钱。

关于asp.net-mvc - 我应该如何保护我的 SPA 和 Web.API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16284081/

相关文章:

c# - 如何从 MVC3 中的 _Layout.CSHTML 页面调用和传递 c# 帮助程序代码?

asp.net-mvc - 新建 Asp.Net 项目模板对话框为空

html - 为什么 CSS 布局在小型设备上看起来很差?

android - Mifare Plus 与 Mifare DESfire(安卓)

仅当服务器需要客户端证书时,iOS 客户端才无法使用 f5 BigIP 进行服务器验证/身份验证

c# - OWIN/Katana 未处理的异常全局处理程序?

asp.net-web-api - 使用 WebAPI PUT/POST 请求启用 CORS?

javascript - 访问给定 <tr> 的特定 <td> 并更改 html

c# - 暴露来自 `IdentityError` 类的消息是否可以?

c# - JSON.NET Parser *似乎* 双重序列化我的对象