用户user id如何在本地用户存储和oauth提供程序之间关联

本文关键字:用户 oauth 程序 关联 之间 id user 存储 | 更新日期: 2023-09-27 18:13:16

My context

我正在尝试为ASP创建一个自定义用户/角色存储。净身份

在使用ASP时,在这里有几个关于获取用户id的问题。净的身份。大多数都是围绕解析NameIdentifier声明来解决的。

然而,他们中的大多数似乎错过了一个重要的点。当使用OAuth时,NameIdentifier似乎指向OAuth提供者返回的身份。

这可以通过在验证完成后在AccountController中设置一个断点来观察。

我的问题

如果您查看UserStore,您可以看到GetUserIdAsync将返回IdentityUser对象的Id,这是您从数据库中获得的内部id。到目前为止一切顺利。

但是,如果您查看UserManager,它会得到以下代码:

/// <summary>
/// Returns the User ID claim value if present otherwise returns null.
/// </summary>
/// <param name="principal">The <see cref="T:System.Security.Claims.ClaimsPrincipal" /> instance.</param>
/// <returns>The User ID claim value, or null if the claim is not present.</returns>
/// <remarks>The User ID claim is identified by <see cref="F:System.Security.Claims.ClaimTypes.NameIdentifier" />.</remarks>
public virtual string GetUserId(ClaimsPrincipal principal)
{
  if (principal == null)
    throw new ArgumentNullException("principal");
  return principal.FindFirstValue(this.Options.ClaimsIdentity.UserIdClaimType);
}

. .在第一个峰上看起来很好。但是如果你看UserIdClaimType的恒定值它和ClaimTypes.NameIdentifier是一样的。因此,它将获取oauth用户id。

由于上述问题而无法工作的代码:

//this returns the oauth id, can't be used to work with the application user
var id = await _userManager.GetUserIdAsync(currentClaimPrincipal);
//this returns null as it internally uses the above line
await user = _userManager.GetUserAsync(currentClaimPrincipal);

上面的代码将以oath用户id作为用户id调用UserStore.FindByIdAsync。因此,用户存储将尝试使用不正确的键来查找应用程序用户。

一种破解方法是使用oAuth userId作为本地用户表中的PK,但是如果两个oAuth提供程序返回相同的id(并非不可能),这可能会中断。当多个oauth标识与同一个应用程序用户相关联时,它也不起作用。

我的问题

我做错了什么吗?用户id在应用程序用户存储和oauth提供程序之间是如何关联的?

用户user id如何在本地用户存储和oauth提供程序之间关联

你不应该用OAuth提供商的claims主体调用GetUserId。唯一应该与它一起使用的ClaimsPrincipal是通过identity使用的ClaimsPrincipalUserFactory生成的。将OAuth与本地用户关联通常通过AddLogin方法完成,该方法将OAuth id链接到本地用户id。