2012-09-06 267 views
5

我想在Azure上托管一个MVC 4 Web API项目。我需要确保可以从任何第三方应用程序和任何浏览器访问API。实现一个简单地返回JSON的RESTful API听起来像是个好主意。现在,我面临的最大挑战是创建一个平台不可知的认证机制。我不想使用默认的MembershipProvider。我将使用SSL。我也不会使用FormsAuthentication。所有的API调用都将通过JQuery/AJAX进行。身份验证令牌在客户端存储在哪里?

我想了解基于令牌的身份验证。以下是我认为我可以做到的事情: - 客户端通过HTTPS将其用户凭据发送到服务器 - 服务器对客户端进行身份验证,创建令牌并将其保存到DB以及日期时间戳和过期期限,并将其发送回到客户端 - 客户端每次访问API时都会将令牌发送给服务器

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

回答

2

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

但是对于API认证,认证机制可能不同。每个呼叫都可以独立认证。所以没有必要为客户维护一个令牌。每个API调用的授权标头应该有一些服务器可以识别的秘密。 Amazon AWS使用这种风格的API认证,其他许多人也遵循这种风格。通过webapi,你可以实现这种认证。

  1. 客户端有一个私钥用于他的帐户由服务器发出或由用户导入到服务器的帐户服务器。

2.客户端像往常一样调用API,但将一些信息放入授权标头。这些信息将是数据的HMAC与客户的帐户ID和日期混合发送。

这里是HTTP API的授权头应该怎么看起来像

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

3.On服务器端(的WebAPI侧),你需要定制AuthorizeAttribute为的WebAPI控制器。这些自定义身份验证将接收来自客户端的请求,并做出客户端已完成的反向操作。服务器拥有客户端私钥,它可以按照客户端的要求安排数据并再次计算HMAC。如果这个HMAC与授权头中发送的HMAC相同,那么它就是对帐户或用户ID进行身份验证的客户端。请注意,授权标头具有account-id + HMAC秘密。所以在这个头文件服务器中使用account-id或user-id可以知道哪个客户端正在请求。

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

0

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

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

相关问题