本文是Windows Azure AppFabric入门教学的第四篇文章。我们知道AppFabric中的Access Control Service在验证授权过程中会使用到SWT 和OAuth WRAP,所以为了更好的了解ACS其内部原理,我们会在本教程中简单地介绍SWT 和OAuth WRAP协议。
Simple Web Token (SWT)
SWT简介:
Simple Web Token (SWT)定义了传输简单声明的格式,其兼容性和格式能够轻易的被放入例如HTTP等协议的头部。一个简单的声明可以由一组名值对组成。
因为 SWT会传输重要的验证和访问信息,我们需要防止其被篡改。因此引入了唯一的强制的名值对- HMACSHA256。这一般为SWT最后一对名值对,其值为其他名值对的SHA 256 HMAC 值。
SWT 示例:
一SWT 发布者想要发布一个SWT,并带有如下信息
Issuer = issuer.example.com
ExpiresOn = 1/1/2010, Midnight
com.example.group = gold
over18 = true
其 HMAC 密钥为 (base 64编码表示,该密钥客户端和服务器端各有一份) :
N4QeKa3c062VBjnVK6fb+rnwURkcwGXh7EoNK34n0uM=
在本示例中, Issuer 和 ExpiresOn 是SWT规范的保留字。 com.example.group属性是 example.com域名拥有者所指定的句法和语义上的协定。 over18是一个在发布者和用户之间,私下定义的属性
在对SWT进行编码前,我们需要将 ExpiresOn 转换成从UTC时间1970年1月1日午夜至失效时间2010年1月1日午夜的秒数。结果是 1262304000。
编码
1.将名值对编码。结果如下:
Issuer=issuer.example.com&ExpiresOn=1262304000&com.example.group=gold&over18=true
2. 使用密钥来计算先前值的HMAC值。
3. 用Base64编码来表示上一步的 HMAC。结果为: AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
4. 将上步结果以URL编码,并附在声明的最后。最终结果如下:
Issuer=issuer.example.com&ExpiresOn=1262304000&com.example.group=gold&over18=true&HMACSHA256= AT55%2B2jLQeuigpg0xm%2Fvn7tjpSGXBUfFe0UXb0%2F9opE%3D
解码
1. 用 &HMACSHA256= 来分开SWT,我们得到一个noHMACSWT 字符串: Issuer=issuer.example.com&ExpiresOn=1262304000&com.example.group=gold& =over18=true&
以及一个 submittedHMAC 字符串: AT55%2B2jLQeuigpg0xm%2Fvn7tjpSGXBUfFe0UXb0%2F9opE%3D
2. 用URL解码 submittedHMAC 字符串,得到: AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
3. 使用计算noHMACSWT字符串和HMAC密钥来计算 localHMAC, 以base64编码表示,结果如下:
AT55+2jLQeuigpg0xm/vn7tjpSGXBUfFe0UXb0/9opE=
4. 比较 submittedHMAC 和 localHMAC ,我们看到它们是一致的,因此验证通过。之后URL解码noHMACSWT字符串来获得 SWT 值。