2

この質問はasp.netコアクッキーミドルウェアを使用している間は、asp.netコアの場合はhereと本質的に同じですが、asp.netコアの場合と同じです。asp.netコアw/cookieミドルウェア - アクセス許可要求データ

検証時にクエリ文字列/リクエストボディデータにアクセスできますか?可能であれば、そのアイデアを奨励しますか?しかし、大部分のasp.netと同じルールが適用されているようです(例えば、指定された要求ライフタイムで一度だけリクエストデータを読み込むなど)ことは可能でしょうか?this

例:アカウントを1つしか持たない、異なるチームのメンバーであるアプリを作成しています。彼らはアプリで多くの異なるアクションを実行することができ、彼らがメンバーである1つのチームまたは他のものの「コンテキスト」内にある間にそのアクションを実行することができます。だから、私はteamId整数がサーバーに行われた要求に渡されています。 ClaimsPrincipalからクレームを引き出して、実際にパイプラインの承認部分でそのチームのメンバーであることを確認したいと思います。

答えて

6

あなたが言ったように、OnValidatePrincipalイベントでリクエストのデータにアクセスすることができます。だから、あなたはこのような何かを書くことができます:

OnValidatePrincipal = async (context) => 
{ 
     if (context.Request.Path.Value.StartsWith("/teams/")) 
     { 
      var teamId = // get team id from Path; 

      if (user is not team member) 
      { 
       context.Response.StatusCode = 403; 
      } 
     } 
} 

しかし、私はあなたの要件がAuthorizationはなくAuthentication関連していると思います。私はこの要求を処理するためにPolicy-Based Authorizationを使用します。例の方針は次のようにする必要があります:

要件とハンドラ:

public class TeamMemberHandler: AuthorizationHandler<TeamMemberRequirement> 
{ 
    private readonly IActionContextAccessor _accessor; // for getting teamId from RouteData 
    public TeamMemberHandler(IActionContextAccessor accessor) 
    { 
     _accessor = accessor; 
    } 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TeamMemberRequirement requirement) 
    { 
     var teamId = // get teamId with using _accessor 
     if (user is not member of team(by teamId)) 
     { 
      context.Fail(); 
     } 
     return Task.FromResult(0); 
    } 
} 
public class TeamMemberRequirement : IAuthorizationRequirement 
{ 
} 

サービスの設定:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); 
    services.AddAuthorization(options => 
    { 
     options.AddPolicy("TeamMember", 
          policy => policy.Requirements.Add(new TeamMemberRequirement())); 
    }); 

    services.AddSingleton<IAuthorizationHandler, TeamMemberHandler>(); 
} 

最後に、コントローラの上にそれを使用する(またはしたい場合は、あなたがグローバルフィルタを追加することができます)

Authorize[(Policy = "TeamMember")] 
public class TeamHomeController : Controller 
{ 
    // Authorize[(Policy = "AnotherPolicy")] 
    public IActionResult Index(){} 
} 
+0

恐ろしい答え、ありがとう! さらに、これをさらに進めるには、パラメータ化可能なポリシーがありますか?ユーザーがGET '/ some/endpoint?teamId = 3'を送信するときに、何らかのデータを読み取るためのアクセス権を持っているという主張をユーザーが持っているとしましょう。次に、同じコントローラに対してPUTでそのデータを更新しようとします。これには、このデータを更新できるという主張が必要です。 したがって、これらのクレームタイプのポリシーをパラメータ化できますか?あるいは、それぞれのために新しい方針が必要でしょうか? – steamrolla

+0

はい、更新のための新しいポリシーが必要です。更新アクションメソッドの上にそれを使用する必要があります。 –

+0

Bah!それは、同じコードではあるが異なるデータで、1日の終わりに1トンの異なるポリシーになります。将来的にasp.netコアチームから強化されるかもしれませんか? – steamrolla

関連する問題