Asp.Net Identity无需电子邮件即可保存用户

时间:2015-01-12 15:19:58

标签: c# asp.net-identity-2

我想在没有电子邮件的情况下保存用户,如下所示:

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

但我收到错误“电子邮件不能为空或空”。这有什么解决方案吗?或者这是不可能的?

5 个答案:

答案 0 :(得分:76)

我知道这是旧的,但我不同意接受的答案,因为这个问题被标记为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

答案 1 :(得分:28)

可以在App_Start\IdentityConfig.cs

中设置ASP Identity 2.2
    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = false
    };

答案 2 :(得分:7)

身份取决于电子邮件作为重置用户密码的方式。

然而,忽略电子邮件并不简单,但可能。您需要实现忽略缺少电子邮件的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类并查看现有源代码并删除电子邮件的cheecking来获取Microsoft.AspNet.Identity.UserValidator的原始源代码。

但是,我不确定框架的其余部分将如何对用户缺少电子邮件做出反应。可能你会在其他操作中获得例外。

答案 3 :(得分:0)

实际上还有更好的方法。在需要忽略它时更改验证,然后在完成后将其恢复。 (在这种情况下不要使用异步,因为另一个线程可能需要更新(?))

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

答案 4 :(得分:0)

在启动文件中,您可以通过访问IdentityOptions配置禁用RequireUniqueEmail。在这里,您还可以更改密码,锁定,...的复杂性

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

        });