Ana içeriğe atla

Kimlik Doğrulama ve Yetkilendirme

  

Serenity, ASP.NET Core'da entegre kimlik doğrulama ve yetkilendirme sistemlerini kullanır ve aşağıdakileri mümkün kılmak için bazı ek soyutlamalar ve yardımcı sınıflar sağlar:

  • Web uygulamaları dışındaki ortamlarda çalışabilecek,
  • Kaynaklara ayrıntılı erişim için serbest biçimli izin anahtarları
  • Veri işleme ve sorgulama için bildirime dayalı izinler
  • Kullanıcı kimliğine bürünme
  • İzinlerin geçici olarak verilmesi

ASP.NET Core güvenliği hakkında daha fazla bilgi için aşağıdaki belgeye bakın:

ASP.NET Temel Güvenlik Konuları - Microsoft Docs

IUserAccessor Arayüzü

ASP.NET Core uygulamalarındaki mevcut kullanıcıya erişilebilir HttpContext.Userancak bu kullanıcıya doğrudan erişim Serenity'yi yalnızca web uygulamalarına bağlar.

Bunu özetlemek ve Serenity'yi konsol, masaüstü ve diğer uygulama türleri için de kullanışlı kılmak için bir IUserAccessor arayüzü sağlıyoruz .

Bu arayüzün varsayılan uygulaması, web uygulamalarında HttpContext.User'ı kullanır ancak diğer uygulama/test türleri için farklı şekilde uygulanabilir.

IPermissionService ve IUserRetrieveService Soyutlamaları

Ayrıca izin kontrolü (yetkilendirme) ve kullanıcı ayrıntılarının alınması için aşağıdaki soyutlamaları da sağlıyoruz.

Çerçevenin kendisi bu soyutlamalar için varsayılan bir uygulamaya sahip olmadığından, bağımlılık enjeksiyonu yoluyla uygulamanın kendisinde sağlanmalıdır.

Serene / StartSharp uygulamalarının özel uygulamaları vardır ve bunları şuraya kaydedin Startup.cs:

services.AddSingleton<IUserRetrieveService, 
    Administration.UserRetrieveService>();
services.AddSingleton<IPermissionService,
    Administration.PermissionService>();

Kendi uygulamanızı yazmaya çalışmadan önce bu örnek uygulamalara göz atabilirsiniz.

İzin Anahtarları

Serenity, navigasyon, sayfalar ve hizmet çağrıları gibi kaynaklara atanan serbest biçimli izin anahtarlarını temel alan ayrıntılı bir kullanıcı erişim kontrol sistemine sahiptir.

İzinler, kullanıcılara doğrudan veya bir dizi izne sahip olabilen atanmış roller aracılığıyla dolaylı olarak atanabilir.

Bu izinler kullanıcılara doğrudan veya rol atamaları yoluyla dolaylı olarak verilebilir.

İzin ekranı

Yukarıdaki ekranda bahsettiğimiz izin tuşlarının metinsel temsillerini görüyoruz, ancak bunlar dahili olarak aşağıdaki serbest biçimli dizelere karşılık geliyor:

  • "Administration:DataAuditLog"
  • "Administration:DataExplorer"
  • "Administration:EmailQueue"
  • "Administration:Translation"
  • "Administration:Security"

Bildirime Dayalı İzin Nitelikleri

Serenity'nin, belirli eylemleri gerçekleştirmek için gereken izin anahtarını bildirimsel olarak belirleyen çeşitli izin özellikleri vardır:

Bu izin nitelikleri, varlıklar gibi çeşitli kaynak türlerine atanır:

    [ReadPermission("Administration:Security")]
    [ModifyPermission("Administration:Security")]
    [LookupScript(Permission = "Administration:Security")]
    public sealed class UserRow
    {
        // ...
    }

Yukarıdaki örnekte varlığa ilişkin okuma, değiştirme ve arama izinleri User" " olarak atanmıştır Administration:Security.

Örneğin, bir kullanıcıyı oluşturmak, güncellemek ve silmek için farklı izinler atamak istiyorsak:

    [ReadPermission("Administration:User:Read")]
    [InsertPermission("Administration:User:Insert")]
    [UpdatePermission("Administration:User:Update")]
    [InsertPermission("Administration:User:Delete")]
    [LookupScript(Permission = "Administration:Security")]
    public sealed class UserRow
    {
        // ...
    }

Ayrıntılı izinlere sahip olmak, her zaman bunları kullanmanız gerektiği anlamına gelmez. Her varlık türü ve her eylem türü için farklı izinlerin tanımlanmasını/atanmasını önermiyoruz çünkü bu, bunların yönetimini ve bakımını çok zorlaştıracaktır.

Genel kural, bu kadar ayrıntılı bir kontrole gerçekten ihtiyaç duyulmadığı sürece yeni bir izin anahtarı sunmayın.

Örneğin Serene'de "Administration:Security"hem Userve Rolevarlıklar hem de diğer birçok işlem için izin atadık. manage only RolesOnlara bireysel izin anahtarları atamadan önce, bir yöneticinin , başka bir yöneticinin yapması gereken gerçek bir iş gereksinimi olup olmadığını kendinize sormalısınız manages only UsersCevabınız evet ise ayrı izinler tanımlayın, değilse ihtiyacınız olana kadar bekleyin.

Bu, Ekle/Güncelle/Sil izinleri için de aynıdır. Yalnızca kullanıcıları oluşturmak için bir yöneticiye, yalnızca kullanıcıları güncellemek için başka bir yöneticiye ve yalnızca silmek için başka bir yöneticiye mi ihtiyacınız var?

İzin Anahtarı Tanımları

İzin anahtarlarının kendileri genellikle statik bir sınıfta tanımlanır:

namespace Serene.Administration
{
    [NestedPermissionKeys]
    [DisplayName("Administration")]
    public class PermissionKeys
    {
        [Description("User, Role Management and Permissions")]
        public const string Security = "Administration:Security";

        [Description("Languages and Translations")]
        public const string Translation = "Administration:Translation";
    }
}

Bu zorunlu olmasa da yaygın bir uygulamadır ve bunlara intelli-sense yoluyla erişmeyi kolaylaştırmak, görünen adlarını belirlemek ve yazım hatalarından kaçınmak önerilir.

Eylemler için Yetki Nitelikleri

İzinleri doğrulamayı kolaylaştırmak için yerleşik ASP.NET [Authorize]özniteliğine ek olarak bazı öznitelikler sağlıyoruz.

İzni otomatik olarak doğrulayan bir izin anahtarı parametresini kabul eden aşırı yüklemeleri vardır .

İkisi arasındaki fark, kimliği doğrulanmamış erişim girişimlerini ele alma biçimlerinde yatmaktadır. Öznitelik [PageAuthorize]bir istisna atarken, [ServiceAuthorize]AJAX çağrı dostu hizmet hatası sağlar.

ServiceAuthorizeAyrıca, hedef türün sahip olduğu ilk özelliği kullanarak bir dizi izin niteliğini kontrol ederek hedef türden (genellikle bir varlık/satır türü) izin anahtarını okuyan özniteliğin özel sürümleri de vardır :

Kimliğe bürünme

Bu, daha sınırlı izinlere sahip bir kullanıcı oturum açmış durumdayken, bir yönetici veya başka bir ayrıcalıklı kullanıcı bağlamında özel izinler gerektiren bir hizmeti çağırmak için yararlı olabilir.

ImpersonatingUserAccessorarayüzü uygulayan herhangi bir sınıfı sarar IUserAccessorve buna kimliğe bürünme yeteneği ekler.

Varsayılan olarak kaydedilmediğinden bu özelliği kullanmak için Startup.cs'ye kaydetmeniz gerekir:

services.AddSingleton<IHttpContextItemsAccessor, HttpContextItemsAccessor>();
services.AddSingleton<IUserAccessor>(services => 
    new ImpersonatingUserAccessor(
        ActivatorUtilities.CreateInstance<Administration.UserAccessor>(services), services.GetRequiredService<IHttpContextItemsAccessor>());

IUserAccessorDaha sonra, geçici kimliğe bürünmeye ihtiyaç duyduğunuz her yerde, hizmeti şu adrese yayınlamalısınız IImpersonator:

public class SomeHandler : IRequestHandler 
{
    private IUserAccessor userAccessor;

    public SomeHandler(IUserAccessor userAccessor)
    {
        this.userAccessor = userAccessor ?? 
            throw new ArgumentNullException(nameof(userAccessor));
    }

    public void SomeMethod()
    {
        var impersonator = (IImpersonator)userAccessor;

        // lets say current user is "test" here
        impersonator.Impersonate("admin");
        try 
        {
            // here current user is "admin"
            PerformSomeOperationAsAdmin();
        }
        finally
        {
            impersonator.UndoImpersonate();
        }
        // here current user becomes "test" again
    }
}

Farklı Giriş Yapın (kimliğe bürünme de denir)

StartSharp ayrıca kullanıcı yönetimi sayfasında başka bir kullanıcı olarak oturum açma (örn. taklit etme) seçeneği de sunar:

Kullanıcının kimliğine bürün

Varsayılan olarak yalnızca süper yönetici (örn. adminkullanıcı) bu işlemi gerçekleştirebilir.

Kullanıcı adının yanındaki casus simgesine sağ tıklayıp menü öğesini kullanabilirsiniz open-in new incognito window.

Kimliğine bürünülmüş kullanıcı

Aynı tarayıcı penceresinde açılmaya izin vermiyoruz çünkü bu, geçerli kullanıcının oturumunun kapatılması anlamına gelecektir.

Geçici Olarak İzin Verme

Bazen bir yöneticinin kimliğine bürünmek yerine kullanıcıya geçici olarak (örneğin geçici olarak) bazı izinler vermek daha iyi olabilir. ITransientGrantor arayüzü ve onun varsayılan uygulaması TransientGrantingPermissionService tam da bunu yapabilir.

Yine, varsayılan olarak etkin değildir ve şu adreste kayıt yapılmasını gerektirir Startup.cs:

services.AddSingleton<IHttpContextItemsAccessor, HttpContextItemsAccessor>();
services.AddSingleton<IPermissionService>(services => new   
    TransientGrantingPermissionService(
        ActivatorUtilities.CreateInstance<Administration.PermissionService>(services),
        services.GetRequiredService<IHttpContextItemsAccessor>()));

Daha sonra bunu kimliğe bürünmeye benzer şekilde kullanabilirsiniz:

public class SomeHandler : IRequestHandler 
{
    private IPermissionService permissions;

    public SomeHandler(IPermissionService permissions)
    {
        this.permissions = permissions ?? 
            throw new ArgumentNullException(nameof(permissions));
    }

    public void SomeMethod()
    {
        var transientGrantor = (ITransientGrantor)permissions;

        transientGrantor.Grant("Administration:Security");
        try 
        {
            // here the current user temporarily has
            // "Administration:Security" permission
            PerformSomeOperationAsAdmin();
        }
        finally
        {
            transientGrantor.UndoGrant();
        }
        // here no longer
    }
}

Geçici izin vermenin bellekte yapıldığını ve hiçbir yerde saklanmadığını lütfen unutmayın.

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 ş...