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