Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asp.Net Identity save user without email

I know this is old, but I disagree with the accepted answer, since the question is tagged as asp.net-identity-2. For the benefit of future readers, ASP.NET Identity 2.0 has a very simple solution to this problem:

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...
    }
}

In UserValidator<TUser>, the Task<IdentityResult> ValidateAsync(T item) implementation checks this flag and determines if it should run email validation:

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

Since you want to save users without an email address, this is how you should do it.

CAUTION: This should only be used when email addresses are not collected. If you want to collect and validate email addresses, but make them optional during registration, you should use a custom IIdentityValidator.


ASP Identity 2.2 can be set in App_Start\IdentityConfig.cs

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

Identity depends on email as a way to reset user password.

However, ignoring email is not simple, but possible. You'll need to implement Microsoft.AspNet.Identity.IIdentityValidator interface that ignores the lack of email:

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

And then in ApplicationUserManager assign your own implementation to property UserValidator.

If you really need this, you can get the original source code for UserValidator by decompiling Microsoft.AspNet.Identity.UserValidator class and peeking into the existing source code and removing cheecking for email.

However, I'm not sure how the rest of the framework will react on lack of email on user. Probably you'll get exceptions in other operations.


In startup file you can disable RequireUniqueEmail by access IdentityOptions configuration Also here you can change complexity of password , Lockout,...

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

            //x.Password.RequireUppercase = false; => other condition for identity

        });

you should use Microsoft.AspnetCore.Identity, address of doc here

Thank you @PBO and you can also change identity options like below

 services.AddDefaultIdentity<IdentityUser>(
            options=> { 
                options.SignIn.RequireConfirmedAccount = false;
                options.User.RequireUniqueEmail = false;
                options.Password.RequireUppercase = false;
            })
            .AddEntityFrameworkStores<BookShopDbContext>();