2015-01-12 37 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

如果你真的需要這個,你可以通過反編譯Microsoft.AspNet.Identity.UserValidator類並偷看到現有的源代碼並刪除電子郵件的cheecking得到UserValidator的原始源代碼。

不過,我不知道如何框架的其餘部分將在沒有用戶的電子郵件的反應。可能你會在其他操作中遇到異常。

68

我知道這是老了,但我不同意接受的答案,因爲這個問題被標記爲asp.net身份-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

其實有更好的方法來設置。在您需要忽略它時修改驗證,然後在完成時將其恢復。 (不要在這種情況下使用異步,因爲另一個線程可能需要更新(?))

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

相關問題