我该如何保护我的SPA和Web.API?

时间:2013-04-29 16:53:02

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

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

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

我有一些问题需要回答才能进一步:

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

2 个答案:

答案 0 :(得分:4)

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

  1. 您的身份验证方法和方式完全取决于您的子系统。没有一种方法可以最好地适用于每个人。 SPA与任何其他应用程序没有什么不同。您仍将基于身份验证授予对某些资源的访问权限。这可能是API,具有自定义Authorization属性,可以是标头值,基于令牌,谁知道!无论你认为什么是最好的。
  2. 我建议你阅读更多内容,了解其工作原理。
  3. 使用cookies绝不表示它会破坏REST。你会发现很多关于这个特定项目的文章。 Cookie将根据您的请求传递,只需传递服务器所需的任何特定信息,以便为您提供数据。如果发送cookie会破坏REST,那么向API发送参数也会破坏REST!
  4. 现在,一种非常常见的方法(绝不是ONE AND ALL方法)是使用基于令牌的SPA系统。原因虽然很多,但最容易解释的是,您的服务(Web API或其他)可以单独托管,而您的客户端也可以作为CORS客户端使用。在这种情况下,您以您选择的任何形式进行身份验证,创建安全令牌并将其发送回客户端,并根据令牌检查需要经过身份验证的用户的每个资源。每次请求时,令牌都将作为标题的一部分发送。没有令牌会导致简单的401(未授权)或无效令牌可能导致403(禁止)。
  5. 没有人说SPA需要全部是静态HTML,有数据绑定,它也可能是你的MVC网站返回部分被加载(我过去做过的事情)。至于使用HTML和JS(特别是Durandal),有一些方法可以保护客户端应用程序。最终,锁定服务器上的数据,并在收到401/403时将客户端路由到登录屏幕。

    如果您更关注XSS或请求伪造,那么即使只使用HTML和JS,也有办法防止这种情况(尽管不像使用MVC删除防伪标记那么容易)。

    我的两分钱。

答案 1 :(得分: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/