【问题标题】:Is there any benefit to storing user information in AspNetUserClaims with Asp.Net Identity 2?使用 Asp.Net Identity 2 在 AspNetUserClaims 中存储用户信息有什么好处吗?
【发布时间】:2014-06-06 14:23:36
【问题描述】:

我想存储一些额外的用户信息。据我了解,以下是通常的选择:

public class ApplicationUser : IdentityUser {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
        public string FirstName { get; set; }
        public string LastName { get; set; }

    }

这里添加了 FirstName 和 LastName,它们将作为附加字段出现在 AspNetUsers 表中。

但是,现在使用 Asp.Net Identity 似乎还有一个选项可以将此类信息存储在 AspNetUserClaims 表中。

谁能给我解释一下。展望未来,这种信息可以存储在 AspNetUserClaims 中。如果是这样,那么有没有人有这方面的任何例子。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-web-api2


    【解决方案1】:

    在一天结束时,您的登录用户将转换为存储在 ClaimsIdentity 中的一系列声明,该声明在 HttpContext.User.Identity 中代表您的用户。您可以选择将 FirstName/LastName 作为列存储在用户表中,然后您可以显式读出并转换为适当的声明(如果需要),或者您可以将它们直接存储为 AspnetUserClaims 表中的声明(仅存储它们作为两个字符串列),默认情况下会自动添加到用户的声明身份中。不过,这两种方法或多或少是等效的,因此取决于个人喜好。

    顺便说一句,您希望这些在用户的 ClaimsIdentity 中的唯一原因是,如果您想保存一个 db 命中只是为了显示名称,并始终在 ClaimsIdentity 中使用 FirstName/LastName 声明。如果您获取用户并改用 user.FirstName,那么生成名称声明也没有多大价值。

    【讨论】:

    • 感谢您的回复。您能告诉我,您是否有任何显示 ASP.NET Identity 2 用法的新示例?我确实从 nuget 下载了 beta 样本,但我想知道你是否知道其他人。谢谢。
    【解决方案2】:

    除了@Hao Kung,当索赔将超过浏览器允许的Cookie容量时,可以修剪索赔信息。

    根据Thinktecture Identity Server article,默认 AspNet Identity 的著名替代方案之一,它说如下。

    一旦您的应用程序变得复杂,要处理的索赔数量也会随之增加。默认情况下,所有声明都存储为会话 cookie 的一部分,并且 Safari 等浏览器对 cookie 的大小施加了限制。所以有一天,当您向应用程序添加更多声明时,您将开始收到序列化错误。这是因为只有部分 cookie 会被发送回服务器,而服务器不知道如何处理它。所以这个问题的解决方案是在“参考”模式下创建安全令牌。这意味着将令牌存储在服务器上,并将参考会话 ID 存储为 cookie。见下图。 cookie 大小只有几个字节:

    【讨论】:

      【解决方案3】:

      ApplicationUser 中保存信息(声明)时,每个用户都会有一个用于该信息的占位符(数据库中的一列),您将能够保存 0 (null) 或 1 个值。如果需要新类型的信息,您将需要一个新列。

      另一方面,在AspNetUserClaims 表中保存信息(声明)意味着仅在需要时才保存信息,您可以拥有多个相同类型的声明,并且您可以随时添加新声明无需接触数据模型的时间。

      示例:

      让我们考虑一个声明is_top_1percent_of_whatever。如果底层数据保存在ApplicationUser中,99%的用户会有nullfalse条目。

      对于high_school_name的索赔,如果它保存在ApplicationUser,则只能记录1个高中名称...如果用户去了2个不同的学校,则无法记录此信息。如果保存在AspNetUserClaims,您可以根据需要记录每个用户的高中数量。

      与前面的示例相关,假设您拼写出明确的声明,例如 is_interested_in_sportis_interested_in_camping。您想要is_interested_in_fishing 的那一天,您必须更改存储在ApplicationUser 中的数据库模型,或者如果存储在AspNetUserClaims 中,则只需添加一条记录。这也适用于从外部提供者收到的持久声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多