【问题标题】:What does Principal.Identity.GetUserId<int>() return?Principal.Identity.GetUserId<int>() 返回什么?
【发布时间】:2017-01-03 16:57:57
【问题描述】:

我遇到了以下代码,我正在尝试弄清楚它的作用。

if (principal.Identity is WindowsIdentity)
{
    profile = //generate a profile somehow
}
....
var userId = principal.Identity.GetUserId<int>();

这是我(认为)我理解的:

principal 

是当前登录的用户

这一行:

if (principal.Identity is WindowsIdentity)

检查当前登录的用户是否是 windows 用户,例如通过 windows auth 登录

这条线是我遇到问题的线。

var userId = principal.Identity.GetUserId<int>();

如果我们从这里假设所有用户都是 windows 用户,那么这一行似乎正在获取用户 ID。

我不确定的部分是获取 Windows 用户 ID 还是在我的应用程序中分配的用户 ID? windows用户还有userID吗?

我的问题是它总是返回 0,我不知道为什么?

如果它与应用程序中的用户 ID 有关,我认为这需要映射或分配到某个地方,但我还是看不到如何。

我大部分时间都在处理这个问题,但是我在谷歌上搜索了所有的东西,但我无法取得任何进展......

【问题讨论】:

  • 这将返回您的应用程序创建的用户 ID
  • 嗨,我认为它总是返回 0,因为它代表身份提供者的表 aspnet 用户的 id
  • 如果你 tra 检索 User.GetUserName() 会怎样
  • .GetUserId&lt;int&gt;() 方法并没有完全实现,它可能是一个扩展方法。你需要看看它在哪里实现,看看它做了什么。
  • @federicoscamuzzi 它将返回 Windows 用户名

标签: c# windows-authentication


【解决方案1】:

所以这是 GetUserId 扩展方法的反编译源(根据 resharper)

if (identity == null)
    throw new ArgumentNullException("identity");
ClaimsIdentity identity1 = identity as ClaimsIdentity;
if (identity1 != null)
{
  string firstValue = IdentityExtensions.FindFirstValue(identity1, "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");
  if (firstValue != null)
      return (T) Convert.ChangeType((object) firstValue, typeof (T), (IFormatProvider) CultureInfo.InvariantCulture);
}
return default (T);

WindowsIdentity 将通过安全转换 as ClaimsIdentity,因为 it inherits from it

因此,无论您的 Windows 身份 contains a claim 是否为 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier,它都归结为

如果您得到 0,则您没有该声明

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2019-10-12
    • 2020-10-31
    • 2017-06-12
    • 2011-01-26
    • 2012-04-20
    相关资源
    最近更新 更多