"> توسعه میکروسرویس ها با NET Core 2.1. و Angular 6 - بخش دوم | ام اس پی سافت

توسعه میکروسرویس ها با NET Core 2.1. و Angular 6 – بخش دوم

NET Core 2.1.

در این مقاله میخواهیم راجب توسعه میکروسرویس ها با NET Core 2.1, RabbitMQ, SignalR, EF Core 2.1 and Angular 6. صحبت کنیم. تا پایان این مقاله همراه ما باشید.

میتوانید بخش اول مقاله ما را در لینک‏ زیر مشاهده کنید.

JSON Web Token Generation

Microsoft .NET Core 2.1 از پشتیبانی قوی برای تولید یک JSON Web Token برخوردار است.

روش ایجاد شده در ایجاد Token، اطلاعات مربوط به کاربر را در بر می گیرد clime infrmation شامل user ID ، user IS account، نام ، نام خانوادگی و نام شرکت می باشد.

این اطلاعات برای تأیید اعتبار کاربر در هر درخواست HTTP استفاده می شود.

پس از ایجاد clime information، می توان آن را به عنوان یک رشته رمزگذاری شده در پاسخ API Web برگرداند.

/// 
<summary>
/// Create Token
/// </summary>

/// <param name="userId"></param>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="emailAddress"></param>
/// <param name="companyName"></param>
/// <returns></returns>
public static string CreateToken(int userId, 
                                 string firstName, 
                                 string lastName, 
                                 string emailAddress, 
                                 int accountId, 
                                 string companyName)
{
    var sharedKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(
                                             "CodeProject.Shared.Common.TokenManagement"));

    List<Claim> claims = new List<Claim>
    {
        new Claim(ClaimTypes.Email, emailAddress),
        new Claim(ClaimTypes.NameIdentifier, lastName),
        new Claim(ClaimTypes.GivenName, firstName),
        new Claim(ClaimTypes.Name, companyName),
        new Claim(ClaimTypes.PrimarySid, userId.ToString()),
        new Claim(ClaimTypes.PrimaryGroupSid, accountId.ToString())
    };

    var signinCredentials = new SigningCredentials(sharedKey, SecurityAlgorithms.HmacSha512Signature);

    var tokenDescription = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(claims),
        NotBefore = DateTime.Now,
        Expires = DateTime.Now.AddMinutes(60),
        SigningCredentials = signinCredentials
    };

    var tokenHandler = new JwtSecurityTokenHandler();
    var token = tokenHandler.CreateToken(tokenDescription);
    string tokenString = tokenHandler.WriteToken(token);

    return tokenString;

}

ASP.NET Core 2.1 Web API Configuration and Start Up

ASP.NET Core 2.1 برنامه های اصلی ۲.۱ از استارتاپ برای پیکربندی سرویس های برنامه ها استفاده می کنند و درخواست HTTP برای پردازش pipeline است.

معماری ASP.NET Core 2.1 دارای سیستم های middleware است که قطعاتی از کد هستند که درخواست ها و پاسخ ها را کنترل می کنند.

اجزای Middleware برای ایجاد pipeline به یکدیگر وصل شده اند.

درخواست های ورودی از طریق pipeline عبور می کنند ، جایی که هر واسطه شانس این را دارد که قبل از ارسال درخواست به Middleware بعدی ، مورد پردازش قرار گیرد پاسخ های خروجی به ترتیب معکوس از طریق pipeline می کنند.

معماری Middleware اصلی ترین مبحث ساخت ASP.NET Core 2.1 یک چارچوب نازک و کاملاً سازگار برای ساختن برنامه های وب و cloudy است که می تواند در سیستم عامل های Windows ، Mac و Linux کار کند.

در اصل شما کنترل کاملی در مورد عملکردهایی که در پیکربندی برنامه وب خود خواهید داشت ، دارید.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    /// 

<summary>
    /// This method gets called by the runtime. Use this method to add services to the container.
    /// </summary>


    /// <param name="services"></param>
    public void ConfigureServices(IServiceCollection services)
    {
          
        CorsPolicyBuilder corsBuilder = new CorsPolicyBuilder();

        corsBuilder.AllowAnyHeader();
        corsBuilder.AllowAnyMethod();
        corsBuilder.AllowAnyOrigin();
        corsBuilder.AllowCredentials();

        services.AddCors(options =>
        {
            options.AddPolicy("SiteCorsPolicy", corsBuilder.Build());
        });

        ConnectionStrings connectionStrings = new ConnectionStrings();
        Configuration.GetSection("ConnectionStrings").Bind(connectionStrings);

        services.AddDbContext<AccountManagementDatabase>(
                              options => options.UseSqlServer(
                              Configuration.GetConnectionString("PrimaryDatabaseConnectionString")));
            
        //
        //    Built-In Dependency Injection
        //

        services.AddTransient<IAccountManagementDataService, AccountManagementDataService>();

        services.AddTransient<IAccountManagementBusinessService>(provider =>
        new AccountManagementBusinessService(provider
            .GetRequiredService<IAccountManagementDataService>(), connectionStrings));

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = "https://codeproject.microservices.com",
                ValidAudience = "https://codeproject.microservices.com",
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(
                                       "CodeProject.Shared.Common.TokenManagement"))
            };
        });

        services.AddScoped<SecurityFilter>();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddSignalR();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
           
        app.UseCors("SiteCorsPolicy");
        app.UseAuthentication();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();

        app.UseMvc();
    }  
}

در start up class بالا برای مدیریت برنامه web API موارد زیر پیکربندی شده اند:

  •  CORS Policy Configuration : یک نمونه برنامه cross-origin web ( درخواست های وب با منشأ متقابل) را انجام میدهد.
  • Database Configuration : رشته های اتصال Database را میتوان از تنظیمات برنامه JSON configuration بازیابی کرد و به pipeline تزریق کرد. همچنین Entity Framework Core DbContext و تامین کننده Database (در این حالت ، ارائه دهنده SQL Server پیکربندی می شود) configuring  میشود.
  • Dependency Injection : ASP.NET Core 2.1 از الگوی طراحی نرم افزار injection (DI) software پشتیبانی می کند. که روشی برای دستیابی به Inversion of Control IoC بین classes و وابستگی بین آن هاست. برنامه مدیریت حساب Web API که به یک سرویس تجاری مدیریت حساب و یک سرویس داده مدیریت حساب نیاز دارد. هر دو این سرویس یک رابط را پیاده سازی می کنند و به طور خودکار به سازنده کنترلر Web API Account Account Management تزریق می شوند.
  •  WT Bearer Token Authentication : افزودن تأیید هویت رمز به API Web در ASP.NET Core به کمک نرم افزار JwtBearerAuthentication آسان است. این به شما امکان آن را می دهد که تأیید رمزهایWeb JSON را پیکربندی کنید.
  • Action Filters : فیلترهای موجود در ASP.NET Core 2.1 به شما امکان می دهند تا قبل یا بعد از مراحل خاص در خط لوله پردازش درخواست ، کد را اجرا کنید. برای برنامه نمونه ، Token Web JSON کاربر در هر درخواست وب تجزیه می شود تا اطلاعات درباره کاربر استخراج شود.
  •  Add MVC : با اضافه کردن MVC به خط اجرای درخواست ها ، اطمینان حاصل می شود که کلیه درخواست های برنامه وب شما در چارچوب MVC قابل رویت است ، به این معنی که می توانید از کنترلرها ، نماها و سایر موارد موجود در اجرای MVC استفاده کنید.
  • Add SignalR : پشتیبانی از چارچوب SignalR را فراهم می کند گسترش real-time web را آسان می کند. SignalR امکان برقراری ارتباط دو طرفه بین سرور و مشتری را فراهم می آورد. سرورها می توانند بلافاصله محتوا را به مشتریان انتقال دهند.

Account Management Login Web API

هر میکرو سرویس برای نمونه برنامه با استفاده از JSON web token محافظت می شود. JSON Web Token یک استاندارد (RFC 7419) است یک روش جمع و جور و خودکار را برای انتقال ایمن اطلاعات بین طرفین.

این اطلاعات قابل تأیید هستند زیرا به صورت دیجیتالی امضا شده اند، JWT را می توان با استفاده از یک secret with the HMAC algorithm یا با یک کلید اتصال public/private با استفاده از RSA or ECDSA امضا کرد.

برای ورود به نمونه برنامه ، اقدام به کنترل ورود به سیستم از طریق مدیریت حساب Web API با اعتبار کاربری ( آدرس ایمیل و رمز عبور) به درخواست کلاینت منتقل می شود و روش اقدام به تماس با سرویس تجاری مدیریت حساب انجام می شود.

این تماس برای تأیید اعتبار کاربر پایگاه داده انجام می شود.

پس از ورود موفقیت آمیز ، یک Web Token JSON ایجاد می شود و به برنامه کلاینت برگردانده می شود و در آنجا ادامه خواهد یافت و در local storage کلاینت ذخیره می شود.

JSON Web Token در عنوان هر درخواست کلاینت HTTP ساخته شده به انتهای Web API متصل و اطلاعات را درآنجا درج خواهد کرد.

ASP.NET Core 2.1 با یک built-in dependency ساده حمل می شود.

Dependency injection هسته اصلی ASP.NET Core 2.1 است.

اجازه می دهد تا مؤلفه های برنامه شما از قابلیت تست بالاتری برخوردار باشند و اجزای راحت تر بهم متصل شوند و همینطور به راحتی بتوان قابلیت توسعه را به آن اضافه کرد.

هنگامی که Dependency injection را پیکربندی می کنید ، بسیار مهم است که مدیریت lifetime برنامه خود را درک کنید.

هنگام ثبت Dependency خود به داخل پیش فرض ASP.NET Core 2.1 ، باید در مورد مدیریت Lifetime فکر کنید.

ممکن است شما در استفاده از روش های مختلفی مانند: AddScoped و.AddTransient سرویس متوجه موارد بالا شده باشید.

سه دوره در ASP.NET Core 2.1 Injection وجود دارد:

  •  Transient: سرویس گذرا هر بار injected درخواست می شوند. نمونه جدیدی از object با هر بار درخواست HTTP ایجاد می شود.
  •  Scoped : هر زمان که dependency در همان درخواست HTTP برطرف شود ، خدمات اسکن شده ارائه می شوند. شما می توانید در متن درخواست WEB از آن به عنوان singleleton از آن استفاده کنید.
  •  Singleton service : در هرper DI ساخته می شود. این به طور کلی بدان معنی است که آنها فقط یک بار در هر برنامه ایجاد می شوند و سپس برای کل طول عمر برنامه استفاده می شوند. این همان اجرای الگوی singleleton است.

نمونه برنامه ERP یک برنامه بدون تبعیت از مدلی است زیرا موضوعات هر درخواست Web ایجاد و سپس از بین میروند.

با این حساب ، برنامه ها کاربردی و data access با lifetime گذرا ایجاد میشوند.

Configuring ASP.NET Core 2.1 Web API Endpoints

با پیکربندی .NET Core 2.1 در startup classes آشنا شدید،اکنون می توانید نقاط انتهایی API Web را ایمن سازی کنید.

در زیر کدهایی برای کنترل سفارش/ فروش (Sales Order) آمده است:

این قابلیت در ASP Core 2.2، اوایل با نام Dispatcher معرفی شد که بعدا به Endpoint Routing تغییر نام پیدا کرد و به صورت پیش فرض توسط SetCompatibilityVersion ورژن Version_2_2 به بالا فعال می‌شود.

برای استفاده از Endpoint Routing باید میان‌افزار مربوطه را توسط متد UseEndpointRouting اضافه کنیم.

کار این میان‌افزار تشخیص Endpoint مورد نظر براساس Url درخواستی و Routeهای تعریف شده است و پس از آن می‌توانیم از مقادیر مسیریابی (RouteValues) استفاده کنیم (حتی قبل از رسیدن به محل تعریف Route ها).

  •  Action Filter : The SecurityFilter action filter به کنترلر اضافه می شود که قبل از اجرای هر یک از روش های عملکرد کنترلر ، یک قطعه کد را اجرا می کند.
  •  Authorization : Authorize attribute اضافه میشود که احراز هویت JSON Web Token را انجام می دهد.
  •  EnableCors: EnableCors همانطور که در Startop class پیکربندی به آن پرداخته شده است، CORS police را اجرا می کند.
  • Dependency Injection: به طور خودکار از طریق سازنده کنترلر مدیریت Bussiness service موجودی را تزریق می کند. یک زمینه SignalR نیز از طریق سازنده تزریق می شود.
[ServiceFilter(typeof(SecurityFilter))]
[Authorize]
[Route("api/[controller]")]
[EnableCors("SiteCorsPolicy")]
[ApiController]
public class SalesOrderController : ControllerBase
{
    private readonly IInventoryManagementBusinessService _inventoryManagementBusinessService;

    private IHubContext<MessageQueueHub> _messageQueueContext;

    /// 

<summary>
    /// Sales Controller
    /// </summary>


    public SalesOrderController(IInventoryManagementBusinessService inventoryManagementBusinessService,
                                IHubContext<MessageQueueHub> messageQueueContext)
    {
        _inventoryManagementBusinessService = inventoryManagementBusinessService;
        _messageQueueContext = messageQueueContext;
    }

}

Parsing the JSON Web Token

هنگامی که ASP.NET Core 2.1 را برای استفاده از تأیید هویت JWT Bearer Token پیکربندی می شود، در هر درخواست وب به اطلاعات ارائه شده در نشانه دسترسی خواهید داشت.

همانطور که قبلاً در مرحله راه اندازی و در سطح class level پیکربندی شده بود ، ActionFilter قبل از اجرای هر روش کنترلی API Webاجرا خواهد شد.

ASP.NET Core 2.1 خاصیت HttpContext.User را به عنوان یک هدف ClaimsPrincipal در معرض نمایش قرار می دهد.

هدف کاربر به صورت خودکار توسط ASP.NET Core با JSON Web اطلاعات Tokenجمع می شود.

فیلتر عمل زیر ادعاهای ارائه شده در Web Token JSON را که در قسمت درخواست HTTP درج شده است استخراج می کند و آنها را به یک Class SecurityModel می نویسد.

SecurityModel Class به متن HTTP اضافه می شود تا روش عملکرد کنترلر Web API بتواند اطلاعات را ارجاع داده و این اطلاعات را برای مؤلفه های تجاری و دسترسی به داده ها برای فیلتر و ایمن سازی داده ها در سطح کاربر و حساب ارسال کند.

public class SecurityFilter : IAsyncActionFilter
{
    /// 

<summary>
    /// Action Filter
    /// </summary>


    /// <param name="context"></param>
    /// <param name="next"></param>
    /// <returns></returns>
    public async Task OnActionExecutionAsync(ActionExecutingContext context,
                                             ActionExecutionDelegate next)
    {

        string firstName = context.HttpContext.User.FindFirst(ClaimTypes.GivenName).Value;
        string lastName = context.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
        string emailAddress = context.HttpContext.User.FindFirst(ClaimTypes.Email).Value;
        string companyName = context.HttpContext.User.FindFirst(ClaimTypes.Name).Value
        int userId = int.Parse(context.HttpContext.User.FindFirst(ClaimTypes.PrimarySid).Value);

        int accountId = int.Parse(context.HttpContext.User.FindFirst(
                                  ClaimTypes.PrimaryGroupSid).Value);

        string token = TokenManagement.CreateToken(userId, 
                                                   firstName, 
                                                   lastName, 
                                                   emailAddress, 
                                                   accountId, 
                                                   companyName);

        SecurityModel securityModel = new SecurityModel();
        securityModel.EmailAddress = emailAddress;
        securityModel.FirstName = firstName;
        securityModel.LastName = lastName;
        securityModel.UserId = userId;
        securityModel.AccountId = accountId;
        securityModel.Token = token;

        context.HttpContext.Items["SecurityModel"] = securityModel;

        var resultContext = await next();

    }
}

Sample Application Walkthrough

Angular 6

  • پسورد: www.mspsoft.com
برچسب‌ها:
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.