2014-11-02 80 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