Chcę utworzyć aplikację w MVC przy użyciu programu Identity Framework 1.0, który umożliwia użytkownikom rejestrowanie się przy użyciu tej samej nazwy użytkownika, jakiej użył inny użytkownik.Jak zezwolić użytkownikowi na rejestrację z powieloną nazwą użytkownika za pomocą aplikacji Identity Framework 1.0
Podczas usuwania użytkownika chcę ustawić jego właściwość niestandardową na wartość true, zamiast usuwać użytkownika z bazy danych. W tym przypadku inny użytkownik może użyć UserName
użytkownika, którego IsDeleted
jest ustawiony na true.
Ale domyślna metoda UserManager.CreateAsync(user, password);
uniemożliwia wykonanie tej czynności.
miałem nadpisane metody IdentityDbContext
ValidateEntity
jak ten
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
if ((entityEntry != null) && (entityEntry.State == EntityState.Added))
{
ApplicationUser user = entityEntry.Entity as ApplicationUser;
if ((user != null) && this.Users.Any<ApplicationUser>(u => string.Equals(u.UserName, user.UserName) && u.IsDeleted==false))
{
return new DbEntityValidationResult(entityEntry, new List<DbValidationError>()) {
ValidationErrors = {
new DbValidationError("User", string.Format(CultureInfo.CurrentCulture,
"", new object[] { user.UserName }))
}
};
}
IdentityRole role = entityEntry.Entity as IdentityRole;
if ((role != null) && this.Roles.Any<IdentityRole>(r => string.Equals(r.Name, role.Name)))
{
return new DbEntityValidationResult(entityEntry, new List<DbValidationError>()) {
ValidationErrors = {
new DbValidationError("Role", string.Format(CultureInfo.CurrentCulture,
"", new object[] { role.Name })) } };
}
}
return base.ValidateEntity(entityEntry, items);
}
Oto moja metoda rejestrze, w którym użytkownik jest tworzony
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.UserName, Email = model.Email.ToLower(), CreatedBy = model.UserName, CreatedDate = DateTime.UtcNow, };
user.ConfirmedEmail = false;
var result = await _accountService.CreateAsync(user, model.Password);
if (result.Succeeded)
{
TempData["MessageConfirm"] = user.Email;
return RedirectToAction("Confirm", "Account");
}
else
{
AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
ValidateEntity
metody powinny być wykonywane, gdy await _accountService.CreateAsync(user, model.Password);
wykonany. Ale wykonuje się po tym, jak metoda register
zakończy jego wykonywanie. Więc wynik rzuca błąd.
Jakieś sugestie, jak mogę to osiągnąć?
Nazwy użytkowników ** muszą ** być unikatowe! Jaki problem próbujesz rozwiązać! –
Nie chcę, aby nazwa użytkownika była unikalna. – Twix
Ponieważ nazwa użytkownika jest odpowiednikiem klucza podstawowego i jest jedynym identyfikatorem dla użytkownika, musi ** musi być unikalna. Nie masz wyboru. Jak inaczej rozróżniać użytkowników. Więc, jaki jest podstawowy problem, który próbujesz rozwiązać? –