asp.net - asp - jwtregisteredclaimnames roles
Devolver roles de usuario desde token de portador de API web (2)
Estoy desarrollando un proyecto Web API 2. Para la autenticación, estoy usando token de portador. En la autenticación exitosa, la API devuelve un objeto 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"}
Ahora quiero devolver las funciones de usuario también en este objeto JSON. ¿Qué cambios debo hacer para obtener las funciones de usuario de la respuesta JSON?
Después de buscar mucho, descubrí que puedo crear algunas propiedades personalizadas y puedo configurarlas con el ticket de autenticación. De esta forma, puede personalizar la respuesta para que pueda tener los valores personalizados que pueden ser necesarios en el extremo de la persona que llama.
Aquí está el código para enviar los roles del usuario junto con el token. cual era mi requerimiento uno puede modificar el código para enviar los datos requeridos.
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);
}
Esto me devolverá la salida como
`{"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"] }`
Espero que esta información sea útil para alguien. :)
Los cambios anteriores son buenos para devolver roles como se esperaba con un método adicional en AuthorizationProvider como se muestra a continuación: (Agregue este método y rock con roles ...)
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);
}