4

我必须实现一个网站(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,还是可以添加到其他身份验证类型中?

谢谢你。

4

2 回答 2

4

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

  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 删除防伪令牌那么容易)。

我的两分钱。

于 2013-04-29T17:07:44.577 回答
3

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

我在这里写过: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/

于 2013-04-30T05:52:49.670 回答