2015-01-12 5 views
20

Я хочу, чтобы сохранить пользователь без электронной почты, как это:Asp.Net Идентичность сохранить пользователь без электронной почты

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

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

ответ

6

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

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

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

68

Я знаю, что это старый, но я не согласен с принятым ответом, так как вопрос помечен как asp.net-identity-2. В интересах будущих читателей, ASP.NET Идентичность 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.

+2

Плюс один для вашего аватара. ... и правильный ответ на вопрос, конечно! :) –

21

ASP Идентичность 2.2 может быть установлена ​​в App_Start\IdentityConfig.cs

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

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

Это действительно очень плохая идея. Что произойдет, если два человека будут обновлять своего пользователя одновременно? [Состояние гонки] (https://en.wikipedia.org/wiki/Race_condition) вот что. Почему бы вам просто не задавать это один раз при запуске, как все говорят? – Liam

+0

Что делать, если я хочу сохранить электронную почту и связанные с ней поля, которые теперь находятся в AspNetUsers в отдельной таблице? То же самое с телефонными полями? – muybn

Смежные вопросы