Asp.net-Core

在 Asp.Net Core Identity 中需要唯一的電話號碼

  • February 22, 2022

在 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);

引用自:https://stackoverflow.com/questions/48102263