web-dev-qa-db-fra.com

Comment étendre IdentityUser avec une propriété personnalisée

J'utilise asp.net 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 une propriété personnalisée:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
    {
       CookieAuthenticationOptions.AuthenticationType
       var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
       return userIdentity;
    }
    //My extended property
    public string Code { get; set; }
}

Lorsque j'enregistre un nouvel utilisateur, je passe la propriété personnalisée Code dans la RegisterBindingModel mais je ne sais pas comment insérer cette propriété personnalisée dans la table WebUsers.

J'ai fait comme ci-dessous, mais il n'insère pas réellement cette propriété dans la table avec le nom d'utilisateur et le mot de passe.

var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };

Et toute la fonction:

[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var userName = !string.IsNullOrEmpty(model.UserName) ? model.UserName : model.Email;
        //I set it here but it doesn't get inserted to the table.
        var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }

        return Ok();
    }

Qu'est-ce que je rate? Je regardais des questions similaires mais je n'ai pas trouvé de réponse à cela.

22
user3378165

Si vous suivez toutes les étapes d'ajout d'un champ personnalisé à l'utilisateur, vous terminerez les tâches avec succès.

Voici toutes les étapes pour ajouter un champ personnalisé à l'utilisateur:

  1. Créez une Application Web ASP.NET
  2. Assurez-vous de sélectionner [~ # ~] mvc [~ # ~] et le Authentification est Comptes d'utilisateurs individuels
  3. Accédez au dossier Models → Ouvrez IdentityModels.cs ApplicationUser et ajoutez la propriété:

    public string Code { get; set; }
    
  4. Construire le projet
  5. Allez dans [~ # ~] outils [~ # ~] menu → Nuget Package Manager → cliquez Console du gestionnaire de package
  6. Tapez Enable-Migrations et appuyez sur Enter et attendez que la tâche soit terminée. Vous verrez une réponse qui dit:

       Checking if the context targets an existing database...
       Code First Migrations enabled for project WebApplication1.
    
  7. Tapez Add-Migration "Code" et appuyez sur Enter et attendez que la tâche soit terminée. Vous verrez une réponse qui dit:

    Scaffolding migration 'Code'. The Designer Code for this migration
    file includes a snapshot of your current Code First model. This
    snapshot is used to calculate the changes to your model when you
    scaffold the next migration. If you make additional changes to your
    model that you want to include in this migration, then you can
    re-scaffold it by running 'Add-Migration Code' again.
    
  8. Tapez Update-Database et appuyez sur Enter et attendez que la tâche soit terminée. Vous verrez une réponse qui dit:

    Specify the '-Verbose' flag to view the SQL statements being applied 
    to the target database.
    Applying explicit migrations: [201611132135242_Code].
    Applying explicit migration: 201611132135242_Code.
    Running Seed method.
    

    À cette étape, si vous actualisez Explorateur d'objets SQL Server et accédez à la base de données et consultez les tables, sous dbo.AspNetUsers sous les colonnes, vous verrez le champ Code. Si vous ne saviez pas quelle base de données ou même quel serveur rechercher, ouvrez le fichier Web.Config et jetez un œil à la chaîne de connexion qui ressemble à ceci:

    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20161114125903.mdf;Initial Catalog=aspnet-WebApplication1-20161114125903;Integrated Security=True"
    providerName="System.Data.SqlClient" />
    

    Vous pouvez voir la source de données (qui est une instance de serveur SQL) et quelque chose .mdf qui est le nom de la base de données.

  9. Accédez au dossier Modèles → Ouvrez AccountViewModels.cs fichier → RegisterViewModel classe et ajoutez cette propriété: (Dans APIv2 avec EF6 , vous pouvez ajouter la ligne ci-dessous dans le dossier Modèles → fichier AccountBindingModels → classe RegisterBindingModel)

    public string Code { get; set; }
    
  10. Accédez au dossier Vues Compte dossier → Ouvrez le fichier Register.cshtml et ajoutez ce code à proximité d'autres champs, par exemple sous le mot de passe:

    <div class="form-group">
        @Html.LabelFor(m => m.Code, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Code, new { @class = "form-control" })
        </div>
    </div>
    
  11. Allez dans le dossier Contrôleurs → Ouvrez le fichier AccountController.cs → dans la publication http Enregistrez-vous action, changez la ligne qui crée l'utilisateur pour ça:

    var user = new ApplicationUser { UserName = model.Email, Email = model.Email,
        Code= model.Code };
    
  12. Exécutez le projet et accédez à /Account/Register url et enregistrez un nouvel utilisateur. Après avoir enregistré l'utilisateur, si vous accédez à nouveau à la base de données et à la table Voir les données de dbo.AspNetUsers, vous verrez que le code a été enregistré.

Télécharger

Vous pouvez cloner ou télécharger un exemple de travail ici:

Pour en savoir plus - Comment ajouter une propriété personnalisée à IdentityRole?

Si vous souhaitez savoir comment ajouter une nouvelle propriété à IdentityRole, jetez un œil à Comment ajouter une propriété personnalisée à IdentityRole?

58
Reza Aghaei

J'espère que cela pourrait aider les autres, car le message d'origine a plus de 1 an

Si vous avez déjà créé le projet avec 'Authentification Comptes d'utilisateurs individuels:

Dans l'Explorateur de solutions, accédez à projet> Modèles> IdentityModels.cs

sous public class ApplicationUser: IdentityUser (devrait être la première classe).

Ajoutez vos propriétés personnalisées après public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) comme mon exemple ci-dessous:

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;
    }
    **//add custom properties here - these are just examples**
    public bool SendEmails { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Ensuite, en utilisant NuGet Packagemanager:

  • enable-migrations (si vous ne l'avez pas déjà fait)
  • ajouter-migration [entrer]
  • nameYourMigration [entrer]
  • (affichez le fichier de migration pour vérifier que vos propriétés vont être ajoutées)
  • update-database [entrer]
  • Vérifiez votre table de base de données AspNetUsers pour vous assurer que les propriétés ont été ajoutées correctement

J'espère que ça aide..

6
ceterisdev

Je pense que le principal problème est que vous n'enregistrez pas les nouvelles revendications dans la classe ApplicationUser.

J'avais le même problème et je l'ai résolu avec quelques lignes après le CreateIdentityAsync.

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
    {
       CookieAuthenticationOptions.AuthenticationType
       var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);

       // Add custom user claims here
        userIdentity.AddClaim(new Claim("Code",this.Code));
       return userIdentity;
    }
    //My extended property
    public string Code { get; set; }
}
0
Salvador Nava