2016-10-17 1 views
1

私のコンテキストユーザのユーザ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プロバイダーの間でどのように関連していますか?

答えて

0

OAuthプロバイダのクレームプリンシパルを使用してGetUserIdを呼び出すべきではありません。それと共に使用される唯一のClaimsPrincipalは、そのIDが使用するClaimsPrincipalUserFactoryによって生成されたものです。 OAuthをローカルユーザに関連付けることは、通常、OAuth IDをローカルユーザIDにリンクするAddLoginメソッドを介して行われます。

関連する問題