Ana içeriğe atla

Kullanıcılara Diğer Kiracıların Düzenlemelerini Engelleme

 Tenant2 kullanıcısının TenantId'sini bazı hizmet çağrılarıyla güncelleyebileceğini ve sunucu tarafında güvenliğini sağlamamız gerektiğini unutmayın .

Buna benzer şekilde, diğer kiracıların kullanıcılarını varsayılan olarak göremese bile aslında onları alıp güncelleyebilir.

Tekrar hackleme zamanı.

Kullanıcılar sayfasını açın, ardından Chrome konsolunu açın ve şunu yazın:

new (Q.getType('StartSharp.Administration.UserDialog'))().loadByIdAndOpenDialog(1)

@Decorators.registerClass("StartSharp.Administration.UserDialog")UserDialog sınıfınızın üstünde olduğunuzdan emin olun

ad alanlı daktilo kullanıyorsanız Chrome konsolunu açın ve şunu yazın:

new MultiTenancy.Administration.UserDialog().loadByIdAndOpenDialog(1)

Gördüğünüz gibi herkes yönetici için kullanıcı iletişim kutusunu açabilir ve güncelleyebilir.

UserDialog , kullanıcı yönetimi sayfasında bir kullanıcı adına tıkladığınızda açılan diyalog sınıfıdır.

Bunun yeni bir örneğini oluşturduk ve kimliğine göre bir kullanıcı varlığının yüklenmesini istedik. Yönetici kullanıcının kimliği 1'dir .

Varlığı ID 1 ile yüklemek için, UserRetrieveHandler'ın Alma hizmetini çağıran iletişim kutusu .

Filtrelemeyi Retrieve değil, UserListHandler yönteminin List yönteminde yaptığımızı unutmayın Dolayısıyla hizmetin bu kaydı başka bir kiracıdan iade edip etmeyeceği konusunda hiçbir fikri yok.

UserRetrieveHandler'da geri alma hizmetini güvenli hale getirmenin zamanı geldi:

 public class UserRetrieveHandler : RetrieveRequestHandler<MyRow, MyRequest, MyResponse>, IUserRetrieveHandler
    {
        public UserRetrieveHandler(IRequestContext context)
             : base(context)
        {
        }

        protected override void PrepareQuery(SqlQuery query)
        {
            base.PrepareQuery(query);

            if (!Permissions.HasPermission(PermissionKeys.Tenants))
                query.Where(MyRow.Fields.TenantId == User.GetTenantId());
        }
    }

Aynı değişiklikleri daha önce UserListHandler'da da yapmıştık.

Aynı Javascript kodunu şimdi denerseniz bir hata alırsınız:

Record not found. It might be deleted or you don't have required permissions!

Ancak kayıt çağırma hizmetini yine de manuel olarak güncelleyebiliriz UpdateBu yüzden UserSaveHandler'ın güvenliğini de sağlamamız gerekiyor .

ValidateRequest yöntemini şu şekilde değiştirin :

protected override void ValidateRequest()
{
    base.ValidateRequest();

    if (IsUpdate)
    {
        if (Old.TenantId != User.GetTenantId())
            Permissions.ValidatePermission(PermissionKeys.Tenants, Context.Localizer);
            
        // ...

Burada bunun bir güncelleme olup olmadığını ve güncellenmekte olan kaydın TenantId'sinin (Old.TenantId) şu anda oturum açmış olan kullanıcının TenantId değerinden farklı olup olmadığını kontrol ederiz . Eğer öyleyse, kullanıcının kiracı yönetimi iznine sahip olduğundan emin olmak için Authorization.ValidatePermission yöntemini çağırırız . Aksi takdirde hata verecektir.

Authorization has been denied for this request!

Kullanıcıların Diğer Kiracılardan Silinmesini Engelleme

UserRepository'de silme ve silme işlemini geri alma işleyicileri vardır ve bunlar benzer güvenlik açıklarından muzdariptir.

Benzer yöntemleri kullanarak bunları da güvence altına almamız gerekiyor:

 public class UserDeleteHandler : DeleteRequestHandler<MyRow, MyRequest, MyResponse>, IUserDeleteHandler
    {
        public UserDeleteHandler(IRequestContext context)
             : base(context)
        {
        }

        protected override void ValidateRequest()
        {
            base.ValidateRequest();

            if (Row.TenantId != User.GetTenantId())
                Permissions.ValidatePermission(PermissionKeys.Tenants, Context.Localizer);
        }

       //...
    }

Eğer silme işlemini geri alan işleyiciniz varsa bunu da doğrulamanız gerekir.

 public class UserUndeleteHandler : UndeleteRequestHandler<MyRow, MyRequest, MyResponse>, IUserUndeleteHandler
    {
        public UserUndeleteHandler(IRequestContext context)
             : base(context)
        {
        }

        protected override void ValidateRequest()
        {
            base.ValidateRequest();

            if (Row.TenantId != User.GetTenantId())
                Permissions.ValidatePermission(PermissionKeys.Tenants, Context.Localizer);
        }

       //...
    }

Bu blogdaki popüler yayınlar

Code generetor ile oluşturulan dosyaların açıklamaları

  1. Sunum (Presentation/UI) Katmanı (Kullanıcı arayüzü - HTML, TypeScript, Dialog, Grid) 🔹 XYZPage.ts 📌 Ne İşe Yarar? Kullanıcı arayüzünün TypeScript tarafındaki tanımıdır. Serenity'nin Dialog ve Grid bileşenlerini içeren bir TypeScript sınıfıdır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcıdan veri almak ve göstermek için kullanılır. 🔹 XYZGrid.ts 📌 Ne İşe Yarar? Tablo (Grid) yapısını oluşturur ve verileri listeler. Filtreleme, sıralama ve sayfalama işlemleri için kullanılır. columnsKey ile hangi kolonların gösterileceğini belirler. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcının verileri listelediği ve etkileşimde bulunduğu yerdir. 🔹 XYZDialog.ts 📌 Ne İşe Yarar? CRUD (Create, Read, Update, Delete) işlemlerini yöneten pencere (modal) bileşeni Kullanıcı form aracılığıyla veri ekler, günceller veya siler. XYZForm.cs ile birlikte çalışır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kull...

Serenity Web Nedir?

   Serenity  , açık kaynak teknolojileri üzerine kurulu bir ASP.NET Core/TypeScript uygulama platformudur. Standart kodlardan kaçınarak, tekrarlanan görevlere harcanan zamanı azaltarak ve en iyi yazılım tasarımı uygulamalarını uygulayarak bakım maliyetlerini düşürürken geliştirmeyi kolaylaştırmayı amaçlamaktadır. Serene  , Serenity platformunu temel alan ücretsiz, açık kaynaklı başlangıç ​​uygulama şablonumuzdur.  Bu dokümantasyon aracılığıyla eğitimimiz ve diğer örnekler için esas olarak Serene'yi kullanacağız. StartSharp  , ücretli müşterilerimize sunduğumuz premium uygulama şablonudur.  Daha gösterişli bir temaya ve bazı ekstra özelliklere  ek olarak Serene'deki her şeyi içerir  .  İkisi de Serenity platformunu temel alıyor. Adında Ne Var Serenity'nin sözlük anlamları  barış  ,  rahatlık  ve  sakinliktir  . Serenity ile bunu başarmaya çalışıyoruz.  Umarız yükledikten ve kullandıktan sonra siz de bu ş...