2011-02-23 23 views
5

System.Web.Mvc.AuthorizeAttribute'dan türetilen özel bir yetkilendirme özniteliği yazdım. Belirli özelliklere erişimi kısıtlamak için kontrolörlerimden başarıyla kullanıyorum.Yetkilendirme kodu mantığının çoğaltılması nasıl engellenir

public class ArticleController : Controller 
{ 
    [CustomAuthorize(Role.Administrator)] 
    public ActionResult Delete(int id) 
    { 
     // ... 
    } 
} 

Ve bu iyi çalışıyor. Şimdi HTML öğelerini aynı yetkilendirme mantığına göre göstermek veya gizlemek istiyorum. Örneğin, "Makale" görünümünde, kullanıcı yönetici değilse "Sil" eylem düğmesini gizlemek istiyorum.

<ul id="menu"> 
    <li>@if (User.IsInRole(Role.Administrator)) { 
      @Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null) 
     } </li> 
</ul> 

O da gayet iyi çalışıyor, ancak bir eylemi gerçekleştirmek için iki kez gerekli credientials belirtmeniz gerekir çünkü kod mantık tekrarını oluşturur: Böyle bir şey yazdık kontrolörü olarak

  • eylemi engellemek veya izin vermek.
  • Eylem linkini göstermek veya gizlemek için.

Bu çoğaltmanın önlenmesinin en iyi yolu nedir? Özel yetkilendirme özelliğimi görünümlerden yeniden kullanmanın bir yolu var mı?

cevap

3

Özel bir yardımcı en iyi seçenek, gibi bir şey olmalıdır.

1

Menüyü kısmi olarak görüntüleyin.

1

Bunun için özel bir html yardımcı programı oluştururdum.

public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper, 
string actionName, ... , Role role) 

Ve Rol parametresi gereksiz hissediyorum, sen Reflection kullanarak kontrolör eylemi incelemek ve otomatik olarak izin rolleri belirleyebilir. Geçerli kullanıcı/rol bu bağlantıyı izni olup olmadığını görmek için bu yardımcı hizmet çeşit kontrol ediyorum

@Html.SecureActionLink("Delete", "Delete", "Article") 

:

İlgili konular