Asp.net 如何使用OWIN在承载/访问令牌中定义clientID(或其他数据)
我试图弄清楚如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中 我正在使用OWIN OAuth创建令牌。我可以将声明添加到身份票证中,然后将其加密/序列化到令牌中并传递回客户端 然后,客户端调用受保护的API,API反序列化令牌并为用户设置IPrinciple。此标识对象包含用户名和ClaimSideEntity中的作用域 我希望获得其他信息,例如首先请求获取令牌的clientID 我可以将这些数据放入索赔中;这显然是可行的,但它是一个黑客 我已经做了相当多的搜索,如果可能的话,我不确定如何在承载/访问令牌中存储额外的数据Asp.net 如何使用OWIN在承载/访问令牌中定义clientID(或其他数据),asp.net,oauth,owin,katana,Asp.net,Oauth,Owin,Katana,我试图弄清楚如何将clientID(或我可能需要的任何其他数据)放入承载/访问令牌中 我正在使用OWIN OAuth创建令牌。我可以将声明添加到身份票证中,然后将其加密/序列化到令牌中并传递回客户端 然后,客户端调用受保护的API,API反序列化令牌并为用户设置IPrinciple。此标识对象包含用户名和ClaimSideEntity中的作用域 我希望获得其他信息,例如首先请求获取令牌的clientID 我可以将这些数据放入索赔中;这显然是可行的,但它是一个黑客 我已经做了相当多的搜索,如果可能
提前谢谢 您可以将其存储在
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);
如果要使用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);
}
public覆盖任务令牌端点(OAuthTokenEndpointContext)
{
foreach(context.Properties.Dictionary中的KeyValuePair属性)
{
AdditionalResponseParameters.Add(property.Key,property.Value);
}
返回Task.FromResult(空);
}
这在身份验证服务器上非常有效。但是受保护的资源呢?例如,接受这些令牌的Web API。使用以下选项:app.useAuthBeareAuthentication(新的Microsoft.Owin.Security.OAuth.OAuthBeareAuthenticationOptions());它也会工作,我已经在资源服务器上做了,而不是在授权服务器上,请检查它,在这个上下文中,令牌值来自哪里?@TaiseerJoudeh感谢您的回答和很棒的博客。我在这里很困惑,什么应该放在AuthenticationProperties中,什么应该放在claim identity中?@Chengwhyn在claims identity中,你没有把你想要它编码的信息放在它自己的令牌中,在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);
}