Asp.net-Core
在 Asp.Net Core Identity 中需要唯一的電話號碼
在 Asp.Net Core Identity 框架中,我可以通過設置 RequireUniqueEmail = true 輕鬆要求唯一的電子郵件地址。
有沒有辦法對使用者的電話號碼做同樣的事情?請注意,我不想要求確認的電話號碼才能登錄。使用者不需要輸入電話號碼,但如果輸入,它必須是唯一的。
你可以試試這個,基本上首先在 Db 級別執行它,然後在 Manager 級別執行適當的檢查。
在 DbContext,我聲明了使用者名和電子郵件屬性的索引和唯一性。
// ================== Customizing IdentityCore Tables ================== // builder.Entity<User>().ToTable("Users").Property(p => p.Id).HasColumnName("Id").ValueGeneratedOnAdd(); builder.Entity<User>(entity => { entity.HasIndex(u => u.UserName).IsUnique(); entity.HasIndex(u => u.NormalizedUserName).IsUnique(); entity.HasIndex(u => u.Email).IsUnique(); entity.HasIndex(u => u.NormalizedEmail).IsUnique(); entity.Property(u => u.Rating).HasDefaultValue(0).IsRequired(); entity.HasMany(u => u.UserRoles).WithOne(ur => ur.User) .HasForeignKey(ur => ur.UserId).OnDelete(DeleteBehavior.Restrict); entity.HasMany(u => u.UserClaims).WithOne(uc => uc.User) .HasForeignKey(uc => uc.UserId).OnDelete(DeleteBehavior.Restrict); });對於經理級別的程式碼:
/// <summary> /// Sets the <paramref name="email"/> address for a <paramref name="user"/>. /// </summary> /// <param name="user">The user whose email should be set.</param> /// <param name="email">The email to set.</param> /// <returns> /// The <see cref="Task"/> that represents the asynchronous operation, containing the <see cref="IdentityResult"/> /// of the operation. /// </returns> public override async Task<IdentityResult> SetEmailAsync(User user, string email) { var dupeUser = await FindByEmailAsync(email); if (dupeUser != null) { return IdentityResult.Failed(new IdentityError() { Code = "DuplicateEmailException", // Wrong practice, lets set some beautiful code values in the future Description = "An existing user with the new email already exists." }); } // Perform dupe checks // Code that runs in SetEmailAsync // Adapted from: aspnet/Identity/blob/dev/src/Core/UserManager.cs // // ThrowIfDisposed(); // var store = GetEmailStore(); // if (user == null) // { // throw new ArgumentNullException(nameof(user)); // } // await store.SetEmailAsync(user, email, CancellationToken); // await store.SetEmailConfirmedAsync(user, false, CancellationToken); // await UpdateSecurityStampInternal(user); //return await UpdateUserAsync(user); return await base.SetEmailAsync(user, email); }這樣,我們保留了 .NET Core 身份程式碼的完整性,同時強制執行我們想要的屬性的唯一性。
請注意,上述範例目前適用於電子郵件。只需執行相同操作,然後在 UserManager.cs 上處理 SetPhoneNumberAsync,而不是修改 SetEmailAsync。
最簡單的方法可能是簡單地在控制器中搜尋電話號碼……
bool IsPhoneAlreadyRegistered = _userManager.Users.Any(item => item.PhoneNumber == model.PhoneNumber);