1. 我们如何处理加密和非加密通信?我们是否坚持使用一种协议 https 和 spa ?
您不会拘泥于一种协议。使用 spa,您可以使用 ajax 通过 http 或 https 进行通信,无论您在任何给定时间选择哪一个。我会在您发送敏感信息(例如人名、生日或登录凭据)时使用 https。
一旦用户通过 https 登录到您的站点,您的服务器就可以为该用户设置表单身份验证 cookie。这个 cookie 应该是一个加密值,将他们的会话与服务器联系起来。您必须知道,如果您网站的其余部分使用 http,那么您就有此 cookie 以纯文本形式通过网络传递的风险。即使 cookie 的内容可以加密,但使用您选择的加密算法,恶意人员可以窃取此 cookie 并劫持您用户的会话。
如果只允许他们浏览网站并创建购物车,这对您来说可能没什么大不了的。一旦用户准备好结账,那么您应该通过 https 重新验证用户身份,作为一种双重检查,以确保他们不是恶意用户。亚马逊就是这样做的。
2. 我们应该使用什么样的身份验证?
好吧,这完全取决于您希望您的网站具有哪些功能。
身份验证用于公开 Web 服务,您可以允许其他站点以委托访问权限调用这些服务。这意味着如果您的用户希望另一个站点(站点 x)能够访问您站点上的功能以获取其个人资料。站点 x 可以将用户重定向到您站点上的 oauth 端点,该端点将对用户进行身份验证。您的 oauth 端点将询问用户是否可以与站点 x 共享某些功能,以及用户是否同意将生成令牌。用户将此令牌传递给站点 x,其中站点 x 将对您的站点进行服务器到服务器的调用。站点 x 将在调用中显示令牌,因此对您的服务的调用将是委托访问调用。OAuth 是一种配置其他站点以对您的服务进行委派访问的方法。我希望我能够清楚地解释这一点。我并不总是擅长这一点。
OpenID不是一种非常安全的身份验证方式,它更加方便,因此用户不必为在您的站点注册帐户而烦恼。因为 OpenID 是完全开放的,所以您信任另一个提供商来验证您的用户。如果第三方提供商的用户存储受到威胁,那么您的用户也会受到威胁。这是凭证系统的一个示例,您基本上是在说我会相信您所说的,如果您可以让 OpenID 提供商为您担保的话。
另一种解决方案是WS-Federation。WS-Federation 是如果您有多个站点并且您希望拥有 1 个您信任的身份验证提供程序。该身份验证提供者可以是您的,基本上您的所有网站都说如果您想访问我的网站,那么您必须首先通过我的身份验证提供者进行身份验证。此身份验证提供程序可以存在于单独的域中,并且可以选择它选择的任何身份验证机制。您相信此身份验证提供商会尽最大努力管理您的用户帐户。
但是,如果您只想在您的站点上进行身份验证并且没有多个站点,则 WS-Federation 可能会有点过分。在这种情况下,我只建议进行表单身份验证,这应该很简单。有很多关于如何做到这一点的例子,微软为如何做到这一点提供了许多解决方案。您应该考虑创建自定义成员资格提供程序。
一旦用户通过您的站点的身份验证,您应该创建一个表单身份验证 cookie。此 cookie 将用户与他们在服务器上的会话联系起来。这适用于上面列出的所有场景。MVC 4 也支持上面列出的所有场景。
谢谢,如果我不够清楚,请随时提出更多问题。
** 编辑 2017 年 12 月 1 日 ** 多年后回到这个问题,我了解到依靠 cookie 来获取基于 REST 的 API 并不是一个好主意。您不想在 Web 应用程序上创建会话,因为这会使您的应用程序更难扩展。因此,如果您需要身份验证,请使用 HTTPS 和某种形式的身份验证(BASIC、DIGEST、基于令牌等)。因此,您的 SPA 客户端应用程序将在每个 http 请求上设置授权标头,然后您的 Web 服务器应用程序将重新验证每个请求。