J'essaie de m'éloigner des WebForms et d'apprendre MVC, en particulier en utilisant le nouveau modèle d'identité ASP.NET. Cependant, je ne peux pas trouver de documentation formelle de Microsoft, qui montre comment créer un objet de revendications et le stocker dans une base de données pour un utilisateur authentifié.
Mon site doit effectuer les opérations suivantes:
Quelqu'un peut-il nous éclairer sur la manière dont cela peut être réalisé?
Honnêtement, j'apprends toujours les cordes avec l'identité, moi-même. Certes, la documentation fournie par Microsoft pourrait être meilleure, mais je n'ai jamais trouvé aucune de leur documentation aussi utile. La meilleure chose vient toujours de la communauté, et malheureusement, l'identité est encore si nouvelle que la communauté a encore eu le temps de l'étoffer.
Cela dit, voici ce que je sais, étant entendu qu'il existe peut-être de meilleures façons que je ne connais pas encore.
Votre UserManager
a trois méthodes de signification: GetClaimsAsync
, AddClaimAsync
et RemoveClaimAsync
.
Pour obtenir toutes les réclamations d'un utilisateur:
var claims = await UserManager.GetClaimsAsync(userId);
Vous pouvez obtenir l'ID de l'utilisateur actuel avec:
var userId = User.Identity.GetUserId();
Une fois que vous avez les réclamations, pour en retirer une spécifique:
var someClaim = claims.FirstOrDefault(c => c.Type == "SomeClaimType");
Où "SomeClaimType" est le nom de la revendication telle qu'elle a été ajoutée. Dans certains scénarios, il peut s'agir d'une URN pleinement qualifiée ou simplement d'une simple chaîne. Si ce n'est pas quelque chose que vous avez personnellement ajouté, la meilleure chose à faire est simplement d'inspecter la variable claims
pendant une session de débogage pour voir ce que vous avez réellement là.
De plus, comme la liste des revendications est interrogeable, vous pouvez à peu près faire la requête LINQ que vous souhaitez, Where
, Count
, etc.
Pour ajouter une nouvelle revendication:
await UserManager.AddClaimAsync(userId, new Claim("SomeClaimType", claimValue));
Et pour supprimer une réclamation:
await UserManager.RemoveClaimAsync(userId, someClaim);
Les rôles fonctionnent de manière similaire. Pour obtenir tous les rôles pour un utilisateur:
var roles = await UserManager.GetRolesAsync(userId);
Pour voir si un utilisateur est dans un rôle particulier:
var hasRole = await UserManager.IsInRoleAsync(userId, "SomeRole");
Pour ajouter un utilisateur à un rôle particulier:
await UserManager.AddToRoleAsync(userId, "SomeRole");
Et pour supprimer:
await UserManager.RemoveFromRoleAsync(userId, "SomeRole");
L'ajout des rôles en premier lieu est un peu différent; vous devez créer une instance de RoleStore
.
var roleStore = new RoleStore<IdentityRole>(context);
Ensuite, vous pouvez l'utiliser pour gérer tous les rôles. Par exemple, pour créer un nouveau rôle:
await roleStore.CreateAsync(new IdentityRole("RoleName"));
Retirer:
var identityRole = await roleStore.FindByNameAsync("RoleName");
await roleStore.DeleteAsync(identityRole);
Obtenir tous les rôles n'est pas possible avec l'API spécifique à l'identité pour le moment, mais vous pouvez toujours revenir directement à l'interrogation avec Entity Framework:
var allRoles = context.Roles.OrderBy(o => o.Name);
En ce qui concerne Asp.Net Identity, je recommanderais fortement l'implémentation de Brock Allen, appelée "Identity Reboot". Le redémarrage d'identité est essentiellement un ensemble d'extensions de l'identité ASP.NET. Il a été inspiré en raison de frustrations liées à l'implémentation de l'identité ASP.NET.
Vous pouvez lire un article d'introduction ici . Vous pouvez télécharger le code source et des exemples depuis github ici .
Vous pouvez l'installer en utilisant nuget:
www.nuget.org/packages/BrockAllen.IdentityReboot/
www.nuget.org/packages/BrockAllen.IdentityReboot.Ef/ (for entity framework)