我想存储一些额外的用户信息。根据我的理解,以下是通常的选择:
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中的信息。如果是这样,那么任何人都有这方面的任何例子。
答案 0 :(得分:13)
在一天结束时,您的已登录用户将转换为存储在ClaimsIdentity中的一系列声明,这些声明代表您在HttpContext.User.Identity中的用户。您可以选择将FirstName / LastName存储为用户表中的列,然后您可以显式读出并转换为相应的声明(如果需要),或者您可以将它们直接存储为AspnetUserClaims表中的声明(仅存储它们)作为两个字符串列,默认情况下会自动添加到您的用户的声明标识中。这两种方法或多或少都是等价的,所以它取决于个人偏好。
顺便说一句,你想要在用户的ClaimsIdentity中使用这些内容的唯一原因是,如果你想保存数据库命中只是为了显示名称,并且总是在ClaimsIdentity中使用FirstName / LastName声明。如果您获取用户,并使用user.FirstName,那么生成名称声明也没有多大价值。
答案 1 :(得分:4)
除了@Hao Kung,当索赔要求超过浏览器允许的Cookie容量时,索赔信息可能会被削减。
根据Thinktecture Identity Server article,默认AspNet身份的着名替代方案之一,如下所述。
一旦您的申请变得复杂,处理的索赔数量也会变得复杂。默认情况下,所有声明都存储为会话cookie的一部分,而像Safari这样的浏览器会对cookie的大小施加限制。所以有一天,当您向应用程序添加更多声明时,您将开始获得序列化错误。那是因为只有部分cookie会被发送回服务器而服务器不知道如何处理它。因此,此问题的解决方案是在“参考”模式下创建安全令牌。这意味着将令牌存储在服务器上,并将参考会话ID存储为cookie。见下图。 cookie大小只有几个字节:
答案 2 :(得分:0)
在ApplicationUser
中保存信息(声明)时,每个用户都将有一个占位符(数据库中的列)以获取此信息,并且您将能够保存0(null
)或1个值。如果需要一种新型信息,则需要一个新列。
另一方面,在AspNetUserClaims
表中保存信息(声明)意味着仅在需要时才保存该信息,您可以拥有多个相同类型的声明,并且可以添加新的声明随时无需接触数据模型。
示例:
让我们考虑一项索赔is_top_1percent_of_whatever
。如果基础数据保存在ApplicationUser
中,则99%的用户将具有null
或false
条目。
对于声明high_school_name
,如果将其保存在ApplicationUser
中,则您只能记录1个中学名...如果用户去了2个不同的学校,则无法记录此信息。如果保存在AspNetUserClaims
中,则可以根据需要记录每位用户的高中学习次数。
与前面的示例有关,假设您拼出了明确的声明,例如is_interested_in_sport
,is_interested_in_camping
。您想要is_interested_in_fishing
的那一天,您将不得不更改数据库模型存储在ApplicationUser
中,或者仅添加一条记录(如果存储在AspNetUserClaims
中)。对于持久保留从外部提供商处收到的索赔也是如此。