私のコンテキストユーザのユーザIDは、ローカルユーザストアとoauthプロバイダとの間でどのように関係していますか?
私はASP.NETアイデンティティのカスタムユーザー/ロールストレージを作成しようとしてい
背景
ユーザIDを得ることについて、ここでSOでのいくつかの質問があります。 ASP.NET IDを使用する場合。彼らのほとんどはNameIdentifier
の主張の解析について解決します。
しかし、ほとんどの場合、インポートポイントが不足しているようです。 OAuthを使用する場合、NameIdentifier
はOAuthプロバイダが返すIDを指しているようです。
これは、認証が終了した直後にAccountControllerにブレークポイントを設定することで確認できます。
私の問題
あなたはUSERSTOREを見ればあなたはGetUserIdAsync
は、データベースからあなたの内部IDでIdentityUser
オブジェクトのId
を返すことを確認することができます。これまでのすべての良い。
/// <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);
}
...最初のピークの罰金になります。あなたはUserManager見れば
しかし、それは次のコードを得ました。しかし、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);
上記のコードは、ユーザIDとして宣誓ユーザIDとUserStore.FindByIdAsync
を呼び出します。ユーザ記憶装置は不正なキーを使用してアプリケーションユーザを見つけようとする。
ローカルユーザテーブルのPKとしてoAuth userIdを使用することができますが、2つのoauthプロバイダが同じIDを返す場合は、破損する可能性があります。複数のoauth識別情報が同じアプリケーション・ユーザーに関連付けられている場合は、これも機能しません。
私の質問
は私が何か間違ったことをやっていますか?ユーザーIDは、アプリケーションユーザーストアとoauthプロバイダーの間でどのように関連していますか?