0

J'ai une application SPA qui utilise adal.js. Je peux me connecter et renouveler le jeton. J'ai remarqué que dans le profil de l'utilisateur, il n'y a pas de groupes, donc je changé le manifeste dans l'azur AD:Comment obtenir les noms de groupes/rôles pour l'utilisateur

Old: "groupMembershipClaims": null 
New: "groupMembershipClaims": "All" 

Après ce changement, je peux voir le tableau des groupes dans le côté client, mais il ne contient que GUIDs. Côté serveur (.NET Core Web Api) c'est la même chose. Je peux voir le groupe dans les revendications mais le nom est nul. Est-ce dû au fait que le groupe est synchronisé avec Azure AD à partir de l'annuaire d'entreprise local?

Je souhaite utiliser l'attribut Authorize pour limiter certaines opérations aux utilisateurs faisant partie d'un certain groupe. Par exemple.

[Authorize(Roles = "Admin")] 

Modifier: Le rôle est-il identique à celui du groupe?

Je voudrais aussi avoir ces informations sur le côté client afin que je puisse désactiver certains boutons etc.

+1

Les rôles et les groupes ne sont pas les mêmes. Les groupes sont ce que vous êtes habitué à partir de AD sur le terrain. Les rôles sont par application. Vous pouvez les définir dans le portail dans les paramètres de l'application et leur affecter des utilisateurs. Par défaut, les rôles font partie du jeton JWT et les groupes ne le sont pas. Sauf si vous utilisez '' groupMembershipClaims'', comme vous l'avez déjà compris. – RasmusW

Répondre

1

Vous obtenez seulement les IDs des groupes dans les revendications. En règle générale, vous ne voulez pas utiliser les noms de groupe, car ils peuvent être facilement modifiés par n'importe qui. Le GUID ne peut pas être modifié, c'est donc un peu plus fiable.

Je pense que vous pouvez spécifier RoleClaimType être les groupes revendiquent lors de la configuration d'authentification, puis utilisez les GUIDs dans [Authorize]. Personnellement, je trouverais cela un peu déroutant. Dans MVC classique, j'écrirais un AuthorizeAttribute personnalisé qui vérifierait que les revendications de groupe de l'utilisateur contiennent la valeur requise. Il ne serait pas difficile de faire en sorte qu'il vous permet de spécifier le groupe comme une chaîne, puis obtient le GUID du groupe à partir de la configuration.

0

Comme indiqué par @rasmusw, les groupes et les rôles sont différents. Dans notre cas, les droits d'accès sont données à l'aide des groupes (synchronisés à partir du sur place AD) donc je décidé de faire ce qui suit

Configurer que les groupes sont en fait des rôles

app.UseJwtBearerAuthentication(new JwtBearerOptions 
    { 
     TokenValidationParameters = new TokenValidationParameters 
     { 
      RoleClaimType = "groups", 
     } 
    }); 

code objet dur ids avec des noms sains d'esprit

public const string Sales = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 

Utilisez les noms sains d'esprit dans Autorisez attribu te

[Authorize(Roles = Sales)] 

Il n'est pas la plus jolie solution, mais il semble fonctionner. Il convient de noter que ClaimsPrincipal contient uniquement les ID d'objet des groupes. J'ai décidé d'injecter IUserContext personnalisé qui contient des rôles tels que "Ventes", "Marketing" afin que je n'ai pas à gérer les identifiants d'objets dans le code. Avec cela, je peux facilement utiliser quelque chose comme:

user.IsInRole(Sales) 
+0

J'ai mentionné ceci comme une solution possible dans ma réponse, mais un problème est que maintenant vous êtes codé en dur à un groupe, et il ne peut pas être changé via les paramètres de configuration.J'ai quelques cas où un utilisateur peut avoir accès à l'environnement de test, mais nous ne voulons pas qu'ils aient le même accès en production. – juunas