نمونه مثالی از ASP.NET Core و Entity Framework Core به همراه معماری DDD و CQRS و Event Sourcing
Full ASP.NET Core 2.2 application with DDD, CQRS and Event Sourcing
Technologies implemented:
- ASP.NET Core 2.2 (with .NET Core 2.2)
- ASP.NET MVC Core
- ASP.NET WebApi Core
- ASP.NET Identity Core
- Entity Framework Core 2.2
- .NET Core Native DI
- AutoMapper
- FluentValidator
- MediatR
- Swagger UI
Architecture:
- Full architecture with responsibility separation concerns, SOLID and Clean Code
- Domain Driven Design (Layers and Domain Model Pattern)
- Domain Events
- Domain Notification
- CQRS (Imediate Consistency)
- Event Sourcing
- Unit of Work
- Repository and Generic Repository
- تنظیمات اولیه ASP.NET Identity 2.1 با Web API
- ایجاد Account Confirmation به وسیله Identity به همراه تنظیمات policy برای user name و password
- توسعه OAuth Json Web Token Authentication به کمک Web API و Identity
- ایجاد یک سیستم Role Based و تایید صلاحیتهای مربوط به آن
- توسعه Web API Claims Authorization در Identity 2.1
- توسعه بخش front-end با AngularJs
تنظیمات اولیه ASP.NET Identity 2.1 با Web API
1. تنظیمات ASP.Net Identity 2.1
1-1. ساخت یک پروژه Web API
در ابتدا ما یک empty solution را با نام "AspNetIdentity" همانند شکل مقابل میسازیم.
یک ASP.NET Web Application با نام "AspNetIdentity.WebApi" را به این solution اضافه مینماییم. در بخش select template ما empty template را انتخاب میکنیم. همچنین در قسمت add folders and core references for: نیز هیچیک از گزینهها را انتخاب نمیکنیم.
1-2. نصب packageهای مورد نیاز از Nuget
در زیر packageهای مورد نیاز برای ASP.NET Web API و Owin را مشاهده میکنید. همچنین packageهای مربوط به ASP.Net Identity 2.1 نیز در زیر قرار داده شدهاند.
Install-Package Microsoft.AspNet.Identity.Owin -Version 2.1.0 Install-Package Microsoft.AspNet.Identity.EntityFramework -Version 2.1.0 Install-Package Microsoft.Owin.Host.SystemWeb -Version 3.0.0 Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.2.2 Install-Package Microsoft.Owin.Security.OAuth -Version 3.0.0 Install-Package Microsoft.Owin.Cors -Version 3.0.0
1-3. اضافه کردن user class و database context
حال که تمامی پکیجهای مورد نیاز را به پروژه خود اضافه نمودیم، قصد داریم تا اولین کلاس EF را با نام "ApplicationUser" به پروژه اضافه کنیم. این کلاس، کاربری را که قصد ثبت نام در membership system، دارد را نمایش میدهد. برای این کار ما یک کلاس جدید را به نام "ApplicationUser" میسازیم و کلاس "Microsoft.AspNet.Identity.EntityFramework.IdentityUser" را در آن به ارث میبریم.
برای این کار ما یک پوشهی جدید را در برنامه با نام "Infrastructure" میسازیم و درون آن کلاس ذکر شده را اضافه میکنیم:
public class ApplicationUser : IdentityUser { [Required] [MaxLength(100)] public string FirstName { get; set; } [Required] [MaxLength(100)] public string LastName { get; set; } [Required] public byte Level { get; set; } [Required] public DateTime JoinDate { get; set; } }
پس از افزودن کلاس User، نوبت به اضافه نمودن Db Context است. این کلاس وظیفهی ارتباط با پایگاه داده را بر عهده دارد. ما یک کلاس جدید را با نام ApplicationDbContext، به پوشهی Infrastructure اضافه مینماییم. کد مربوط به این کلاس به صورت زیر است:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { Configuration.ProxyCreationEnabled = false; Configuration.LazyLoadingEnabled = false; } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } }
همانطور که ملاحظه میکنید این کلاس از IdentityDbContext ارث بری نموده است. این کلاس یک نسخهی جدیدتر از DbContext است که تمامی نگاشتهای Entity Framework Code First را انجام میدهد. در ادامه ما یک Connection String را با نام DefaultConnection در فایل web.config اضافه مینماییم.
همچنین متد static ایی را با نام Create که در تکه کد فوق از سوی Owin Startup class فراخوانی میگردد که در ادامه به شرح آن نیز خواهیم پرداخت.
ConnectionString قرار داده شده در فایل web.config در قسمت زیر قرار داده شده است:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=.\sqlexpress;Initial Catalog=AspNetIdentity;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings>
قدم 4: ساخت پایگاه داده و فعال سازی DB Migration
حال ما باید EF CodeFirst Migration را برای آپدیت کردن دیتابیس، بجای دوباره ساختن آن به ازای هر تغییری، فعال نماییم. برای این کار بایستی در قسمت NuGet Package Manager Console عبارت زیر را وارد نماییم:
enable-migrations add-migration InitialCreate
اگر تا به اینجای کار تمامی مراحل به درستی صورت گرفته باشند، پوشهی Migration با موفقیت ساخته میشود. همچنین پایگاه داده متشکل از جداول مورد نیاز برای سیستم Identity نیز ایجاد میشود. برای اطلاعات بیشتر میتوانید مقالات مرتبط با Code First را مطالعه نمایید. ساختار جداول ما باید به صورت زیر باشد:
در بخش بعدی، کلاسهای مربوط به UserManager را ایجاد خواهیم کرد و پس از آن فایل Startup Owin را برای مدیریت کاربران، تشریح میکنیم.
SQL Server 2014 DML Triggers are often a point of contention between Developers and DBAs, between those who customize a database application and those who provides it. They are often the first database objects investigated when the performance degrades. They seem easy to write, but writing efficient Trigger, though complex have a very important characteristic: they allow solving problems that cannot be managed in any other application layer. Therefore, if you cannot work without them, in this article you will learn tricks and best practices for writing and managing them efficiently.
امن سازی برنامههای ASP.NET Core توسط IdentityServer 4x - قسمت نهم- مدیریت طول عمر توکنها
MSDN Magazine: March 2014 منتشر شد
Modern software development practices value quick and continuous updates, following processes that minimize the impact of software failures. As important as identifying bugs early, finding out if changes are improving business value are equally important. These practices can only work when a monitoring solution is in place. This article explores options for adding observability to .NET Core apps. They have been collected based on interactions with customers using .NET Core in different environments. We will be looking into OpenTelemetry and Application Insights SDKs to add observability to a sample distributed application.