SORU
26 EKİM 2008, Pazar


Neden AuthorizeAttribute kimlik doğrulama ve yetkilendirme hataları için giriş sayfasına yönlendirme yapıyor mu?

ASP.NET MVC, böyle AuthorizeAttribute, denetleyici bir yöntem işaretlemek:

[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
    // ...
}

Bu, şu anda oturum-kullanıcı "CanDeleteTags" rolünü kontrol yöntemi hiç denecek. anlamına gelir

Ne yazık ki, başarısızlık her zaman HTTP durumunu döndürür HttpUnauthorizedResult döner için 401 kod. Bu oturum açma sayfasına yeniden yönlendirme neden olur.

Eğer kullanıcı giriş yapmış ise, değil mi, bu çok mantıklı. Eğer kullanıcı isezatenoturum, ama gerekli rolü değil, kafa karıştırıcı oturum açma sayfasına geri göndermek için.

AuthorizeAttribute kimlik doğrulama ve yetkilendirme noktada buluşturur. gibi görünüyor.

Bu ASP.NET MVC içinde gözden kaçmış bir bit gibi görünüyor, ya da ben bir şey eksik?

İki ayıran DemandRoleAttribute pişirmek zorunda kaldım. Kullanıcı kimliği değil, 401, oturum açma sayfası için onları göndermeden döndürür HTTP. Kullanıcı oturumu, ama gerekli rolü değil, NotAuthorizedResult Bir yerine oluşturur. Şu anda bu bir hata sayfasına yönlendirir.

Kesinlikle bunu yapmak zorunda değil mi?

CEVAP
30 NİSAN 2011, CUMARTESİ


İlk geliştirildiğinde, Sistemi.Web.Mvc.AuthorizeAttribute doğrusunu yaptı - HTTP belirtimi her ikisi için de durum kodu 401 kullanılan eski revizyonlar "" ve "". doğrulanmamış izinsiz

Özgün özellikler:

Eğer istek zaten Yetkilendirme kimlik bilgileri dahil olursa, o zaman 401 yanıt yetkilendirme bu kimlik bilgileri için Red edildiğini gösterir.

Aslında, karışıklık şurada kelimesini kullanır gördüğünüz "anlamına geldiği halde""". kimlik doğrulama, yetkilendirme Günlük pratikte, ancak, daha mantıklı bir 403 kullanıcı kimliği doğrulanmış değil ama yetkili olduğunda Yasak dönmek için yapar. Kullanıcı erişim - kötü kullanıcı deneyimi etrafında verecek ikinci bir kimlik bilgileri kümesi var ... pek de olası değil.

Çoğu işletim sistemleri düşünün - erişim izniniz yok bir dosyayı okumaya çalıştığınızda, oturum açma ekranı gösterilir değil mi!

Neyse ki, HTTP özellikleri güncellendi (Haziran 2014) belirsizlik kaldırmak için.

"Hiper Metin Aktarım Protokolü (HTTP/1.1):" (RFC 7235): . Kimlik

() Yetkisiz 401 durum kodu isteği hedef kaynak için geçerli kimlik bilgilerine sahip olmadığından uygulanmamıştır gösterir.

"Köprü metni Aktarım Protokolü (HTTP/1.1): Anlambilim ve İçerik" (RFC 7231):

403 (Yasak) durum kodu, sunucu isteği kabul etmiştir, ancak yetki reddediyor gösterir.

İlginçtir ki, MVC 1 serbest bırakıldı ASP.NET zamanda AuthorizeAttribute davranışı doğru idi. Şimdi, bu davranış yanlıştır - HTTP/1.1 belirtimi giderilmiştir.

Yerine değiştirmeye ASP.NET'giriş sayfasına yönlendirir ler, daha kolay oluyor. Aynı isim ile yeni bir öznitelik (AuthorizeAttribute) oluşturabilirsinizweb sitenizin varsayılan ad(bu çok önemli) sonra derleyici otomatik olarak MVC standart yerine bir fark olacak Tabii ki, her zaman oldukça bu yaklaşım olsaydın özniteliği yeni bir isim verebilirsin.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009