Principal.Identity.GetUserId<int>() return 是什么意思?

What does Principal.Identity.GetUserId<int>() return?

我遇到了以下代码,我正在尝试弄清楚它到底做了什么。

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 用户有用户 ID 吗?

我的问题是这总是 returns 0,我不知道为什么?

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

一天中的大部分时间我都在处理这个问题,但是我用谷歌搜索都没有取得任何进展...

所以这是 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,则您没有该声明