【问题标题】:How is IIdentity identity implementedIIdentity 身份是如何实现的
【发布时间】:2014-01-13 18:10:30
【问题描述】:

我有一个关于 IIdentity 身份的问题,通常在网络应用中你可以说:

 HttpContext.Current.User.Identity.

它有几个属性,您可以轻松检索,非常方便。

所以我有两个问题:

1) 我正在使用 ASP.NET Identity(不是会员资格),但是当我尝试扩展 HttpContext.Current.User.Identity

public static int GetUserAge(this IIdentity identity){}

要导入:我必须使用的 IIdentity 身份,使用 System.Security.Principal;,但它与 Microsoft.AspNet.Identity 在同一个包中吗?

2) 默认情况下,User.Identity.Name / User.Identity.Id, / User.Identity.GerUserId() 等方法和属性是如何实现的?每次执行都会去数据库检索吗?或者它保存在会话中或......?

因为我想创建一个扩展并以与默认情况下或多或少相同的方式工作......

【问题讨论】:

  • 如果我没记错的话。 IIdentity 是 system.security.principal 的一方。 IIdentity 的默认实现在 Microsoft.AspNet.Identity 中。所以像 Identity : IIdentity 这样的类在 Microsoft.AspNet.Identity 中。第二个问题,我相信这取决于您的会员资格提供商以及用户信息的来源。 SqlAspnetMembershipProvider 将运行查询以获取用户信息。如果您是 web.config 中的硬编码用户,那么我相信它会在应用程序加载时将其加载到内存中。
  • 是的,它们来自数据库

标签: c# extension-methods asp.net-identity


【解决方案1】:

所以 AspNet.Identity 只是添加了扩展方法,这些方法提供语法糖以隐藏将 IIdentity 转换为 ClaimsIdentity 并将两种声明类型映射到辅助方法 getter。

GetUserName() => ClaimTypes.Name
GetUserId() => ClaimTypes.NameIdentifier.

【讨论】:

  • 不是一个真正的答案,因为我想知道它是如何得到的?我的意思是每次都为该信息排队数据库还是...?我的意思是如果在每个页面上我要执行 .Identity.GetUserId(),那么它会不会每次都去数据库获取它并显示......这意味着每次用户引用时都会有一次到 db 的往返跨度>
  • 用户 ID 存储在身份声明中,因此不需要往返数据库。
  • 因此,如果我想进行另一个扩展,例如检索名称,我是否应该或多或少地以相同的方式实现它并将用户显示名称存储在声明中?声明存储在哪里?
  • 声明从数据库生成并存储在登录 cookie 中。因此,您可以通过 ClaimsIdentityFactory 修改用户生成的声明,这些声明将显示在 ClaimsIdentity 中
猜你喜欢
  • 2011-08-17
  • 2011-11-03
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2018-04-09
  • 2019-04-11
相关资源
最近更新 更多