2017-01-07 10 views
5

.NET Core 1.1でAPIを構築しています。私はオブジェクトをベースコントローラ内のHttpContext.Userからビルドし、他のすべてのコントローラが継承し、デフォルトで認証が有効になっています(必要に応じて手動で[AllowAnonymous]で無効にする必要があります)。 UserオブジェクトにはIsAdminプロパティがあります。今のところ、ユーザーが下のような関連する機能の上位にある管理者かどうかを確認していますが、このコードを単純化してクリーンアップするカスタム属性を追加する必要があるようです。参考のため.NETコアのカスタム認可属性

User.IsAdminは、このための速記です:

bool.Parse(HttpContext.User.FindFirst("IsAdmin")?.Value) 

この代わりに:

[HttpGet] 
public async Task<IActionResult> Get() 
{ 
    if (!User.IsAdmin) 
     return Forbid(); 

    // logic 
} 

私はこの(または似たような)希望:

[AdminOnly] 
[HttpGet] 
public async Task<IActionResult> Get() 
{ 
    // logic 
} 

Iをからの構築を試みるためにsource for [AuthorizeAttribute]を見てみましたが、それは単なるシェルであり、私はknではありません本当の魔法が起こる場所。

どうすればこの問題を解決できますか?

+4

私が提案したポリシーベースの認可についてのドキュメントを読んで、あなたは基本的に使用します属性に名前付きポリシーを指定した場合、起動時に役割または要求またはその他のルールが必要なポリシーを定義します。https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies –

+0

@blowdart(ASP.NETコアセキュリティの責任者)の回答を確認すると、独自の属性を作成しないでください(または必要があります)。 – Tseng

+0

@JoeAudetteこれは私が必要としているように見えます。 :/ [Claims-based auth](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims#adding-claims-checks)は動作します。クレームは「真」です。それを答えとして追加すると、私はそれを受け入れます。 – vaindil

答えて

6

@JoeAudetteによって提案された解決策が最良の選択肢のようです。


Startup.csで独自のポリシーを作成します:

options.AddPolicy("PolicyName", p => 
{ 
    p.RequireAuthenticatedUser(); 
    p.RequireClaim("IsAdmin", true); <- your criteria here (claim type, claim value) ??? 
    p.Build(); 
}); 


をそれからちょうど属性としてそれを使用する:

[Authorize("PolicyName")]