6

我想在 Azure 上托管一个 MVC 4 Web API 项目。我需要确保可以从任何第三方应用程序和任何浏览器访问 API。实现一个简单地返回 JSON 的 RESTful API 对我来说是个好主意。现在,对我来说最大的挑战是创建与平台无关的身份验证机制。我不想使用默认的 MembershipProvider。我将使用 SSL。我也不会使用 FormsAuthentication。所有 API 调用都将通过 JQuery/AJAX。

我正在尝试了解基于令牌的身份验证。这是我认为我可以做的: - 客户端通过 HTTPS 将他们的用户凭据发送到服务器 - 服务器对客户端进行身份验证,创建令牌,将其连同日期时间戳和到期期限一起保存到数据库,然后将其发送回客户端 - 客户端每次访问 API 时都会将令牌发送到服务器

现在,我不明白的部分是,客户端将令牌存储在哪里?它是否保存在 cookie 中?如果是这样,非浏览器第三方应用程序在哪里保存身份验证令牌?代币被盗有多容易?

4

2 回答 2

2

身份验证令牌由 ASP.net 成员资格提供程序和身份验证模块存储在 cookie 中。在客户端,HTTP 客户端库可以处理 cookie。无 cookie 身份验证也可以使用表单身份验证。如果通道未加密(ssl 或 https),则中间人嗅探器可以窃取令牌。安全的 websapps 为身份验证 cookie 设置了一个小的超时,这样一小段不活动就会使会话过期,从而使 cookie 过期。

但是对于 API 身份验证,身份验证机制可能不同。每个呼叫都可以独立验证。因此无需为客户端维护令牌。每个 API 调用的 Authorization 标头应该有一些服务器可以识别的秘密。Amazon AWS 使用这种风格的 API 身份验证,许多其他的也遵循这种风格。使用 webapi,您可以实现这种身份验证。

  1. 客户有一个由服务器签发或由用户为该帐户导入服务器的私钥。

2.客户端照常调用API,但将一些信息放入Authorization标头中。该信息将是发送的数据的 HMAC 与客户的帐户 ID 和日期混合。

这是 HTTP API 中的授权标头应该是什么样子

Authorization: account-id  HMAC_OF_WITH_SECRET_KEY(data + account-id + GMT Date that will be in date header)

3.在服务器端(WebApi 端),您需要为 WebApi 控制器自定义 AuthorizeAttribute。这些自定义身份验证将接收来自客户端的请求,并与客户端所做的相反。服务器有客户端私钥,它可以像客户端一样排列数据并再次计算HMAC。如果此 HMAC 与 Authorization 标头中发送的 HMAC 相同,则它是帐户或用户 ID 的身份验证客户端。请注意,授权标头具有 account-id + HMAC 密钥。因此,使用此标头服务器中的 account-id 或 user-id 可以知道哪个客户端正在请求。

该机制涵盖身份验证以及数据完整性。

于 2012-09-07T04:40:55.113 回答
0

客户端需要将令牌安全地存储在其应用程序空间中。它可以选择进一步加密令牌。

cookie 也是存储令牌的地方,但问题是某些客户端没有 cookie 的优势。所以想想一般情况。

于 2012-09-07T04:17:14.867 回答