فلسفهی وجودی «اعتبارسنجی مبتنی بر کوکیها در ASP.NET Core 2.0 » و همچنین «اعتبارسنجی مبتنی بر JWT در ASP.NET Core 2.0 » فراهم آوردن زیر ساختی برای طراحی یک سیستم مستقل اعتبارسنجی، شبیه به ASP.NET Core Identity هست. چون سیستم Identity به صورت پیشفرض از همین زیرساخت مبتنی بر کوکیها استفاده میکند. برای مثال اگر میخواهید با JWT کار کنید و مدیریت کاربران را توسط Idnetity انجام دهید، اینکار برای مثال توسط متد signInManager.PasswordSignInAsync آن قابل انجام نیست؛ چون پس از پایان کار لاگین، یک کوکی را تنظیم میکند و نه یک توکنرا.
این مورد را در قسمت اول ذیل «اما هنوز تعداد زیادی از کتابخانههای Full framework به NET Core. انتقال پیدا نکردهاند »، توضیح دادم.
شما در ASP.NET Core امکان کار با هر دو فریم ورک یاد شده را دارید و این دو به هم وابستگی ندارند. به عبارتی چندین target را دراینجا میتوانید معرفی و استفاده کنید. اگر دات نت 4.6 را هم استفاده کردید، برنامه فقط قابلیت چندسکویی خودش را از دست خواهد داد. برای مثال شما هم اکنون میتوانید EF 6.x را با ASP.NET Core 1.0 استفاده کنید (اگر نمیخواهید تا زمان تکمیل نهایی EF Core صبر کنید). فقط در این حالت باید دقت داشته باشید که کدهای شما بر روی لینوکس اجرا نخواهند شد (چون EF 6.x مبتنی بر دات نت 4x است).
خطای 500، یعنی internal server error، یعنی بروز استثنایی در کدهای شما (و این مورد نیاز به بررسی دقیقی دارد). در مطلب «بررسی خطاهای ممکن در حین راه اندازی اولیه برنامههای ASP.NET Core در IIS» دو روش لاگ کردن آنها ذکر شدهاند. همچنین روشهای دیگری هم برای لاگ کردن خطاها توسط «فریم ورک Logging» وجود دارد. به علاوه گاهی از اوقات بررسی محتوای response بازگشتی از سرور هم مفید است؛ یک نمونه. نکتهی «شبیه سازی customErrors در نگارشهای دیگر ASP.NET» هم مفید است.
- در کل زمانیکه خطای 500 internal server error را دریافت میکنید، اگر
برنامه را در حالت dotnet run اجرا کرده باشید، تمام خطاهای مرتبط، در
پنجرهی کنسولی که باز است، لاگ میشوند. اگر از ویژوال استودیو استفاده
میکنید، همین خروجی، در پنجرهی دیباگ آن هم درج میشود. مرور این خطاهای
سمت سرور، برای رفع مشکل الزامی است. همچنین احتمال دارد
خروجی خطاهای سمت سرور، در قسمت مشاهدهی محتوای response، در برگهی ابزارهای توسعه دهندگان مرورگر هم ظاهر شود. آنرا هم بررسی کنید.
- هیچ کاربری نمیتواند مسیر \:g را در مرورگر خودش باز کند. این مسیر در مرورگر کاربر یعنی اشارهی به درایو G آن شخص و نه سرور شما. مسیر فایل نهایی ذخیره شدهی در سرور را نباید به کاربر بازگشت دهید. این مسیر کامل، فقط کاربرد سمت سرور دارد و جهت ذخیره سازی آن در پوشهای خاص بر روی سرور است. پس از آن باید مسیر نسبی را به کاربر ارائه دهید (نسبی = نسبت به دومین جاری؛ مانند http://mysite/Media/Images/name.jpg).
- الگوی مسیرهای فایلهای ارائه شده باید چنین چیزی باشند: http://site/api/images/file.png و برای ساخت آنها نیاز به مطالعهی مطلب « تغییرات متدهای بازگشت فایلها به سمت کلاینت در ASP.NET Core » را دارید و یا بازگشت مسیر نسبی تصویر نسبت به دومین سایت.
- مابقی مباحث امنیتی آن یکی است (استفاده از سرویس DomSanitizer)
ارتقاء به ASP.NET Core 3.0
در کلاس آغازین برنامههای وب نگارش 3، بجای متد
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
using Microsoft.Extensions.Hosting;
البته امضای قبلی، هنوز هم در نگارش 3 کار میکند؛ اما در نگارشهای بعدی حذف خواهد شد.
به صورت خلاصه هرجائی در برنامهی خود IHostingEnvironment دارید، باید به IWebHostEnvironment تبدیل شود. همچنین اگر از سرویس IApplicationLifetime در جائی استفاده کردهاید، باید به IHostApplicationLifetime تبدیل گردد.
ارتقاء به ASP.NET Core 3.0 و سرنوشت metapackageهای Microsoft.AspNetCore
پس از نصب SDK جدید، اگر دستور dotnet new mvc را صادر کنید، فایل csproj تولید شدهی آن تنها دارای TargetFramework ای معادل netcoreapp3.0 است و نه هیچ مورد دیگری:
بنابراین برای ارتقاء پروژههای قبلی به نگارش 3 آن:
- ابتدا TargetFramework را به netcoreapp3.0 تنظیم کنید.
- سپس تمام PackageReferenceهایی را که به بستههای Microsoft.AspNetCore.All و یا Microsoft.AspNetCore.App اشاره میکنند، حذف کنید.
- ارجاع به بستهی Microsoft.AspNetCore.Razor.Design را نیز حذف کنید.
- اگر پیشتر خاصیت AspNetCoreHostingModel را به حالت درون پروسهای تنظیم کردهاید، آنرا حذف کنید؛ چون حالت پیشفرض نگارش 3 است.
- حذف شدن JSON.NET را مدنظر داشته باشید.
- تغییرات حالت ثبت سرویسهای MVC و Razor Pages و Web API را مدنظر داشته باشید.
پس از نصب SDK جدید، اگر دستور dotnet new mvc را صادر کنید، فایل csproj تولید شدهی آن تنها دارای TargetFramework ای معادل netcoreapp3.0 است و نه هیچ مورد دیگری:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> </PropertyGroup> <ItemGroup> </ItemGroup> </Project>
- ابتدا TargetFramework را به netcoreapp3.0 تنظیم کنید.
- سپس تمام PackageReferenceهایی را که به بستههای Microsoft.AspNetCore.All و یا Microsoft.AspNetCore.App اشاره میکنند، حذف کنید.
- ارجاع به بستهی Microsoft.AspNetCore.Razor.Design را نیز حذف کنید.
- اگر پیشتر خاصیت AspNetCoreHostingModel را به حالت درون پروسهای تنظیم کردهاید، آنرا حذف کنید؛ چون حالت پیشفرض نگارش 3 است.
- حذف شدن JSON.NET را مدنظر داشته باشید.
- تغییرات حالت ثبت سرویسهای MVC و Razor Pages و Web API را مدنظر داشته باشید.
- مسیریابی آن نیز Endpoint routing شدهاست.
- نقطهی آغازین آن نیز بازنویسی شدهاست.
جهت اطلاع
پروژهی DNTIdentity به ASP.NET Core 2.1 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است:
- ابتدا SDK جدید را نصب کنید.
- سپس مجوز SSL آنرا تبدیل به مجوز امن و قابل اطمینان کنید.
- در ادامه به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت SSL 5001 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
پروژهی DNTIdentity به ASP.NET Core 2.1 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است:
- ابتدا SDK جدید را نصب کنید.
- سپس مجوز SSL آنرا تبدیل به مجوز امن و قابل اطمینان کنید.
- در ادامه به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت SSL 5001 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
جهت اطلاع
پروژهی DNTIdentity به ASP.NET Core 2.0 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است
- ابتدا SDK جدید را نصب کنید.
- سپس به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت 5000 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
پروژهی DNTIdentity به ASP.NET Core 2.0 ارتقاء داده شد.
- مشاهدهی لیست کامل تغییرات
برای اجرای آن فقط کافی است
- ابتدا SDK جدید را نصب کنید.
- سپس به پوشهی DataLayer مراجعه کرده و ابتدا دستور dotnet restore را صادر کنید. بعد از آن دو فایل cmd موجود در آنرا اجرا کنید. فایل اول مهاجرتها را تولید میکند و فایل دوم، آنها را به بانک اطلاعاتی از نوع LocalDB اعمال خواهد کرد. بانک اطلاعاتی تولید شده را در پوشهی wwwroot/App_Data میتوانید مشاهده کنید.
- در آخر به پوشهی اصلی برنامه مراجعه کرده و دو فایل bat موجود در آنرا اجرا کنید. اولی وابستگیها را بازیابی میکند و دومی برنامه را کامپایل کرده و سپس بر روی پورت 5000 ارائه میدهد که بلافاصله در مرورگر قابل مشاهده خواهد بود.
برای اجرای این مراحل نیاز به IDE خاصی ندارید. همینقدر که SDK جدید را نصب کرده باشید، کافی است.
in this article, I will show how to take a medium-small demo app written using Visual Studio 2013, ASP.NET 4.5, VC 5, and Entity Framework 6 and turn it into a working ASP.NET 5 app employing Visual Studio 2015, MVC 6 and Entity Framework 7. And the new app will happily run on either the .NET 4.6 CLR or the .NET Core CLR. Let's get started.
ارتقاء به ASP.NET Core 2.1 - معرفی درجهی سازگاری فریم ورک
پس از نصب یک SDK جدید، بهترین روش یافتن تغییرات انجام شده، ایجاد یک پوشهی خالی جدید، باز کردن خط فرمان در این پوشه و سپس صدور دستور dotnet new mvc است. به این ترتیب بدون داشتن هیچ نوع IDE خاصی میتوانید یک پروژهی جدید مبتنی بر آن SDK را ایجاد کنید.
در قالب پیشفرض نگارش 2.1، سطر فعالسازی Mvc به صورت زیر تغییر کردهاست:
در اینجا CompatibilityVersion یک چنین تعریفی را دارد:
برای مثال تنظیم آن به Version_2_0، صرفنظر از نگارش جاری Mvc مورد استفاده، رفتار نگارش 2.0 را برای برنامه تنظیم میکند که البته هدف اصلی آنها در حقیقت چنین چیزی است:
و فلسفهی آن نیز به این صورت است: چگونه یک فریمورک را بهبود ببخشیم، بدون اینکه ارتقاء به نگارشهای جدید را سختتر کنیم؟
برای مثال در نگارش 2.1، اگر بدنهی درخواست رسیده خالی باشد، خطایی را به ModelState اضافه میکند که پیشتر اینگونه نبودهاست و یا ترکیب سیاستهای امنیتی پیش از نگارش 2.1، آنطور که تصور میشده، کار نمیکردهاست و این باگ اکنون اصلاح شدهاست. اگر پس از به روز رسانی به نگارش 2.1، این دو تغییر، برنامهی شما را به هم میریزند، یا میتوانید CompatibilityVersion را به Version_2_0 تعیین کنید (لغو کلی تغییرات رفتاری نگارش 2.1) و یا Version_2_1 را انتخاب کنید و توسط متد AddMvcOptions، گزینههای مختلف این تغییرات انجام شده را به دلخواه انتخاب کنید.
نکتهی مهم: این رفتارها تا ابد نگهداری نخواهند شد. یعنی با ارائهی نگارش 3.0 و انتخاب آن، دیگر دسترسی به رفتارهای قدیمی قابل انتخاب برای نگارش 2.1 نخواهید داشت. به همین جهت در این بین، فرصت بررسی، انطباق و به روز رسانی برنامهی خود را خواهید داشت.
پس از نصب یک SDK جدید، بهترین روش یافتن تغییرات انجام شده، ایجاد یک پوشهی خالی جدید، باز کردن خط فرمان در این پوشه و سپس صدور دستور dotnet new mvc است. به این ترتیب بدون داشتن هیچ نوع IDE خاصی میتوانید یک پروژهی جدید مبتنی بر آن SDK را ایجاد کنید.
در قالب پیشفرض نگارش 2.1، سطر فعالسازی Mvc به صورت زیر تغییر کردهاست:
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
public enum CompatibilityVersion { Version_2_0 = 0, Version_2_1 = 1, Latest = int.MaxValue }
services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) // Give me all of the 2.1 behaviors .AddMvcOptions(options => { options.AllowCombiningAuthorizeFilters = false; // don't combine authorize filters (keep 2.0 behavior) options.AllowEmptyInputInBodyModelBinding = false; // shouldn't treat empty input as valid. });
برای مثال در نگارش 2.1، اگر بدنهی درخواست رسیده خالی باشد، خطایی را به ModelState اضافه میکند که پیشتر اینگونه نبودهاست و یا ترکیب سیاستهای امنیتی پیش از نگارش 2.1، آنطور که تصور میشده، کار نمیکردهاست و این باگ اکنون اصلاح شدهاست. اگر پس از به روز رسانی به نگارش 2.1، این دو تغییر، برنامهی شما را به هم میریزند، یا میتوانید CompatibilityVersion را به Version_2_0 تعیین کنید (لغو کلی تغییرات رفتاری نگارش 2.1) و یا Version_2_1 را انتخاب کنید و توسط متد AddMvcOptions، گزینههای مختلف این تغییرات انجام شده را به دلخواه انتخاب کنید.
نکتهی مهم: این رفتارها تا ابد نگهداری نخواهند شد. یعنی با ارائهی نگارش 3.0 و انتخاب آن، دیگر دسترسی به رفتارهای قدیمی قابل انتخاب برای نگارش 2.1 نخواهید داشت. به همین جهت در این بین، فرصت بررسی، انطباق و به روز رسانی برنامهی خود را خواهید داشت.