ASP.NET身份验证的用户ID是顺序GUID吗?

4

针对MVC / EF的ASP.NET Identity代码将userid存储为nvarchar(128)。 它看起来像一个GUID。 我更喜欢使用顺序GUID作为ID /私钥以提高性能。 我如何验证为ASP.NET Identity生成GUID的代码是连续的? 我无法找到代码库中的那部分。


4
你可以使用Int32代替GUID,为什么还要担心性能?如果它是表中的主键,那么它已经被索引了。 - Ofiris
1
很可能是由数据库生成的。无论如何,由于潜在的冲突,它可能不会是连续的。让它连续并不能真正提高性能。 - Casey
1
请不要说连续的Guid不会提高性能:https://dev59.com/lnVC5IYBdhLWcg3w1E1q。您可以阅读此问题。 - mybirthname
@mybirthname 很好。实际上,这个问题指出了关于newsequentialid的事情,这让我想起来了——如果你正在使用SQL Server,EF实际上会使用newsequentialid生成数据库,但如果你正在使用Azure,则不会生成(因为存在并发问题)。所以这可能回答了OP的问题——如果他正在使用传统的MSSQL,它将(可能)是顺序的。 - Casey
2个回答

2

Identity被设计用于与不同的持久化技术一起使用。我甚至见过Identity实现将数据存储在Azure表上,这并不是关系数据库。

Sequential GUID只是SQL Server的一个功能,而且并不是每个版本的SQL Server都支持Sequential GUID(例如,SQL Azure不知道Sequential GUID)。

但是,如果将User.Id设置为Guid类型并使用支持顺序ID的SQL Server,则将创建具有sequentialguid类型ID的表。
我可以验证这一点-我曾经因类型问题多次尝试将本地创建的DB移植到Azure SQL时遇到麻烦。

更新

我的建议是将ID更改为Guid - 与其他建议将其更改为int相同 - 您可以在网上找到很多如何执行此操作的指南。生成ID的位置在此处:

namespace Microsoft.AspNet.Identity.EntityFramework
{
  /// <summary>
  /// Default EntityFramework IUser implementation
  /// 
  /// </summary>
  public class IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
  {
    public IdentityUser()
    {
      this.Id = Guid.NewGuid().ToString();
    }

    public IdentityUser(string userName)
      : this()
    {
      this.UserName = userName;
    }
  }
}

这是反编译框架的一部分。你很可能已经继承了这个类来创建自己的“ApplicationIdetntityUser”。
然而,如果你非常想使用连续的GUID,最安全的方法是让SQL Server为你创建它们。你可以通过在用户对象的“Guid Id”属性上添加“[DatabaseGenerated(DatabaseGeneratedOption.Identity)]”来实现。
你可以自己生成连续的GUID,但最终你会遇到不同线程之间的冲突。我建议你不要浪费时间,让SQL Server来完成这个工作——那里有内置的机制。

你说要将User.Id设置为Guid...这与其他将其更改为int类型的指令相同吗?看起来EF Code First生成了id值。这意味着MSSQL可能没有生成id字段...这意味着某个代码片段正在生成id。我正在寻找那段代码。 - Bill

2

Trailmax已经触及了大部分主要点,但在可用时切换到顺序Guid是我们一直在考虑为Identity 3.0的默认EF身份实现所做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接