web-dev-qa-db-fra.com

Renvoyer les rôles d'utilisateur à partir du jeton porteur de l'API Web

Je développe un projet Web API 2. Pour l'authentification, j'utilise un jeton au porteur. En cas d'authentification réussie, l'API renvoie un objet 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"}

Maintenant, je veux également retourner les rôles d'utilisateur dans cet objet JSON. Quelles modifications dois-je apporter pour obtenir les rôles d'utilisateur à partir de la réponse JSON?

22
Sachin Trivedi

Après avoir beaucoup cherché, j'ai découvert que je pouvais créer des propriétés personnalisées et les définir avec le ticket d'authentification. De cette façon, vous pouvez personnaliser la réponse afin qu'elle puisse avoir les valeurs personnalisées qui peuvent être requises du côté de l'appelant.

Voici le code pour envoyer les rôles utilisateur avec le jeton. ce qui était mon exigence. on peut modifier le code pour envoyer les données requises.

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);
    }

Cela me rendra le résultat

`{"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"] }`

J'espère que ces informations seront utiles à quelqu'un. :)

51
Sachin Trivedi

Les modifications ci-dessus sont bonnes pour renvoyer les rôles comme prévu avec une méthode supplémentaire dans AuthorizationProvider comme ci-dessous: (Ajoutez cette méthode et basculez avec les rôles ...)

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);
        }
4
Nirav Desai