Comment étendre les propriétés disponibles de l'Utilisateur.Identité
Je suis en utilisant MVC5 Identité 2.0 pour les utilisateurs à accéder à mon site web, où les informations d'authentification sont stockées dans une base de données SQL. Asp.net l'Identité a été mis en oeuvre de manière standard comme on en trouve dans de nombreux tutoriels en ligne.
La ApplicationUser classe dans IdentityModels a été étendu pour inclure certaines propriétés personnalisées, comme un entier OrganizationId. L'idée est que beaucoup d'utilisateurs peuvent être créés et attribués à une Organisation commune pour la base de données à des fins de relations.
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 l'OrganizationId propriété de l'utilisateur actuellement connecté depuis un contrôleur?
Est-ce disponible via une méthode une fois qu'un utilisateur est connecté ou dois-je toujours les récupérer le OrganizationId à partir de la base de données, basé sur le nom d'utilisateur à chaque fois qu'une méthode de contrôleur exécute?
Autour de la lecture sur le web j'ai vu j'ai besoin d'utiliser les éléments suivants pour obtenir de l'utilisateur connecté en UserId etc.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Cependant, OrganizationId n'est pas de propriétés disponibles à l'Utilisateur.L'identité. Ai-je besoin d'étendre l'Utilisateur.L'identité d'inclure le OrganizationId propriété? Si oui, comment dois-je faire à ce sujet.
La raison j'ai besoin de la OrganizationId si souvent, c'est que de nombreuses requêtes de table sont tributaires de la OrganizationId pour obtenir les données pertinentes de l'Organisation qui est associé à l'utilisateur connecté.
- Ma réponse here vous aider à tous?
- À peu près la même réponse de moi ici: stackoverflow.com/a/28138594/809357 - si vous avez besoin de cette information régulièrement dans la vie de la demande, vous pouvez le placer sur le cookie comme une réclamation.
- Merci @Chaussure à la fois de votre réponse travaillé. En plus de vos réponses, j'ai dû ajouter une demande pour être stockées dans le cookie. Dans le IdentityModels classe que j'avais à ajouter userIdentity.AddClaim(nouvelle Demande("MyApp:OrganizationId", OrganizationId.ToString())); la public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> gestionnaire) méthode.
Vous devez vous connecter pour publier un commentaire.
Chaque fois que vous souhaitez étendre les propriétés de l'Utilisateur.De l'identité de toutes les propriétés supplémentaires comme la question ci-dessus, ajouter ces propriétés à la ApplicationUser classe de première de la sorte:
Ensuite ce que vous avez besoin est de créer une méthode d'extension comme (j'ai créer le mien dans un nouveau dossier Extensions):
Lorsque vous créez l'Identité dans le ApplicationUser classe, il suffit d'ajouter la Réclamation -> OrganizationId comme suit:
Une fois que vous avez ajouté sur la demande et l'extension de la méthode en place, afin de le rendre disponible comme une propriété de l'Utilisateur.Identité, ajouter une instruction d'utilisation sur la page ou le fichier que vous souhaitez accéder:
dans mon cas:
using App.Extensions;
au sein d'un Contrôleur et@using. App.Extensions
dans un .cshtml fichier de la Vue.EDIT:
Ce que vous pouvez aussi le faire pour éviter d'ajouter une instruction d'utilisation dans chaque Vue est d'aller dans le dossier Vues, et de localiser sur le Web.fichier de configuration là.
Maintenant, regardez pour les
<namespaces>
tag et ajouter votre extension d'espace de noms, il y de cette façon:Enregistrer votre fichier et vous avez terminé. Maintenant, chaque Vue est à vous de savoir de vos extensions.
Vous pouvez accéder à l'Extension de la Méthode:
Espère que ça aide tout le monde 🙂
AspUsersTable
dans l'Identité 2.2, maintenant je suis coincé avec DB premier scénario, pouvez-vous s'il vous plaît également partager quelques conseils pourquoi ne pas ajouter directement l'établissement à l'aspUsersTableJe cherchais la même solution et Pawel m'a donné 99% de la réponse. La seule chose qui manquait et que j'avais besoin pour l'Extension de l'affichage d'adjonction de Rasoir Code dans le cshtml(vue) page:
@using programname.Models.Extensions
J'ai été à la recherche pour le Prénom, pour afficher en haut à droite de ma barre de navigation après la connexion de l'utilisateur.
Je pensais que j'allais poster ce cas, il aide à quelqu'un d'autre, Donc voici mon code:
J'ai créé un nouveau dossier appelé Extensions(Sous mon Dossier de Modèles) et créé la nouvelle classe comme Pawel spécifié ci-dessus:
IdentityExtensions.cs
IdentityModels.cs
:Ensuite dans mon
_LoginPartial.cshtml
(SousViews/Shared
Dossiers) j'ai ajouté@using.ProgramName.Models.Extensions
J'ai ensuite ajouté le changement de la folling ligne de code qui va utiliser le prénom 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 en bas de la ligne.
Consulter cet excellent article de blog par Jean-Attention:
ASP.NET Identité 2.0: la Personnalisation des Utilisateurs et des Rôles
Il a une grande étape-par-étape d'infos sur l'ensemble du processus. Allez le lire : )
Voici quelques principes de base.
Étendre la valeur par défaut ApplicationUser classe en ajoutant de nouvelles propriétés (c-à - Adresse, Ville, État, etc.):
Puis vous ajoutez vos nouvelles propriétés à votre RegisterViewModel.
Puis mettre à jour le Registre de Vue afin d'inclure les nouvelles propriétés.
Puis mise à jour de la méthode Register() sur AccountController avec les nouvelles propriétés.
Pour toute personne qui trouve cette question à la recherche pour savoir comment accéder aux propriétés personnalisées dans ASP.NET de Base 2.1 - c'est beaucoup plus facile: Vous aurez un UserManager, par exemple, dans _LoginPartial.cshtml, et alors vous pouvez simplement le faire (en supposant que "Pseudo" est une propriété que vous avez ajouté à votre propre AppUser qui hérite de IdentityUser):
GetUserAsync(User)
va interroger la base de données pour récupérer les OrganizationId. En revanche, la solution retenue comprendra la OrganizationId dans les revendications (par exemple, cookie). L'avantage de tirer cette information à partir de la base de données est que les gens peuvent être déplacés entre les organisations, sans les obliger à logout/login. Bien sûr, l'inconvénient est qu'il nécessite un supplément de requête de base de données.Dhaust donne une bonne façon d'ajouter de la propriété à la ApplicationUser classe. En regardant les OP de code, il apparaît qu'ils peuvent avoir fait ceci ou étaient en voie de le faire. La question demande
Pawel donne un moyen d'ajouter une méthode d'extension qui nécessite l'utilisation de déclarations ou d'ajouter de l'espace de noms pour le web.fichier de configuration.
Cependant, la question vous demande si vous avez "besoin" d'étendre l'Utilisateur.L'identité d'inclure la nouvelle propriété. Il est une autre façon d'accéder à la propriété sans en étendre le bénéfice de l'Utilisateur.L'identité. Si vous avez suivi Dhaust méthode, vous pouvez alors utiliser le code suivant dans votre contrôleur pour accéder à la nouvelle propriété.
J'avais aussi ajouté sur ou étendue colonnes supplémentaires dans mon AspNetUsers table. Quand j'ai voulu simplement l'affichage de ces données, j'ai trouvé de nombreux exemples de code ci-dessus avec "Extensions", etc... - ce vraiment Ce qui m'a étonné, que vous avez eu à écrire toutes ces lignes de code pour obtenir un couple de valeurs à partir d'utilisateurs actuels.
Il s'avère que vous pouvez interroger l'AspNetUsers table comme tout autre tableau: