我正在开发一个Web API 2项目。对于身份验证,我使用的是持有者令牌。如果身份验证成功,API将返回一个JSON对象。
{"access_token":"Vn2kwVz...",
"token_type":"bearer",
"expires_in":1209599,
"userName":"username",
".issued":"Sat, 07 Jun 2014 10:43:05 GMT",
".expires":"Sat, 21 Jun 2014 10:43:05 GMT"}
现在我还想在这个JSON对象中返回用户角色。为了从JSON响应中获取用户角色,我需要进行哪些更改?
发布于 2014-06-10 20:16:29
在搜索了很多次之后,我发现我可以创建一些自定义属性,并可以使用身份验证票证设置它们。通过这种方式,您可以定制响应,使其具有调用方可能需要的定制值。
下面是将用户角色与令牌一起发送的代码。这是我的要求。可以修改代码以发送所需的数据。
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
using (UserManager<ApplicationUser> userManager = _userManagerFactory())
{
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
context.Options.AuthenticationType);
ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
CookieAuthenticationDefaults.AuthenticationType);
List<Claim> roles = oAuthIdentity.Claims.Where(c => c.Type == ClaimTypes.Role).ToList();
AuthenticationProperties properties = CreateProperties(user.UserName, Newtonsoft.Json.JsonConvert.SerializeObject(roles.Select(x=>x.Value)));
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
}
public static AuthenticationProperties CreateProperties(string userName, string Roles)
{
IDictionary<string, string> data = new Dictionary<string, string>
{
{ "userName", userName },
{"roles",Roles}
};
return new AuthenticationProperties(data);
}
这将返回输出为
`{"access_token":"Vn2kwVz...",
"token_type":"bearer",
"expires_in":1209599,
"userName":"username",
".issued":"Sat, 07 Jun 2014 10:43:05 GMT",
".expires":"Sat, 21 Jun 2014 10:43:05 GMT"
"roles"=["Role1","Role2"] }`
希望这些信息能对某些人有所帮助。:)
发布于 2017-08-10 21:41:53
上面的更改可以通过AuthorizationProvider中的另一个方法按预期返回角色,如下所示:(添加此方法并使用角色摇摆...)
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);
}
https://stackoverflow.com/questions/24096634
复制相似问题