2017-08-16 15 views
4

クライアントIPに基づいてREST APIを保護しようとしています。属性を使用したIPベースの承認ポリシー

は、これらの要求の例でブログアプリケーションを想像してみて:appsettings.jsonで定義されて

/post/list    // Everyone  should see the posts 
/post/create    // Only Authors should create a post 
/post/update/42   // Only Authors should update a post 
/post/delete/42   // Only Admins should delete a post 
/comment/42/list   // Everyone  should see a post's comments 
/comment/42/create  // Everyone  should create a comment 
/comment/42/delete/1337 // Only Admins should delete a comment 

IPのホワイトリスト:ここで

"IpSecurity": { 
    "Author": "123.456.789.43,123.456.789.44", 
    "Admin": "123.456.789.42" 
} 

は私が好き応じRequireRole属性を持つアクションの例があります実装する:

[HttpGet("post/list")] 
public List<Post> List() 
// ... 

[RequireRole("Author")] 
[HttpGet("post/create")] 
public StandardResponse Create([FromBody]Post post) 
// ... 

[RequireRole("Admin")] 
[HttpGet("post/delete/{id}")] 
public StandardResponse Delete(int id) 
// ... 

スタートアップ

var IpSecurity = Configuration.GetSection("IpSecurity"); 
services.Configure<IpSecurityConfig>(IpSecurity); 

からの注射定義され、それは良いアイデアのように聞こえるでしょうか?

私はカスタム認証ポリシー、ミドルウェア、またはそのフィルタを行う必要がありますか?

RequireRole属性を実装するにはどうすればよいですか?


Thisは、IPホワイトリストを実装する方法のアイデアを与えるが、ミドルウェアは、文脈アクションへのアクセス権を持っていないので、私は私の要件を定義するための属性を使用することはできません。私がお勧めしたい...

を彼らがスプーフィングすることができるように、との要求が拒否される前に、あなたのスタックにそれは非常深い作る - あなたはIPベースの認証の意味について考えてきたと仮定すると、

答えて

3

はい、それが一目で分かり簡単に見えるので、少なくともよくないに見えています。

「ロール」という用語を使用すると、後継者を混乱させる可能性があります。代わりに "MachineRole"と呼んでください。

public void ConfigureServices(IServiceCollection services) 
{ 
    //after services.AddMvc() : 

    services.AddAuthorization(o => { o.AddPolicy(MachineRole.AuthorMachine, p => p.RequireClaim(nameof(MachineRole), MachineRole.AuthorMachine)); }); 
    services.AddAuthorization(o => { o.AddPolicy(MachineRole.AdminMachine, p => p.RequireClaim(nameof(MachineRole), MachineRole.AdminMachine)); }); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // ... 

    app.UseClaimsTransformation(AddMachineRoleClaims); 

    // app.UseMvc(...); 
    // ...etc... 
} 

public Task<ClaimsPrincipal> AddMachineRoleClaims(ClaimsTransformationContext ctx) 
{ 
    var connectionRemoteIpAddress = ctx.Context.Connection.RemoteIpAddress.MapToIPv4(); 
    if (Configuration.GetSection("IpSecurity")["Author"].Contains(connectionRemoteIpAddress.ToString())) 
    { 
     ctx.Principal.AddIdentity(new ClaimsIdentity(new[] { new Claim(nameof(MachineRole), MachineRole.AuthorMachine) })); 
    } 
    if (Configuration.GetSection("IpSecurity")["Admin"].Contains(connectionRemoteIpAddress.ToString())) 
    { 
     ctx.Principal.AddIdentity(new ClaimsIdentity(new[] { new Claim(nameof(MachineRole), MachineRole.AdminMachine) })); 
    } 

    return Task.FromResult(ctx.Principal); 
} 

public static class MachineRole 
{ 
    public const string AuthorMachine = "AuthorMachine"; 
    public const string AdminMachine = "AdminMachine"; 
} 
:AspNetCoreそれは、MVC4下 Startup.csにおける通常の方法では、このようなものだったように私には少し複雑に見えるに

実装(そして、同様の理由により、[Authorize(Roles="..."]を使用していません)

その後、あなたは、これは単純ではない、という事実によって、私は十分にイライラした

[Authorize(Policy = MachineRole.AdminMachine)] 
+0

私はあなたに紛らわしい '役割'の用語について同意します。私はあなたの解決策を試みます。 –

+0

コントローラアクションで定義された '[Authorize(Policy = ...)]'を試しましたが、空の 'AddIpAddressClaims()'を使ってみました。許可されていない返答を返してはいけませんか? –

+1

私は 'ConfigureServices()'で 'AddMvcCore()'を使っているので、私は 'AddAuthorization()'をしなければなりませんでした。しかし、私は最終的に、[カスタムポリシーベースの承認](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies)を使用しました。クレームベースの繰り返しがあまりにも多いからです。また、私は認証フレームワークを必要としませんでした –

0

クレームを割り当てるミドルウェアを作成するか、少なくともIDを設定する(ユーザーが認証されるように)。次に、(ミドルウェアのIDに割り当てた)クレームまたは許可ポリシー(https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies)のいずれかを使用します。あなたは、ポリシーに関連付けられたIPアドレスに基づいて、各要求を拒否することができます:

[Authorize(Policy="AuthorIp")] 
[HttpGet("post/create")] 
public StandardResponse Create([FromBody]Post post) 
+0

私はそう私はOAuthのプロバイダに依存してきただろうと思い、私はもっと本当に、実際にそれを確保するのではなく、私のAPIを分割する方法を探しています、IPを詐称することができることを知っています。あなたはそれがリクエストパイプラインで非常に深いと思いますか?それは '[Authorize()]'と同じほど深くないのだろうか? –

+0

あなたはそれがちょうど深くなるでしょう。 IPに基づいたエンドポイントの「ブロッキング」は、パーティショニングにどのように役立ちますか?誰が呼び出しているかによって、APIの動作が異なりますか?カスタム認証方式の追加については、https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication/AuthenticationServiceCollectionExtensions.cs(およびこのレポのその他の部分) – zsims

+1

を参照してください。ただし、IPベースの制限は共通 - AWSなどがそれを提供します。私は、クレジットカード決済プロバイダへの接続を含めて、それを使用した金融サービスの3社と協力してきました。それは完全なセキュリティソリューションではありませんが、確かにソリューションの一部* –

関連する問題