Asp.Net Identity сохранить пользователя без электронной почты

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

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

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

4 ответов


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

однако игнорировать электронную почту не просто, но возможно. Вам нужно будет реализовать 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 class и заглядывание в существующий исходный код и удаление cheecking по электронной почте.

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


Я знаю, что это старый, но я не согласен с принятым ответом, так как вопрос помечен как 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.


идентификатор ASP 2.2 может быть установлен в App_Start\IdentityConfig.cs

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

на самом деле есть лучший способ. Измените проверку только тогда, когда вам нужно игнорировать ее, а затем восстановите ее, когда закончите. (Не используйте 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
};