J'utilise MVC5 Identity 2.0 pour que les utilisateurs se connectent à mon site Web, où les détails d'authentification sont stockés dans une base de données SQL. Asp.net Identity a été implémenté de manière standard, comme on peut le trouver dans de nombreux tutoriels en ligne.
La classe ApplicationUser dans IdentityModels a été étendue pour inclure certaines propriétés personnalisées, telles qu'un entier OrganizationId. L'idée est que de nombreux utilisateurs peuvent être créés et affectés à une organisation commune à des fins de relation de base de données.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
Comment puis-je récupérer la propriété OrganizationId de l'utilisateur actuellement connecté à partir d'un contrôleur? Est-ce disponible via une méthode une fois qu'un utilisateur est connecté ou dois-je toujours récupérer le OrganizationId de la base de données, basé sur le UserId, chaque fois qu'une méthode de contrôleur s'exécute?
En lisant sur le Web, j'ai vu que je devais utiliser ce qui suit pour obtenir l'ID utilisateur connecté, etc.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Cependant, OrganizationId n'est pas une propriété disponible dans User.Identity. Dois-je étendre User.Identity pour inclure la propriété OrganizationId? Si oui, comment dois-je procéder.
La raison pour laquelle j'ai si souvent besoin de OrganizationId est que de nombreuses requêtes de table dépendent de OrganizationId pour récupérer des données pertinentes pour l'organisation associée à l'utilisateur connecté.
Réponses:
Chaque fois que vous souhaitez étendre les propriétés de User.Identity avec des propriétés supplémentaires comme la question ci-dessus, ajoutez d'abord ces propriétés à la classe ApplicationUser comme suit:
Ensuite, ce dont vous avez besoin est de créer une méthode d'extension comme celle-ci (je crée la mienne dans un nouveau dossier Extensions):
Lorsque vous créez l'identité dans la classe ApplicationUser, ajoutez simplement la revendication -> OrganizationId comme ceci:
Une fois que vous avez ajouté la revendication et que votre méthode d'extension est en place, pour la rendre disponible en tant que propriété sur votre User.Identity, ajoutez une instruction using sur la page / le fichier auquel vous souhaitez y accéder :
dans mon cas:
using App.Extensions;
dans un Controller et avec@using. App.Extensions
un fichier View .cshtml.ÉDITER:
Pour éviter d'ajouter une instruction using dans chaque vue, vous pouvez également accéder au dossier Views et y localiser le fichier Web.config. Recherchez maintenant la
<namespaces>
balise et ajoutez-y votre espace de noms d'extension comme suit:Enregistrez votre fichier et vous avez terminé. Désormais, chaque vue connaîtra vos extensions.
Vous pouvez accéder à la méthode d'extension:
la source
Je cherchais la même solution et Pawel m'a donné 99% de la réponse. La seule chose qui manquait dont j'avais besoin pour que l'extension s'affiche était l'ajout du code Razor suivant dans la page cshtml (vue):
@using programname.Models.Extensions
Je cherchais le FirstName, à afficher en haut à droite de ma NavBar après la connexion de l'utilisateur.
Je pensais que je publierais ceci au cas où cela aiderait quelqu'un d'autre, alors voici mon code:
J'ai créé un nouveau dossier appelé Extensions (sous mon dossier Modèles) et créé la nouvelle classe comme Pawel spécifié ci-dessus:
IdentityExtensions.cs
IdentityModels.cs
:Puis dans mes
_LoginPartial.cshtml
(sousViews/Shared
dossiers) j'ai ajouté@using.ProgramName.Models.Extensions
J'ai ensuite ajouté le changement à la ligne de code suivante qui allait utiliser le prénom de l'utilisateur après la connexion:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Peut-être que cela aide quelqu'un d'autre sur toute la ligne.
la source
Consultez cet excellent article de blog de John Atten: ASP.NET Identity 2.0: Personnalisation des utilisateurs et des rôles
Il contient des informations détaillées sur l'ensemble du processus. Allez le lire :)
Voici quelques notions de base.
Étendez la classe ApplicationUser par défaut en ajoutant de nouvelles propriétés (par exemple, adresse, ville, état, etc.):
Ensuite, vous ajoutez vos nouvelles propriétés à votre RegisterViewModel.
Mettez ensuite à jour la vue de registre pour inclure les nouvelles propriétés.
Mettez ensuite à jour la méthode Register () sur AccountController avec les nouvelles propriétés.
la source
Pour tous ceux qui trouvent cette question à la recherche de la manière d'accéder aux propriétés personnalisées dans ASP.NET Core 2.1 - c'est beaucoup plus simple: vous aurez un UserManager, par exemple dans _LoginPartial.cshtml, et vous pourrez simplement le faire (en supposant que "ScreenName" est un propriété que vous avez ajoutée à votre propre AppUser qui hérite de IdentityUser):
la source
GetUserAsync(User)
va interroger la base de données pour récupérer le OrganizationId. En revanche, la solution acceptée inclura le OrganizationId dans les revendications (par exemple, cookie). L’avantage d’extraire ces informations de la base de données est que les personnes peuvent être déplacées d’une organisation à l’autre sans qu’elles se déconnectent / se connectent. Bien sûr, l'inconvénient est qu'il nécessite une requête de base de données supplémentaire.Dhaust offre un bon moyen d'ajouter la propriété à la classe ApplicationUser. En regardant le code OP, il semble qu'ils aient peut-être fait cela ou étaient sur la bonne voie pour le faire. La question se pose
Pawel propose un moyen d'ajouter une méthode d'extension qui nécessite l'utilisation d'instructions ou l'ajout de l'espace de noms au fichier web.config.
Cependant, la question vous demande si vous «devez» étendre User.Identity pour inclure la nouvelle propriété. Il existe un autre moyen d'accéder à la propriété sans étendre User.Identity. Si vous avez suivi la méthode Dhaust, vous pouvez ensuite utiliser le code suivant dans votre contrôleur pour accéder à la nouvelle propriété.
la source
J'avais également ajouté ou étendu des colonnes supplémentaires dans ma table AspNetUsers. Quand je voulais simplement voir ces données, j'ai trouvé de nombreux exemples comme le code ci-dessus avec "Extensions" etc ... Cela m'a vraiment étonné que vous deviez écrire toutes ces lignes de code juste pour obtenir quelques valeurs des utilisateurs actuels.
Il s'avère que vous pouvez interroger la table AspNetUsers comme n'importe quelle autre table:
la source