JWTトークンにいくつかのクレームが追加されています。これまでの方法では、API内のすべてのコントローラーのIDを取得し、これらの主張を検査しています。私は、コードの重複を減らし、共通の場所から私の主張を取得したいと思います。おそらくそれらをstartup.csの中に割り当てます。すべてのWebApiコントローラでJWTクレームを一度取得する方法
たとえば、基本的なCRUD操作を実装するDemoControllerがあります。同じコードは、私のコントローラのすべてで、私の方法の全てに現れる傾向がある:
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
var region = identity.Claims.Where(c => c.Type == ClaimType.Region).Select(c => c.Value).SingleOrDefault();
var role = identity.Claims.Where(c => c.Type == ClaimType.Role).Select(c => c.Value).SingleOrDefault();
var responseType = identity.Claims.Where(c => c.Type == ClaimType.ResponseType).Select(c => c.Value).SingleOrDefault();
If (region == "some region")
{
}
は、私はすべての私のAPIを介して、このコードの重複を避けることができる方法はありますか?私は、代わりにこのように私のコードを書くことができるようにWEBAPIコントローラ全体で共有することができるオブジェクトを使用したい:
if(ApiUser.Region == "Some Region")
{
// DO SOMETHING
}
私はすでに依存性の注入のためのNinjectを使用しています。クレームが割り当てられるApiUserオブジェクトをStartup.csに作成してApiUserを各コントローラに注入することは可能かもしれないと思っていましたが、これがどうすればよいか、またはより良い実行可能な代替案。
すべての提案は大歓迎です!
または、すべての繰り返しコードをカプセル化し、コントローラーに継承させる基本コントローラーを作成します。 – Nkosi
私は、その情報をカプセル化し、そのクラスをコントローラに注入するクラスを作成するというあなたの考えは、実行可能で健全な解決策であると思います。インターフェイスでラップして、テストすることができます。私は常に相続よりも注射を好む。 –
コンストラクタ注入ルートを使用する際の問題は、コントローラに注入されたときにユーザー/プリンシパルがまだ設定されていないことです。 – Nkosi