2017-05-25 8 views
0

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を各コントローラに注入することは可能かもしれないと思っていましたが、これがどうすればよいか、またはより良い実行可能な代替案。

すべての提案は大歓迎です!

+0

または、すべての繰り返しコードをカプセル化し、コントローラーに継承させる基本コントローラーを作成します。 – Nkosi

+0

私は、その情報をカプセル化し、そのクラスをコントローラに注入するクラスを作成するというあなたの考えは、実行可能で健全な解決策であると思います。インターフェイスでラップして、テストすることができます。私は常に相続よりも注射を好む。 –

+0

コンストラクタ注入ルートを使用する際の問題は、コントローラに注入されたときにユーザー/プリンシパルがまだ設定されていないことです。 – Nkosi

答えて

0

ClaimsAuthenticationManagerの実装を作成して、クエストの検索を実行したり、さらにカスタムクレイムをJWTに追加したりすることもできます。あなたはその後、各コントローラにあなたの小切手を作るためにあなたのApiUserクラスを使用することができます

public class MyClaimsAuthenticationManager : ClaimsAuthenticationManager 
{ 
    public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
    { 
     if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated) 
     // build up your ApiUser class here 

    } 
    return incomingPrincipal; 
} 

。あなたがやりたいチェックのタイプごとにカスタムAuthorizationAttributeを使って、より良い結果を得ることができます。

関連する問題