Asp.Net 没有电子邮件的身份保存用户
Asp.Net Identity save user without email
我想保存没有电子邮件的用户,像这样:
var user = new ApplicationUser { UserName = model.Name };
var result = await UserManager.CreateAsync(user);
但我收到错误 "Email cannot be null or empty"。有什么解决办法吗?还是不可能?
身份取决于电子邮件作为重置用户密码的方式。
然而,忽略电子邮件并不简单,但却是可能的。您需要实现忽略电子邮件缺失的 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
。
如果您真的需要这个,您可以通过反编译 Microsoft.AspNet.Identity.UserValidator
class 并查看现有源代码并删除电子邮件检查来获得 UserValidator
的原始源代码。
但是,我不确定框架的其余部分将如何对用户缺少电子邮件做出反应。可能你会在其他操作中得到异常。
我知道这是旧的,但我不同意接受的答案,因为问题被标记为 asp.net-identity-2。为了未来读者的利益,ASP.NETIdentity 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 Identity 2.2 可以设置在App_Start\IdentityConfig.cs
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
其实还有更好的办法。仅在您需要忽略它时更改验证,然后在完成后将其恢复。 (在这种情况下不要使用异步,因为另一个线程可能需要更新(?))
// 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
};
在启动文件中,您可以通过访问 IdentityOptions 配置来禁用 RequireUniqueEmail 您还可以在此处更改密码的复杂性、锁定...
services.Configure<IdentityOptions>(x =>
{
x.User.RequireUniqueEmail = false;
//x.Password.RequireUppercase = false; => other condition for identity
});
你应该使用 Microsoft.AspnetCore.Identity,文档地址 here
谢谢@PBO,您也可以像下面这样更改身份选项
services.AddDefaultIdentity<IdentityUser>(
options=> {
options.SignIn.RequireConfirmedAccount = false;
options.User.RequireUniqueEmail = false;
options.Password.RequireUppercase = false;
})
.AddEntityFrameworkStores<BookShopDbContext>();
如果有人还在为此苦苦挣扎...
设置options.User.RequireUniqueEmail=true,创建一个自定义用户验证器并在注册身份之前注册它。这将使电子邮件成为可选的,但仍然要求它在输入时是唯一的。
在 ConfigureServices(IServiceCollection 服务):
services.AddTransient<IUserValidator<ApplicationUser>, OptionalEmailUserValidator<MonotypeIdentityUser>>();
services.AddIdentity(...);
自定义用户验证器class:
public class OptionalEmailUserValidator<TUser> : UserValidator<TUser> where TUser : class
{
public OptionalEmailUserValidator(IdentityErrorDescriber errors = null) : base(errors)
{
}
public override async Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
{
var result = await base.ValidateAsync(manager, user);
if(!result.Succeeded && String.IsNullOrWhiteSpace(await manager.GetEmailAsync(user)))
{
var errors = result.Errors.Where(e => e.Code != "InvalidEmail");
result = errors.Count() > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
}
return result;
}
}
您可以通过编辑 App_Start 文件夹中的身份文件并将 RequireUniqueEmail 值更改为 False 以避免电子邮件验证器来创建不带电子邮件的用户帐户`
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false,
};
`
我想保存没有电子邮件的用户,像这样:
var user = new ApplicationUser { UserName = model.Name };
var result = await UserManager.CreateAsync(user);
但我收到错误 "Email cannot be null or empty"。有什么解决办法吗?还是不可能?
身份取决于电子邮件作为重置用户密码的方式。
然而,忽略电子邮件并不简单,但却是可能的。您需要实现忽略电子邮件缺失的 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
。
如果您真的需要这个,您可以通过反编译 Microsoft.AspNet.Identity.UserValidator
class 并查看现有源代码并删除电子邮件检查来获得 UserValidator
的原始源代码。
但是,我不确定框架的其余部分将如何对用户缺少电子邮件做出反应。可能你会在其他操作中得到异常。
我知道这是旧的,但我不同意接受的答案,因为问题被标记为 asp.net-identity-2。为了未来读者的利益,ASP.NETIdentity 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 Identity 2.2 可以设置在App_Start\IdentityConfig.cs
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
其实还有更好的办法。仅在您需要忽略它时更改验证,然后在完成后将其恢复。 (在这种情况下不要使用异步,因为另一个线程可能需要更新(?))
// 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
};
在启动文件中,您可以通过访问 IdentityOptions 配置来禁用 RequireUniqueEmail 您还可以在此处更改密码的复杂性、锁定...
services.Configure<IdentityOptions>(x =>
{
x.User.RequireUniqueEmail = false;
//x.Password.RequireUppercase = false; => other condition for identity
});
你应该使用 Microsoft.AspnetCore.Identity,文档地址 here
谢谢@PBO,您也可以像下面这样更改身份选项
services.AddDefaultIdentity<IdentityUser>(
options=> {
options.SignIn.RequireConfirmedAccount = false;
options.User.RequireUniqueEmail = false;
options.Password.RequireUppercase = false;
})
.AddEntityFrameworkStores<BookShopDbContext>();
如果有人还在为此苦苦挣扎...
设置options.User.RequireUniqueEmail=true,创建一个自定义用户验证器并在注册身份之前注册它。这将使电子邮件成为可选的,但仍然要求它在输入时是唯一的。
在 ConfigureServices(IServiceCollection 服务):
services.AddTransient<IUserValidator<ApplicationUser>, OptionalEmailUserValidator<MonotypeIdentityUser>>();
services.AddIdentity(...);
自定义用户验证器class:
public class OptionalEmailUserValidator<TUser> : UserValidator<TUser> where TUser : class
{
public OptionalEmailUserValidator(IdentityErrorDescriber errors = null) : base(errors)
{
}
public override async Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
{
var result = await base.ValidateAsync(manager, user);
if(!result.Succeeded && String.IsNullOrWhiteSpace(await manager.GetEmailAsync(user)))
{
var errors = result.Errors.Where(e => e.Code != "InvalidEmail");
result = errors.Count() > 0 ? IdentityResult.Failed(errors.ToArray()) : IdentityResult.Success;
}
return result;
}
}
您可以通过编辑 App_Start 文件夹中的身份文件并将 RequireUniqueEmail 值更改为 False 以避免电子邮件验证器来创建不带电子邮件的用户帐户`
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false,
};
`