現在、マイクロサービスベースのシステムに取り組んでいます。その背後にある考え方は、モノリシックシステムを小さなドメインに分割することです(ドメインごとのマイクロサービス)。
すべてのサービスは内部アプリケーションで使用されますが、公開する予定です。
サービスの1つは、トークンの発行と検証を担当するID管理サービスです。
共有参照には、SharedKernelを使用しています。共有カーネルのライブラリの1つは、すべてのマイクロサービスで使用されるカスタムAuthorizationAttribute
です。基本的に、属性が行うことは、ベアラートークンを承認サービスに転送することであり、承認サービスは、トークンの有効性、ユーザー情報、指定されたトークンの許可されたエンドポイント/リソースなどの情報で応答します。
現在のエンドポイントがリストされていない場合は、401 HTTP応答が返されます。
今、私は2つの懸念があります:
UserTypes
をユーザーに割り当てるか、これを解決するためのより簡単な方法がありますか?いいえ、トークンを正しく使用していません。
アイデアは、トークンを発行する認証サービスと、トークンを検証してトークンに含まれるクレームを読み取ることができるリソースサービスがあるということです。したがって、フローが次のようになるたびに、ベアラートークンを認証サービスに転送するのではなく、
その後
その後
このフローは、Authサービスがパフォーマンスのボトルネックになるのを防ぎ、さまざまなマイクロサービスに、クレームXがオペレーションYを実行できるかどうかを決定させる
役割
役割と権限に関する2番目の質問に対処します。結局のところ、サービスには、認識している一連の役割または権限が必要です。たとえば、実際に次のようなコードを記述する必要があります。
If(users.Role != "RoleX")
{
return "Access Denied!";
}
「canEditAccounts」、「canEditCustomers」、「canDeleteAccounts」などのさまざまな権限の完全なリストを用意するのではなく、代わりに、基本的に一連の権限として機能するロール「AccountingAgent」の短いリストを使用する方法が最近のアプローチです。
サードパーティがサービスを利用する場合でも、サービスが認識しているロールを使用する必要があります。これは、役割で提供する細分性のレベルでスタックしていることを意味します。
つまり、あなたの会計エージェントがあまりにも少なく、あなたの会計マネージャーがサードパーティに対してあまりにも多くのことをするなら、あなたは立ち往生しています。
これを回避する1つの方法は、役割と権限を動的にマッピングすることです。サービスに権限を認識させ、役割が持つ権限を照会します。
次に、サードパーティのコンシューマが独自のロールを作成できるようにして、それぞれが持つ権限を選択できます。
トークンを非表示にするTLSなどの別の場所がない限り、トークンが傍受された場合、誰でもそのトークンを使用して、有効期間中そのユーザーになりすます可能性があることに注意してください。個人的には、シークレットを渡す必要がなく、アプリケーションからセッションを管理する必要がないクライアント証明書のようなものを好みますが、リスクを理解して説明する限り、トークンアプローチに問題はありません。
ユーザーが許可されているもので応答する別のサービスを用意することの利点の1つは、必要に応じて交換できることです。したがって、サードパーティが別のことをしたい場合、そのサービスの動作を変更します。単純に「ここにユーザーX」と言うと、彼または彼女は何ができますか?これにより、認可構造がサービス実装から完全に切り離されます。
別のサービスを使用して承認を管理すると、いくつかの潜在的な課題が生じます。主にそれは単一障害点になる可能性があり、任意のサービスへのすべての呼び出しの要求を受け取ります。実装全体を通して水平スケーリングでこれを管理できるはずです。キャッシングを組み込んで過度のチャットを回避することもできます。