2017-05-21 13 views
1

私はわずかなアーキテクチャ上の問題があります。 アイデンティティユーザーストア(データベースのユーザー)を持つユーザーを認証するためのIdentityServerソリューションがあります。私はここにログイン機能を持っているので、ここでDbContextを使う必要があります。 IDテーブルではないカスタムテーブルを保持する別のソリューションAPIがあります。すべてのテーブルは同じデータベースにあります。クレームデータを使用してCreatedByユーザーデータをカスタムテーブルに挿入できますか?

私はAPIを使って新しいレコードを追加するとき、何とかCreadetByをIDユーザーに接続したいと思っています。私はクレームからユーザーについての情報を得て、新しい行を作成している間に挿入することができますが、それは良い方法ですか?

もう1つの質問は、IdentityServerプロジェクトから登録操作を外してそこのIDユーザーストアにログイン機能を使用し、APIに登録するだけなので、2つの場所でApplicationUserの追加フィールドを複製しませんか?

+0

だから、2つのコンテキスト、アイデンティティのための1とカスタムテーブルのための1つを持っていますか?データベース内のユーザーテーブルを使用すると、AspNetUsersテーブルを意味しますか?カスタムコンテキストにusersテーブルもありますか? –

+0

はい私はカスタムコンテキストでユーザーテーブルを持っていますが、カスタムテーブルとリンクする必要があるので追加しました。私は何とか重複なく1つの場所に保持したいだけです。私の言っていることが分かるよね。 AspNetUsersテーブルとの接続を持つカスタムテーブルカーを作成する場合は、リンクを作成する必要がありますか、汎用フィールドCreatedByを作成し、User.Identity.Nameでそのカスタムテーブルをクレームで記入し、私はちょうど車のテーブルUSERIDを取得し、そのUSERIDでaspnetUsersを照会すると、AspNetUsersでいくつかの車を作成gueryしたいですか?分かりますか? –

答えて

3

私が理解するところでは、懸念の分離を維持する必要があります。同じコンテキストを共有していないテーブル間には、決して関係を持たないようにしてください。つまり、Carsは決してAspNetUsersにリンクできません。

これは、オブジェクトとフィールドの意味についてです。たとえば、IdentityUserとCustomUserは等しいと思われますが、そうではありません。 IdentityUserには、CustomUserがカスタムモデルに必要なすべての情報を持つ場所としてユーザーを識別するために必要なすべての情報があります。実際、ログインアカウントを持たないCustomUsersを持つことができます。

また、emailaddressも考慮してください。両方のコンテキストでこのフィールドを使用するのは冗長なようですが、実際に自分のGoogleアカウントを使用してログインしてカスタムメールアドレスの更新情報を受け取ることができます。

したがって、CreatedByフィールドの意味は何ですか?また、どのように使用する予定ですか?カスタム・コンテキストの一部(レポート用など)の場合は、CustomUser表があり、その表に関連する必要があります。管理目的でこれをチェックしたいのであれば、ユーザ名を保存するだけで十分でしょう。あなたはそのフィールドで質問しますか? CustomUserAddressのような追加情報が必要ですか?

うまくいけば、実際には重複フィールドはないと思います。彼らはすべて目的と意味が異なるためです。

いずれにしても、あなたは文脈を超えて関係することを望んでいません。そして、別のコンテキストから情報を取得するために、idのリストを送信してしまうことを望んでいません。

問題は、現在のユーザーをリンクすることです。識別トークンは、ユーザーを識別するために使用されます。これはあなたのリソースに何も意味しません。しかし、アクセストークンには、リソース内の実際のユーザーに関する情報が含まれています。

リソースに近い権限を保持することで、CustomUserIdを使用して承認ユーザーを拡張できます。アクセストークンにこの情報を追加します。アクセストークンは認証の一部であるためです。ユーザーに指定されたユーザーのデータにしかアクセスできないことをリソースに通知します。

[アクセストークン] .customUserIdを使用すると、CustomUserと一致させることができます。したがって、CreatedByはCustomUser.Idの値を持つ必要があります。

また、私はこの記事をお勧めしたいと思います:https://leastprivilege.com/2016/12/16/identity-vs-permissions/

+0

素敵な説明!しかし、Access TokenにCustomUserIdを追加するには、Identity ServerプロジェクトがAPIプロジェクトのCustomUserモデルにアクセスできません。カスタムユーザーはいつ作成しますか? IdentityServerは登録時にIdentityUserを作成します。関連するCustomUserをいつ作成するのか、APIプロジェクトではどのように知ることができますか?チュートリアルやこれを行う方法の例がありますか? – Skullbox

+1

@Skullbox私には2つの選択肢があると思います。 1)追加情報が必要ない場合は、CustomerUserに「サブ」列を追加して、クレームに「サブ」を使用してユーザーを識別することができます。 CustomerUserレコードが存在しない場合(サブ列をサブクレームと照合することはできません)、新しいCustomerUserを作成します。 2)登録時には、識別子を(AspNetUserClaimsの)クレームとして追加する必要があります。 GUIDをIDとして生成するか、APIを呼び出してCustomerUserを登録し、得られたCustomerUser.Idを使用します。 –

関連する問題