Bir önceki yazıda sayfa aksiyonlarının(PageAction) yetki kontrolü için her bir sayfa şablonunun içine(PageTemplate) yetki yoksa AccessDenied.aspx sayfasına git gibisinden bir kod eklemiştik. Sonradan aslında bu kontrolün henüz yönlendirilmeden yapılmasını ve merkezi olması gerektiğini düşünerek kodda bir takım eklemeler yaptım. Bunun için Dynamic data nın route handler(yönlendime kontrolörü) tarafından yapılan işi üstlenmek en doğru çözüm diye düşünerek aşağıdaki sınıfı yazdım
namespace DynLibrary.Entities
{
using System.Web.DynamicData;
using DynLibrary.Helpers;
///
/// Dynamic Data'nın route işlemini gerçekleştiren sınıftan kalıtılmıştır.
///
public class DynRouteHandler : DynamicDataRouteHandler
{
public DynRouteHandler()
: base()
{ }
///
/// Dyanmic data'nın GetActionLink metotunun linki oluşturmak
/// aynı zamanda da sayfanın route edilmesi işlemi sırasında
/// çağırılan metottur. null değeri dönmesi durumunda sayfa handle
/// edilmez, dolayısıyla 404 bulunamadı hatası ile karşılaşılır.
/// Benzer şekilde GetActionLink metotundanda null döneceği için
/// linkler boşalmış olacaktır.
///
///
///
///
///
public override System.Web.IHttpHandler CreateHandler(DynamicDataRoute route, MetaTable table, string action)
{
// action değişkeninden gelen açık değer
// Edit, Update, List, Detail gibi
char cCrudOperation;
switch (action)
{
case "Insert":
cCrudOperation = 'c';
break;
case "List":
cCrudOperation = 'r';
break;
case "Detail":
cCrudOperation = 'r';
break;
case "Edit":
cCrudOperation = 'u';
break;
default:
cCrudOperation = 'r';
break;
}
// Eğer yetki yoksa null değerini dönder
if (!PermissionHelper.CanAccessCrudOperation(table.EntityType.Name, cCrudOperation))
return null;
// Herhangi bir durum yoksa normal şekilde route işlemini gerçekleştir
return base.CreateHandler(route, table, action);
}
}
}
İlgili sınıfı yazdıktan sonra global.asax dosyasında aşağıdaki değişiklik yapılmalıdır. Bu tanımlama ile routehandler sınıfının bizim sınıfımız üzerinden yapılacağını bildirmiş oluyoruz.
Önceki hali:
routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
Model = model
});
Yeni hali:
routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
Model = model,
RouteHandler = new DynRouteHandler()
});
Bu şekilde yetkilendirme işlemini daha yönlendirme bile gerçekleşmeden yapmış olduk. Bu işlemin ardından personel tablosunda edit yetkisi olmayanlar aşağıdaki gibi bir sayfa ile karşılacaklar :)

Faydalı olması dileğiyle, mutlu kodlar!
Ömer Faruk ZORLU
de906c43-661e-4ebe-b3f9-4f40cde603fa|0|.0