2017-03-14 4 views
0

私はIdentity Server 4の新しい人です。ApiScopeのコンセプトは不明です。もっと詳しく説明できますか?そして、それをどのように実際に適用することができますか?Identity Server 4 - 実際のユースケースでApiScopeを適用するにはどうすればよいですか?

例:Web APIには以下のモジュールがありますが、モジュールへのアクセスを制限したいのですが、それに基づいていますか?それが可能な場合、どのように我々は

+0

私はあなたが何を求めているのかよく分かりませんでした。クライアント全体のモジュールアクセスを制限しますか?アプリケーション全体が在庫管理を消費することはできません**またはユーザーごとに制限する必要があります。つまり、ユーザーAはアカウント管理にアクセスでき、ユーザーBは在庫管理にアクセスできる、ユーザーCは両方にアクセスすることはできません... – DotnetProg

+0

元、私はユーザーごとにそれを制限したいと思います。しかし、以下の答えでは、範囲はクライアントのためだけです。ありがとう。 –

+0

[OK] - ユーザーごとのアクセスを制限したい場合は、その達成方法を説明した回答を投稿しました – DotnetProg

答えて

1

スコープは、あなたが細分化してフィット(またはしない)を参照してくださいどのようにあなたのAPIのリソースを使用することができます抽象的な概念で、システム

Scopes = 
    { 
     new Scope() 
     { 
      Name = "accountmanagement", 
      DisplayName = "Account management api", 
     }, 
     new Scope() 
     { 
      Name = "stockmanagement", 
      DisplayName = "Account management api", 
     } 
    } 

おかげでそれを設定することができます。たとえば、あなたが持っているかもしれません:

  • 複数の物理的に異なるAPI( "OurEnterpriseScope")
  • 物理APIごとに1つのスコープ( "OurDataAccessApiScope"、 "OurFinanceApiScope")物理あたり
  • 複数のスコープをカバーして一つのスコープをAPI、どんな粒度であれ、あなたは合っています。おそらく2つ:読み込み用と書き込み用の2つ。通常のユーザーの場合は1つ、管理者の場合は1つ。たぶん、すべての単一のエンドポイントの範囲(しかしない...)IdentityServerで

はあなたのクライアント(s)はClientオブジェクトにAllowedScopesを使用して、へのアクセス権を持つスコープを指定します。したがって、「MyApiUser」スコープと「MyApiUser」スコープと「MyApiAdmin」スコープの両方を使用できる別のクライアントのみを使用できるクライアントがあるとします。

スコープは、userの機能、clientの機能を使用しています。は、の機能ではありません。

リソースをどのように分割するかは、あなた次第です。

UseIdentityServerAuthenticationにはAllowedScopesを定義する必要があります。これにより、APIがアクセストークン内で受け入れるスコープを知ることができます。複数のスコープを受け入れるAPIがあり、アクセストークンのスコープに基づいてエンドポイントへのアクセスを制御したい場合(APIがそれぞれ異なるスコープを持つ複数のクライアントをサポートしているため)Claimsに基づいてPoliciesを定義できますクレームとしてまとめられています)。

良い読み取りがここで見つけることができます:あなたは全体ではなく、アプリケーションのために、特定のユーザーに基づいて、モジュールへのアクセスを制限することができるようにしたい理解した後https://leastprivilege.com/2015/12/28/validating-scopes-in-asp-net-4-and-5/

+0

多くのありがとう、それは私には便利です –

0

を - ユーザの請求項によって達成することができます(最も一般的な実装はroleの主張です)。

ユーザーごとにロールを保存できます。AccountManagerまたはStockManager(またはその両方)です。 次に、新しいApiResourceを少なくとも1つのScopeと定義し、そのスコープにはUserClaimsが含まれます(ユーザーのチェックを管理するクレーム)。

その後
new ApiResource 
{ 
    Name = "rolesResource", 
    DisplayName = "Roles", 
    Scopes = { 
     new Scope 
     { 
      Name = "roles", 
      DisplayName = "User Roles", 
      Description = "A list of all the roles assigned to the user", 
      Required = true, 
      UserClaims = 
      { 
       JwtClaimTypes.Role 
      } 
     } 
    } 
} 

- あなたのクライアントは、その特定のroles範囲に

new Client 
{ 
    ClientId = "your_client_id", 
    // More configuration... 
    AllowedScopes = { 
     // Whatever scopes needed and... 
     "roles" 
    } 
}, 

を求めることができるクライアントがアクセストークンを要求するとき、それは、関連する役割を持っており、あなたのコントローラ/アクションを確認するためにAuthorizationAttributeを使用することができます各ユーザが所望のアクセスレベルを有することを保証する。

[Authorize(Roles = "AccountManager")] 
public class AccountController : ControllerBase 
{ 
    [HttpGet] 
    public IActionResult Get() 
    { 
    } 

    [Authorize(Roles = "StockManager")] 
    public IActionResult OnlyAccessibleForBothAccountManagerAndStockManager { } 
} 
関連する問題