我试图找出如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中。
我正在使用OWIN OAuth来创建令牌。我可以向身份凭证添加声明,然后将其标记/序列化到令牌中并传递回客户端。
然后客户端调用受保护的API,并且API对令牌进行反序列化并为用户设置IPrinciple。此标识对象包含用户名和ClaimsIdentity中的范围。
我想获取其他信息,例如首先发出获取令牌请求的clientID。
我可以把这些数据放在索赔中;这显然有效,但它是一个黑客。
我已经做了很多搜索,如果可能的话,我不确定如何在承载/访问令牌中存储额外的数据。
提前致谢!
答案 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);
}