2015-01-12 6 views
20

せずにユーザーを保存します。Asp.Netアイデンティティは、私がこのように、電子メールせずにユーザーを保存したいメール

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

しかし、私は、「メールがnullまたは空にすることはできません」エラーを得ました。これにはどんな解決策がありますか?それとも不可能ですか?

答えて

6

IDは、ユーザーのパスワードをリセットする方法として電子メールによって異なります。

ただし、電子メールを無視するのは簡単ではありませんが、可能です。

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.IIdentityValidatorインタフェースを実装する必要があります。

Microsoft.AspNet.Identity.UserValidatorクラスを逆コンパイルして、既存のソースコードを参照して電子メールのチクチクを取り除いて、元のソースコードをUserValidatorにすることができます。

しかし、私はフレームワークの残りの部分がユーザーの電子メールの欠如にどのように反応するかはわかりません。他の操作で例外が発生する可能性があります。

68

私はこれが古いと知っていますが、質問にはasp.net-identity-2とタグ付けされているため、受け入れられた回答には同意しません。 、UserValidator<TUser>

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

Task<IdentityResult> ValidateAsync(T item)実装チェックこのフラグをし、それが電子メールの検証を実行する必要があるかどうかを判断:将来の読者の利益のために、ASP.NETアイデンティティ2.0は、この問題に非常に簡単な解決策を持っている

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

メールアドレスを持たないユーザーを保存したいので、これを行う必要があります。

注意:これは、電子メールアドレスが収集されない場合にのみ使用してください。電子メールアドレスを収集して検証するが、登録時にオプションにする場合は、IIdentityValidatorというカスタムを使用する必要があります。

+2

さらにあなたのアバターのために1つ。 ...そして質問への正解、もちろん! :) –

21

ASPアイデンティティ2.2はApp_Start\IdentityConfig.cs

manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
    { 
     AllowOnlyAlphanumericUserNames = false, 
     RequireUniqueEmail = false 
    }; 
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 
}; 
+0

これは本当に本当に悪い考えです。 2人のユーザーが同時にユーザーを更新するとどうなりますか? [人種条件](https://en.wikipedia.org/wiki/Race_condition)それは何ですか。他の誰もが示唆するように、起動時にこれを設定するのはなぜですか? – Liam

+0

電子メールとそれに関連するフィールドをAspNetUsersに別のテーブルで保存するとどうなりますか?電話のフィールドと同じですか? – muybn

関連する問題