Подтвердить что ты не робот

Asp.Net Identity сохраняет пользователя без email

Я хочу сохранить пользователя без электронной почты, например:

var user = new ApplicationUser { UserName = model.Name };
var result = await UserManager.CreateAsync(user);

Но я получил ошибку "Электронная почта не может быть пустой или пустой". Есть ли решение для этого? Или это невозможно?

4b9b3361

Ответ 1

Идентификация зависит от электронной почты как способ пароля пользователя reset.

Однако игнорирование электронной почты не просто, но возможно. Вам нужно будет реализовать интерфейс Microsoft.AspNet.Identity.IIdentityValidator, который игнорирует отсутствие электронной почты:

namespace Microsoft.AspNet.Identity
{
  /// <summary>
  /// Used to validate an item
  /// 
  /// </summary>
  /// <typeparam name="T"/>
  public interface IIdentityValidator<in T>
  {
    /// <summary>
    /// Validate the item
    /// 
    /// </summary>
    /// <param name="item"/>
    /// <returns/>
    Task<IdentityResult> ValidateAsync(T item);
  }
}

И затем в ApplicationUserManager присвойте свою собственную реализацию свойству UserValidator.

Если вам это действительно нужно, вы можете получить исходный код для UserValidator, декомпилировав Microsoft.AspNet.Identity.UserValidator класс и заглянув в существующий исходный код и удалив cheecking для электронной почты.

Однако я не уверен, как остальная часть структуры будет реагировать на отсутствие электронной почты для пользователя. Вероятно, вы получите исключения в других операциях.

Ответ 2

Я знаю, что это старо, но я не согласен с принятым ответом, так как вопрос помечен как asp.net-identity-2. Для будущих читателей ASP.NET Identity 2.0 имеет очень простое решение этой проблемы:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    ...snip...
    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            // This disables the validation check on email addresses
            RequireUniqueEmail = false
        };
        ...snip...
    }
}

В UserValidator<TUser> реализация Task<IdentityResult> ValidateAsync(T item) проверяет этот флаг и определяет, должен ли он запускать проверку электронной почты:

if (this.RequireUniqueEmail)
{
    await this.ValidateEmail(item, list);
}

Поскольку вы хотите сохранить пользователей без адреса электронной почты, вот как вы должны это делать.

ПРЕДОСТЕРЕЖЕНИЕ. Это следует использовать только тогда, когда адреса электронной почты не собираются. Если вы хотите собирать и проверять адреса электронной почты, но сделать их необязательными во время регистрации, вы должны использовать пользовательский IIdentityValidator.

Ответ 3

ASP Identity 2.2 можно установить в App_Start\IdentityConfig.cs

    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = false
    };

Ответ 4

На самом деле есть лучший способ. Измените проверку только тогда, когда вам нужно проигнорировать ее, а затем восстановить ее, когда закончите. (Не используйте async в этом случае, потому что другой поток может потребоваться обновить (?))

// first create/update the identity!!! 
user.PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password); //hash and update directly

// alter
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = false
};

var result = UserManager.Update(user);

// restore... 
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = true
};

Ответ 5

В файле запуска вы можете отключить RequireUniqueEmail путем доступа к конфигурации IdentityOptions Также здесь вы можете изменить сложность пароля, блокировки,...

  services.Configure<IdentityOptions>(x =>
        {
            x.User.RequireUniqueEmail = false;

        });