2014-11-02 78 views
1

Asp.Net Identity Manager 2中的UserManager通過對數據庫的附加請求來防止創建具有重複用戶名的用戶,以查找可能的重複。我認爲這很容易出錯,並可能導致併發錯誤。正確的機制應該依靠唯一的約束或索引。我錯了嗎?我錯過了什麼?Asp.Net Identity 2重複的用戶名檢查

鏈接到源: CreateAsyncValidateUserName

+0

實體框架必須支持多個數據存儲,而不是簡單的基於數據庫的存儲。因此,它需要以適用於任何類型商店的方式驗證唯一性。例如,你可能有一個基於XML的商店。你會如何執行獨特的約束呢? – 2014-11-02 23:29:07

+0

但是,查看鏈接到的代碼..它使用自定義的「UserValidator」對象,如果Validator知道它正在使用能夠使用唯一constratraints的數據存儲,則它可以簡單地返回true以進行任何重複檢查碼。 – 2014-11-02 23:33:44

回答

3

不,你沒有錯。和身份添加唯一索引上用戶名柱:

Tables generated by Identity

而且該表的遷移代碼是:

 CreateTable(
      "dbo.AspNetUsers", 
      c => new 
       { 
        Id = c.String(nullable: false, maxLength: 128), 
         /* .... SNIP .... */ 
        UserName = c.String(nullable: false, maxLength: 256), 
       }) 
      .PrimaryKey(t => t.Id) 
      .Index(t => t.UserName, unique: true, name: "UserNameIndex"); 

唯一索引的列明確規定。

p.s.你正在看Identity v3 - 它沒有發佈。目前的身份V2.1還沒有開源。

+0

儘管Identity框架確實可以在基於EF的模型中實施唯一的約束,但請記住,Identity的設計是可擴展的並且可以與任何類型的存儲一起使用..因此,無論它是否使用唯一約束,框架本身仍然必須做一些事情效率低下才能更具可擴展性。 – 2014-11-02 23:30:45

+0

當然。目前'Identity.Core'不會在交易級別強制使用用戶名的唯一性,但是這依賴於'IUserStore'實現來完成。當身份使用EF時,將實現唯一索引。我認爲事務性檢查對創建用戶不是很重要。 – trailmax 2014-11-02 23:38:23