Asp.net WebApi'de Özel Yetkilendirme - ne dağınıklık?


113

WebApi'de yetkilendirme hakkında çeşitli kaynaklardan (kitaplar ve SO cevapları) okuyorum.

Yalnızca Belirli Kullanıcılar için erişime izin veren Özel Öznitelik eklemek istediğimi varsayalım:

Dava 1

Bir şeylerin yanlış olması durumunda tepkiyi belirleyen bu geçersiz kılma yaklaşımını gördüm OnAuthorization

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 public override void OnAuthorization(HttpActionContext actionContext)
  {
   if ( /*check if user OK or not*/)
   {
     actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
   }
  }
}

Örnek 2

Ama aynı zamanda geçersiz kılan, OnAuthorizationancak şu çağrıyı yapan bu benzer örneği de gördüm base:

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
  base.OnAuthorization(actionContext);

    // If not authorized at all, don't bother

    if (actionContext.Response == null)  
     {
      //...
     }
}

Ardından, HttpActionContext.Responseayarlı olup olmadığını kontrol edersiniz . Ayarlanmamışsa, isteğin yetkili olduğu ve kullanıcının uygun olduğu anlamına gelir

Vaka 3

Ama aynı zamanda geçersiz kılma yaklaşımını da gördüm IsAuthorized :

public class AllowOnlyCertainUsers : AuthorizeAttribute
{
 protected override bool IsAuthorized(HttpActionContext context)
  {
   if ( /*check if user OK or not*/)
   {
    return true;// or false
   }
  }
}

Vaka # 4

Ve sonra benzer bir örnek gördüm ama base.IsAuthorized (bağlam):

protected override bool IsAuthorized(HttpActionContext context)
{
 if (something1 && something2 && base.IsAuthorized(context)) //??
 return true;
 return false;
}

Bir şey daha

Ve sonunda Dominick burada şöyle dedi :

OnAuthorization'ı geçersiz kılmamalısınız çünkü [AllowAnonymous] işlemesi eksik olacaktır.

Sorular

  • 1) Hangi yöntemleri kullanmalıyım: IsAuthorizedveya OnAuthorization? (veya ne zaman kullanılmalı)

  • 2) base.IsAuthorized orbase.OnAuthorization'ı ne zaman aramalıyım?

  • 3) Böyle mi inşa ettiler? Eğer yanıt boşsa her şey yolunda mı? (vaka # 2)

NB

Lütfen dikkat edin, yalnızca AuthorizeAttributezaten devralan kullanıyorum (ve kullanmak istiyorum)AuthorizationFilterAttribute

Neden ?

Çünkü şu konuda ilk aşamadayım: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

görüntü açıklamasını buraya girin

Her neyse, Yetkilendir özelliğini genişleterek soruyorum.


Authorize özelliğini geçersiz kılmak için neye ihtiyacınız var? Ulaşmak istediğiniz kullanım alanı nedir? Belirli kullanıcıların erişimine izin vermeniz gerekiyorsa, neden bunun gibi [Yetkilendir (Kullanıcılar = "Yönetici")] özelliğini kullanmıyorsunuz?
Taiseer Joudeh

1
@TaiseerJoudeh Örneğin, kullanıcıları 10:00 ile 12:00 (yapılandırılabilir) arasında yetkilendirmeyi deneyin. bunu sade Roller ve yetkili attr ile yapamazsınız. kendi mantığınızı
yaratmalısınız

Yanıtlar:


93

Hangi yöntemleri kullanmalıyım: IsAuthorized veya OnAuthorization? (veya ne zaman kullanılmalı)

AuthorizationFilterAttributeYetkilendirme mantığınız belirlenen kimliğe ve rollere bağlı değilse genişleteceksiniz . Kullanıcıyla ilgili yetkilendirme için, genişletecek ve kullanacaksınız AuthorizeAttribute. İlk durum için, geçersiz kılacaksınız OnAuthorization. İkinci durum için, geçersiz kılacaksınız IsAuthorized. Bu özniteliklerin kaynak kodundan da görebileceğiniz gibi OnAuthorization, türetiyorsanız geçersiz kılmanız için sanal olarak işaretlenmiştir AuthorizationFilterAttribute. Öte yandan, IsAuthorizedyöntem sanal olarak işaretlenmiştir AuthorizeAttribute. Bunun amaçlanan kullanım için iyi bir gösterge olduğuna inanıyorum.

base.IsAuthorized veya base.OnAuthorization'ı ne zaman aramalıyım?

Bu sorunun cevabı, OO'nun genel olarak nasıl çalıştığına bağlıdır. Bir yöntemi geçersiz kılarsanız, ya tamamen yeni bir uygulama sağlayabilir ya da ebeveyn tarafından sağlanan uygulamaya geri dönebilir ve davranışı geliştirebilirsiniz. Örneğin, durumunu ele alalım IsAuthorized(HttpActionContext). Temel sınıf davranışı, kullanıcıyı / rolü oluşturulan kimliğe karşı filtrede belirtilene göre kontrol etmektir. Diyelim ki, tüm bunları yapmak istiyorsunuz, ancak ek olarak, başka bir şeyi kontrol etmek istiyorsunuz, bir istek başlığına veya başka bir şeye dayalı olabilir. Bu durumda, bunun gibi bir geçersiz kılma sağlayabilirsiniz.

protected override bool IsAuthorized(HttpActionContext actionContext)
{
    bool isAuthroized = base.IsAuthorized(actionContext);
    // Here you look at the header and do your additional stuff based on actionContext
    // and store the result in isRequestHeaderOk
    // Then, you can combine the results
    // return isAuthorized && isRequestHeaderOk;
}

Üzgünüm ama Q3'ü anlamadım. BTW, Yetkilendirme filtresi uzun süredir var ve insanlar onu her türlü şey için ve bazen de yanlış kullanıyor.

Bir şey daha. Ve nihayet burada şunu söyleyen bir adam vardı: OnAuthorization'ı geçersiz kılmamalısınız - çünkü [AllowAnonymous] işlemesini kaçırırsınız.

Bunu söyleyen kişi erişim kontrolünün tanrısı - Dominick. Açıkçası doğru olacak. OnAuthorization(Aşağıda kopyalanmıştır) uygulamasına bakarsanız ,

public override void OnAuthorization(HttpActionContext actionContext)
{
    if (actionContext == null)
    {
        throw Error.ArgumentNull("actionContext");
    }

    if (SkipAuthorization(actionContext))
    {
        return;
    }

    if (!IsAuthorized(actionContext))
    {
        HandleUnauthorizedRequest(actionContext);
    }
}

çağrı, filtrelerin uygulanmasını, yani yetkilendirmenin atlanmasını SkipAuthorizationsağlayan kısımdır AllowAnonymous. Bu yöntemi geçersiz kılarsanız, bu davranışı kaybedersiniz. Aslında, yetkinizi kullanıcılara / rollere dayandırmaya karar verirseniz, bu noktada türetmeye karar vermiş olursunuz AuthorizeAttribute. Teknik olarak her ikisini de yapmak mümkün olsa da, o noktada sizin için kalan tek doğru seçenek geçersiz kılmak olacak IsAuthorizedve zaten geçersiz kılınmak olmayacaktır OnAuthorization.

PS. ASP.NET Web API'de, kimlik doğrulama filtresi adı verilen başka bir filtre vardır. Fikir, adından da anlaşılacağı gibi, bunu kimlik doğrulama ve yetkilendirme için filtre olarak kullanmanızdır. Ancak, bu sınırın sahte olduğu birçok örnek var. Pek çok yetkilendirme filtresi örneği, bir çeşit kimlik doğrulaması yapacaktır. Her neyse, zamanınız varsa ve biraz daha fazla anlamak istiyorsanız, bu MSDN makalesine bir göz atın . Sorumluluk Reddi Beyanı: Benim tarafımdan yazılmıştır.


Tekrar teşekkürler, ancak satırlar arasını okursam, IsAuthenticated, OnAuthirization tarafından yapılan çağrılardır, öyleyse neden OnAuthorizasyonu geçersiz kılmayalım ve base.OnAuthorization'ı çağırıp yanıtı kontrol etmeyeyim?
Royi Namir

Elbette yapabilirsin, eğer istediğin buysa.
Badri

Üçüncü sorumda şunu kastettim: temel işlevi çalıştırdıktan sonra - örneğin, base.OnAuthorization, başarılı olup olmadığını kontrol etmenin tek yolu Response özelliğini incelemektir mi ?, ps örnekler kitabınızdan geliyor :-)
Royi Namir

Evet, bildiğim kadarıyla tipik olarak 401 durum kodunu ararsınız ancak boş değil. BTW, OnAuthorizationkitabımda geçersiz kılma hakkında yazdığımı hatırlamıyorum . Yanıtı null için kontrol etmekle ilgili bir yazı yazmamıştım, çünkü bunu ilk kez duyuyorum :)
Badri

Evet diğer kitapla karıştırdım. Aynı anda 3 kitap okuyorum: güvenlik (sizinki), pratik (sizinki) ve webapi pro (Tugberk's, Zeitler, Ali). Gördüğünüz gibi - orada yaptılar: i.stack.imgur.com/LNGi4.jpg - sadece null olup olmadığını kontrol ettiler, bu yüzden boş veya hata kodlarını kontrol etmeliyim?
Royi Namir

18

Tamam, benim önerim, Web API'nizi korumak için OAuth taşıyıcı jetonları kullandığınızı ve jetonu verdiğinizde kullanıcı için allowTime değerini bir hak talebi olarak ayarladığınızı varsayarak aşağıdakileri yapmanızdır. Belirteç tabanlı kimlik doğrulama hakkında daha fazla bilgiyi buradan okuyabilirsiniz.

  1. AuthorizationFilterAttribute'tan türetilen CustomAuthorizeAttribute oluşturun
  2. yöntemi geçersiz kılın OnAuthorizationAsyncve aşağıdaki örnek kodu kullanın:

     public class CustomAuthorizeAttribute : AuthorizationFilterAttribute
    {
    
        public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
        {
    
            var principal = actionContext.RequestContext.Principal as ClaimsPrincipal;
    
            if (!principal.Identity.IsAuthenticated)
            {
                return Task.FromResult<object>(null);
            }
    
            var userName = principal.FindFirst(ClaimTypes.Name).Value;
            var userAllowedTime = principal.FindFirst("userAllowedTime").Value;
    
            if (currentTime != userAllowedTime)
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Not allowed to access...bla bla");
                return Task.FromResult<object>(null);
            }
    
            //User is Authorized, complete execution
            return Task.FromResult<object>(null);
    
        }
    }
  3. Artık denetleyicilerinizde, bu yetkilendirme mantığını kullanarak denetleyicilerinizi korumak için CustomAuthorize özniteliğini kullanırsınız.

1
Teşekkürler. Ama şu anda AuthorizeAttributehangisini AuthorizationFilterAttribute
kalıtımla

3

ASP.NET v5 Tamamen yeni bir Yetkilendirme Sistemi sundu. .NET 5'i kullanacak olanlar için Microsoft.AspNet.Authorization'a geçmenizi öneririm.

Hem System.Web.Http.Authorizeve hem de System.Web.Mvc.Authorizediğer eski kimlik doğrulama uygulamalarını korumanın neden olduğu karmaşayı hemen hemen tamamlıyor .

Eylem Türleri (Oluşturma, Okuma, Güncelleme, Silme), Kaynaklar, Roller, Talepler, Görünümler, Özel Gereksinimler için çok iyi bir soyutlama sağlar ve yukarıdakilerden herhangi birini birleştirerek özel İşleyiciler oluşturmaya izin verir. Ek olarak bu işleyiciler kombinasyon halinde de kullanılabilir.

ASP.NET v5'te yetkilendirme artık basit bildirim rolü ve yetkilendirmenin gereksinimlerde ifade edildiği ve işleyicilerin bir kullanıcının gereksinimlere karşı iddialarını değerlendirdiği daha zengin bir ilke tabanlı model sağlar. Zorunlu kontroller, kullanıcının erişmeye çalıştığı kaynağın hem kullanıcı kimliğini hem de özelliklerini değerlendiren basit politikalara veya politikalara dayanabilir.


14
Bilmekte fayda var, ama soruya hiç cevap vermiyor.
Zero3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.