2

私はSPA Webアプリケーション+ IdentityServer4 + ASPNETコア+ ASPNETコアアイデンティティを構築しようとしています。私は、Identityserverのドキュメンテーションのクイックスタートに続き、本当に素晴らしいです。私はクイックスタートにもっと関心がありますIdentity Server Quickstart with JS ClientIdentityServer4を使用して現在のユーザーにアクセスするにはどうすればよいですか?

私はそれに従いました。

app_user

これは私が私を表示するページを作成したいソリューションエクスプローラ

solution_explorer

です:今、私はそうのように、私のユーザーにいくつかのフィールドと関連するテーブルを追加しましたユーザーとその関連テーブル/フィールド(基本的に私の質問は、私の現在のユーザーにアクセスしてJSクライアントのAPIを公開して消費する方法です)

どうすれば実現できますか? (以下の記述はすべて、私はオンラインで読むだけで、実装方法はわかりません)

  • 私はセッションにユーザーを保存する必要がありますか?そこからアクセスしますか?
  • connect/userinfoエンドポイントを使用する必要がありますか?

助言してください。

+0

これは役に立ちますか? http://stackoverflow.com/questions/39174121/get-property-of-applicationuser-from-the-asp-net-core-identity/39174256#39174256 –

+0

ありがとうございました。これを試してみましょう。 usermgrを使用しているときは、毎回dbへの呼び出しを行いますか?それとも一度ですか? –

+0

はい、それは毎回dbに行くでしょう。同じリクエスト内で同じクエリを複数回実行している場合、そのクエリは一度ヒットし、その後の呼び出しをキャッシュから取得します。 (これはまた、dbコンテキストの依存性注入に設定されている寿命にも依存しますが、デフォルトでは 'Scoped'またはリクエストごとに設定されます) –

答えて

3

IdentityServerのアイデアは、ユーザーアイデンティティの概念を分離することです。つまり、web APIは、ユーザーが保存されているデータベースにアクセスしてはいけません。

web APIにnessaccaryであるユーザーIDに関連するものはすべて、IdentityServerによって付与されたaccess tokenに含まれる必要があります。このように、あなたの例では

(特許請求の範囲におけるたとえば)あなたはApplicaionUserからPointsWalletsフィールドを削除することができ、それらを保存するための追加のテーブルを作成します。

public class UserInfo 
{ 
    public string UserSubject { get; set; } 
    public int Points { get; set; } 
    public ICollection<Wallet> Wallets { get; set; } 
} 

をあなたができるユーザーIDに関連する何かが必要な場合このように主張からそれを得る:あなたはPointsおよび/またはユーザーのWalletsが必要な場合は、これらの特許請求の範囲からsub請求を得ることができます

[Authorize] 
public ActionResult SomeAction() 
{ 
    var identity = (ClaimsIdentity)User.Identity; 
    IEnumerable<Claim> claims = identity.Claims; 
    ... 
} 

あなたのデータベースに問い合わせます。

これはまた、ユーザーの題名でPointsWalletsを保存する必要があることを意味します。

+0

「ユーザーが保存されている場所」では、ユーザーと操作可能別々に保管する必要がありますか?別のデータベースですか?ああなるほど。だから、もし私が 'Points'や' Wallets'(ユーザーIDと関係なく)のような追加データが必要な場合は、 'sub'クレームを使って関連レコードを照会するだけです。右? –

+0

@BoyPasmoはい、絶対に。 –

関連する問題