2017-01-07 29 views
5

.NET Core 1.1'de bir API oluşturuyorum. HttpContext.User numaralı özel bir User nesnesini, diğer tüm denetleyicilerin devraldığı bir temel denetleyicide yapıyorum ve kimlik doğrulaması varsayılan olarak etkinleştirilmiş (gerekiyorsa, [AllowAnonymous] ile manüel olarak devre dışı bırakılmalıdır). User nesnesinin bir IsAdmin özelliği vardır. Şu anda, kullanıcının aşağıdaki gibi her ilgili işlevin en üstünde bir yönetici olup olmadığını kontrol ediyorum, ancak bu kodu basitleştirmek ve temizlemek için özel bir özellik eklemenin bir yolu olması gerektiğini düşünüyorum..NET Çekirdekinde özel yetkilendirme özniteliği

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

Bunun yerine:

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

    // logic 
} 

bu (veya benzer bir şey) istiyorum:

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

ben Başvuru için

, User.IsAdmin bu için kısaltmadır denemek için source for [AuthorizeAttribute] bakarak çalıştı, ama sadece bir kabuk ve ben kn gerçek büyünün gerçekleştiği yer.

Bunu nasıl yapabilirim?

+4

, temelde bir kullanma Adlandırılmış bir ilkeyle öznitelik oluşturduğunuzda, ilke olarak bir rol veya hak talebi veya başka bir kural gerektirecek ilkeyi tanımlarsınız. https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies –

+0

Blowdart'ın (ASP.NET Çekirdek güvenliğinden sorumlu) yanıtını kontrol edin, kendi özniteliklerinizi yaratmamalısınız (veya ihtiyacınız var) – Tseng

+0

@JoeAudette Neye ihtiyacım olduğu konusunda emin değilim. :/[Hak talebinde bulunan yetkilendirme] (https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims#adding-claims-checks) işe yarayacaktır, iddia doğrudur. Bunu bir cevap olarak eklerseniz kabul edeceğim. – vaindil

cevap

6

@JoeAudette tarafından önerilen çözüm en iyi seçenek gibi görünüyor.


Startup.cs kendi politikası oluşturun:

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


Sonra sadece bir öznitelik olarak kullanmak: Ben ilke bazlı yetkilendirme hakkında dokümanlar okumak öneririz

[Authorize("PolicyName")]