2012-03-06 32 views
38

Ben bir denetleyici üzerinde bir yetki niteliği var ama tek eylemi kapatmak istiyorum. Kendi yetkilendirme filtresini oluşturdum ve Roller listesine "Anonim" ekledim. Filtremde, Anonim rol listesinde göründüğünde doğru olarak dönüyorum.Bir MVC denetleyicisinde bir eylemde yetkilendirmeyi devre dışı bırakmak mümkün mü?

Ancak, denetleyici yetki ise başka bir şey önceden empting olarak giriş sayfasına geçmiş olsun görünmüyor.

+0

(1): 'Seni anlayacağından emin değilim, bazı kodlar iyi olurdu. '(2):' Eylem yöntemleri için yetkilendirme niteliklerini ekleyebilirsiniz. – gideon

+0

Özniteliğin kendi sürümünüzü oluşturabilirsiniz. http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3

+0

Elbette, herkes seni anlamıyor gibi görünüyor :). Anlıyorum, ama bir çözüm istedim çünkü aynı konuya sahibim. Bu arada bir şey buldun mu? –

cevap

69

[Authorize] Ekleme denetleyicisi sınıfına ve ardından yetkilendirilmesini istemediğiniz tek eyleme [AllowAnonymous] ekleyin. Örnek:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

Bu yalnızca MVC4 ve üstü üzerinde çalışır, ancak mükemmel çalışır – Nathan

-3

örneğin gerekli olmayan hiç eylem yöntemine AuthorizationAttribute eklemeyin.

Benim özel öznitelik

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

Benim kontrolör

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

Zannederim sizi söylemeye çalışıyorum Ya benim nokta var umuyoruz.

================= Güncelleme Cevap ========================== ===================== aşağıda gibi bir tane daha özelliği oluşturma.

public sealed class AnonymousAttribute : Attribute { } 

Lütfen aşağıdaki yetkiyi OnAuthorization yönteminize ekleyin.

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

Tamam, ancak tüm denetleyici eylemlerinin üzerine filtre eklemek anlamına gelir. İzin filtresini en üstte tutma ve sonra ihtiyacım olan yeri devre dışı bırakma fikrini beğeniyorum. Bu şekilde daha sağlam/güvenli görünüyor. – jaffa

+0

Evet doğru. Bana haber ver, senin için çalışıyor mu, değil mi? Eğer öyleyse lütfen cevap olarak işaretleyin, böylece başkaları için yararlı olacaktır. –

+0

İstediğiniz eylemler hakkında yetki almak için çalışır, ancak OP'nin sorusu değildi. – Kyle

3

Özniteliğin kendi sürümünü oluşturabilirsiniz.

çok benzer bir soru var ve bu durumu ele kendi özelliğini nasıl uygulanacağı oldukça iyi bir cevap var. Btw

Override Authorize Attribute in ASP.NET MVC

. Ayrıca, varsayılan olarak yetkilendirilecek denetleyicinizi de oluşturabilirsiniz.

Taban

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

Kullanımı

public class MyController : SecureControllerBase 
{ 
} 
+0

Teşekkürler, ancak yetkilendirme gerektiren 10 eylem yöntemi ve sadece 1 eylemi olmayan bir denetleyicim var. Denetleyicim tüm eylemlerde (denetleyici tanımının en üstünde yetkilendirme filtresine sahip olarak) yetkilendirmeyi etkinleştirdi, ancak yalnızca bir eylem yönteminde kapatmak istiyorum. – jaffa

+0

Denetleyiciye [İsteğe Bağlı Yetkisiz] ve ardından eylemin üstündeki [İsteğe Bağlı Yetkisiz (yanlış)] eklerseniz? Bu senin için uygun mu? – Tx3

0

Basitçe kontrolör sınıfına filtrelemek istediğiniz Eylemler özelliğini ekleyin ve değil. Eylemleri dekore etmeyerek, denetleyici veya temel denetleyicilerinden birinin özniteliği olmadığı sürece filtrelenmezler.

+2

Kuralın istisnasını istiyorum, bu yüzden denetleyici için açın ve tek bir eylem için kapalı. – jaffa

1

Sadece federe Kimlik Sağlayıcısı ve benim için işe yaramadı kabul edilen yanıt olarak Azure ACS kullanarak bir çözüm yaptık. Mücadele edenler için, çözümüm gerekli kontrol/görüş için güvenliği tamamen atlatmaktı.

Yetkilendirmeyi atlamanız gereken işlemler için yeni bir Denetçi/Görünümler oluşturun.

Ve web

.config ekleyin,

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
İlgili konular