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.
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:
Accédez au dossier Models → Ouvrez IdentityModels.cs → ApplicationUser et ajoutez la propriété:
public string Code { get; set; }
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.
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.
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.
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; }
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>
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 };
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?
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:
J'espère que ça aide..
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; }
}