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.

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:
- PermissionAttribute'u Sil
- ModifyPermissionAttribute
- Navigasyonİzin Özniteliği
- ReadPermissionAttribute
- ServiceLookupPermissionAttribute
- PermissionAttribute'u Güncelle
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 Users. Cevabı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 :
- AuthorizeCreateAttribute :
Insert,Modify, veyaReadizin nitelikleri. - AuthorizeDeleteAttribute :
Delete,Modify, veyaReadizin nitelikleri. - AuthorizeListAttribute :
ReadveyaServiceLookupizin nitelikleri. - AuthorizeUpdateAttribute :
Update,Modify, veyaReadizin nitelikleri.
Kimliğe bürünme
- Arayüz
IImpersonatorve onun varsayılan uygulaması ImpersonatingUserAccessor sınıfı, sanki başka bir kullanıcı oturum açmış gibi bir eylemi yürütme seçeneği sunar.
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:

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.

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.