OWIN OAuth 2令牌是如何实际创建的?

时间:2014-10-31 16:19:11

标签: asp.net authentication asp.net-web-api oauth owin

我们有OWIN OAuth 2.0工作(感谢this fantastic post),但需要更深入地了解在HTTP响应中将ClaimsIdentity转换为实际access_token字符串的实际过程。 / p>

我们在OAuth授权提供商中使用此方法创建ClaimsIdentity

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    // <snip>
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        // validation, user checking code here

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user")); 
        context.Validated(identity);
    }
}

当我们将HTTP POST请求设为grant_type=password&username=user007&password=jamesbond时(放松,密码就可以了),我们得到HTTP POST响应正文

{"access_token":"9K8VtOBseU0-XZfdGe2_urn2HESY3jLkpgvowOQFPXsHeWNOrTlTVzfPu35ZEvr4AqSj_b0laesBegtVWuR8R-aItnNXw4vXiuCg0cTNMUKP_yfi89VhD446o2X6ffL8upwZVILpomweSweIVlDmwUDzIwf1ZqubrQ8vuiQDFu-_7vpjPwJ5yVvomQ75agsJWMZk-H_bVWSObds82aM8LCRJwb2bUJchr6_L1GP8xdXqRQz24uDhHvco-XByyMSMzZm-Qo0VVBbocbgP64OJulbihVG_W9e8G69UfbX99pIYiLyE4jixiUtjOKSiMYBISW3_fg","token_type":"bearer","expires_in":1799,"as:client_id":"","userName":"user007",".issued":"Fri, 31 Oct 2014 16:02:05 GMT",".expires":"Fri, 31 Oct 2014 16:32:05 GMT"}

问题:创建实际access_token字符串的逻辑是什么?

问题中的一些具体问题

  1. access_token字符串的内部结构是什么?
  2. 是加密还是签名或两者兼而有之?使用的密钥是什么(假设IIS / Azure云服务)?
  3. 我们如何覆盖生成发出的实际字符串的实现,然后在后续访问时检查相同的标记/字符串?
  4. 由于

1 个答案:

答案 0 :(得分:11)

很高兴我的帖子很有用,请找到以下答案:

1 - 这个&#39;魔法&#39;字符串是加密的 签名字符串(poor MSDN documentation,说明加密或签名不明确),其中包含所有声明和故障单属性的反序列化版本签到用户。如果在IIS模式下,加密/签名是通过&#34; decryptionKey&#34;和&#34; validationKey&#34; machineKey 节点(documentation)中的键值。如果作为独立的OWIN应用程序运行,则加密使用旧版DPAPI来保护它,并实际使用过时的3DES算法(documentation)。它的默认实现位于source code here

2 - 在第1点回答。

3 - 检查我的new post我在哪里展示如何发出签名的Json网络令牌而不是默认访问令牌。

希望这能回答你的问题。