2016-04-06 22 views
1

MVC uygulamasında kullanmak üzere özel bir AuthorizeAttribute oluşturmaya çalışıyorum. Etiket, Kullanıcılar tablosunu kontrol edecek ve kullanıcının yönetici olup olmadığını kontrol edecektir. Yeterince basit. Bana kafa karıştırıcı neMVC Özel Yetkilendirme Özniteliği davranışı

[AttributeUsage(AttributeTargets.All, AllowMultiple=false, Inherited = true)] 
public class AdminOnlyAttribute : AuthorizeAttribute { 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 

     using (var db = new ArtContext()) { 
      var user = db.Users 
       .Where(x => x.UserId == httpContext.User.Identity.Name) 
       .FirstOrDefault(); 

      if (user != null) 
       if (user.IsAdministrator) 
        return true; 
     } 

     return false; 
    } 
} 

Ana kontrolör, bu özelliğe sahip süslenmiş olsa bile, hala çağrılan ediliyor, yani ve kullanıcıların bir UID/PWD için istemde ediliyor.

Etiket, filtre yapılandırmasına kaydedildiğinde yürütüldü mü? Bunu kendi başına (görünüşte) yürütmekten sakınmanın bir yolu var mı?

DÜZENLEME

Ben filtre küresel kayıtlı vardı. Tüm filtrelerin kullanılmadan önce kaydedilmesi gerektiğini düşündüm, bu yüzden her şey benim tarafımdan anlaşılmadı!

public class FilterConfig { 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 
     filters.Add(new HandleErrorAttribute()); 
     //filters.Add(new AdminOnlyAttribute()); 
    } 
} 
+0

Bu, Rolleri yalnızca tasarladıkları şey için kullandıysanız daha kolay olurdu. Yönetici rolü oluşturun, ardından Yönetici rolü parametresiyle standart Yetkilendirme özelliğini kullanın. Bu, standart yetki özniteliği herhangi bir veritabanı erişimi yapmadığından, çok daha iyi performans gösterecektir. –

+0

@ErikFunkenbusch daha basit olurdu, ancak başka bir aktif dizin grubundan ayrılmaktan uzak durmak istedik. –

cevap

1

Genel bir filtre olarak kaydettiğinizde, sitenizdeki her yere uygulanır. Denetleyicilerinizi/yöntemlerinizi [AllowAnonymous] özniteliği ile dekorasyona alarak geçersiz kılabilirsiniz.

+0

O kadardı! Kullanmadan önce herhangi bir filtrenin kayıtlı olması gerektiğini düşündüm. Bütün bu konu benim anlayış eksikliğimdi! Onu global filtre yapılandırmasından kaldırdım ve şimdi beklendiği gibi çalışıyor. –

İlgili konular