如何使用OWIN在承载/访问令牌中定义clientID(或其他数据)

时间:2014-11-12 00:05:59

标签: asp.net oauth owin katana

我试图找出如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中。

我正在使用OWIN OAuth来创建令牌。我可以向身份凭证添加声明,然后将其标记/序列化到令牌中并传递回客户端。

然后客户端调用受保护的API,并且API对令牌进行反序列化并为用户设置IPrinciple。此标识对象包含用户名和ClaimsIdentity中的范围。

我想获取其他信息,例如首先发出获取令牌请求的clientID。

我可以把这些数据放在索赔中;这显然有效,但它是一个黑客。

我已经做了很多搜索,如果可能的话,我不确定如何在承载/访问令牌中存储额外的数据。

提前致谢!

2 个答案:

答案 0 :(得分:5)

您可以将其存储在AuthenticationProperties对象中,如下面的代码所示:

            var props = new AuthenticationProperties(new Dictionary<string, string>
            {
                { 
                    "as:client_id", (context.ClientId == null) ? string.Empty : context.ClientId
                },
                { 
                    "userName", context.UserName
                }
            });

        var ticket = new AuthenticationTicket(identity, props);

要阅读它,您需要取消保护令牌,如下面的代码,然后从故障单中读取属性。我没有找到直接的方法来创建令牌而不传递令牌,我知道这不是最终的答案,但它可能有所帮助。

 string token = "TOKEN GOES HERE";
 Microsoft.Owin.Security.AuthenticationTicket ticket = Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(token);

答案 1 :(得分:0)

如果要使用AuthenticationProperties,则必须覆盖TokenEndpoint,否则将不返回该属性

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
    {
      foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
      {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
      }

      return Task.FromResult<object>(null);
    }