این موارد در «قسمت چهاردهم- آماده شدن برای انتشار برنامه» بررسی شدند.
نظرات مطالب
EF Code First #12
بله. البته پس از تائید محتوای آن و انتشار در صفحه اول سایت، بلافاصله دسترسی شما باز خواهد شد.
بازخوردهای پروژهها
تکمیل پروژه و ذکر مثال
لطفا در صورت امکان پروژه را تکمیل و به همراه مثالی انتشار دهید.ممنون
فرض کنید یک سرور را بر روی اینترنت قرار دادهاید و از SMTP Server متعلق به IIS قصد دارید جهت ارسال ایمیل توسط برنامههای خود استفاده نمائید. در این حالت مواردی را باید رعایت نمود تا این سرور تبدیل به سرور رایگان ارسال spam توسط "دشمنان" نشود.
1- پورت پیش فرض را عوض کنید
پورت پیش فرض اتصال به SMTP Server مساوی 25 است. از آنجائیکه به سادگی در برنامههای خود میتوان این پورت را نیز تنظیم نمود، بهتر است به عنوان اولین قدم، این پورت را تغییر داد. یک شماره پورت دلخواه خالی را یافته و بجای 25 قرار دهید. برای این منظور مسیر زیر را طی کنید:
بر روی Default SMTP Virtual Server در کنسول IIS کلیک راست کرده و گزینه خواص را انتخاب کنید. در برگه General روی دکمه Advanced کلیک کرده و در صفحه باز شده سطر مربوط به پورت 25 را یافته، بر روی دکمه Edit کلیک نموده و آنرا به عددی دیگر تغییر دهید.
2- دسترسی عموم را به سرور قطع کنید!
متاسفانه تنظیمات پیش فرض SMTP Server متعلق به IIS در جهت قطع دسترسی "دشمنان" کاملا نادرست بوده و بر مبنای ایده حداقل دسترسی صورت نگرفته است. اگر سرور را به این حال رها کنید فقط "دشمنان" را خوشحال کردهاید.
برای قطع دسترسی دشمنان سه مرحله باید صورت گیرد:
الف) در برگه Access مربوط به تنظیمات SMTP server ، روی دکمه relay کلیک کرده، ابتدا تیک مربوط به Allow all computers which successfully authenticated to relay را بردارید (این مورد در یک شبکه داخلی حائز اهمیت میشود و سایر کامپیوترها را منع میکند). سپس در قسمت بالای صفحه گزینه only the list below را انتخاب کرده و IP آنرا مساوی 127.0.0.1 وارد کنید (یعنی فقط این کامپیوتر مجاز است که از این سرویس جهت ارسال ایمیل استفاده کند؛ نه دشمنان خارجی).
ب) مورد الف را دربارهی قسمت مرتبط با دکمه connections نیز تکرار کنید. (پیش فرض آن تمام عالم است!)
ج) در همین برگهی Access بر روی دکمه Authentication کلیک کرده و فقط تیک مربوط به integrated windows authentication را قرار دهید. (همیشه تحت ویندوز این روش authentication یکی از امنترینها است. همچنین در حالت قرارگیری سرور بر روی اینترنت سخت گیرانهترین حالت ممکن را در اینجا انتخاب کردهایم.)
خوب، با این تنظیم قسمت (ج) دیگر برنامهها با روش متداول قابل به ارسال ایمیل نخواهند بود. یک یوزر معمولی local را به کامپیوتر افزوده (با حداقل دسترسی) و پسورد آنرا در حالت never expires قرار دهید. از این یوزر ویندوزی جهت برقراری امکان اتصال به میل سرور محلی در برنامههای خود استفاده خواهیم کرد (فرض بر این است که برنامهای هم که قرار است ایمیل ارسال کند بر روی همان کامپیوتر سرور قرار دارد).
پس از اعمال این تنظیمات بر روی دکمه apply کلیک کنید، تا تنظیمات اعمال شوند. یکبار نیز میل سرور را استاپ و استارت کنید.
3- تنظیمات ویژه برنامهها برای ارسال ایمیل:
در این حالت برنامههای دات نت شما نیاز به چهار تنظیم اضافهتر پیش از فراخوانی تابع Send دارند:
MailMessage message = new MailMessage("from@site.com", strTo, subject, body)
{
IsBodyHtml = true,
BodyEncoding = Encoding.UTF8
};
SmtpClient client = new SmtpClient("127.0.0.1",portNumber);//portNumber is new
client.UseDefaultCredentials = false; //new
client.DeliveryMethod = SmtpDeliveryMethod.Network; //new
client.Credentials = new NetworkCredential("mail_user", "pass"); //new
client.Send(message);
4- تمامی رخدادهای میل سرور را ثبت کنید.
برای این منظور در برگه general ، تیک مربوط به enable logging را فعال کنید. سپس بر روی دکمه خواص کنار آن کلیک کرده و در صفحه باز شده به برگه extended properties مراجعه نموده و تمامی موارد را تیک بزنید. به ازای هر یک روز فعالیت سرور، یک فایل متنی در مسیر C:\WINDOWS\System32\LogFiles تشکیل خواهد شد.
سؤال چگونه تشخیص دهم که میل سرور من هک شده است یا خیر؟!
اگر موارد فوق را رعایت نکنید، در قسمت current sessions کنسول IIS میتوانید "دشمنان" را مشاهده کنید! همچنین مصرف CPU پروسه inetinfo.exe عملکرد سرور را مختل کرده، بعلاوه در مسیر C:\Inetpub\mailroot\Queue احتمالا چند هزار ایمیل درصف قرار گرفته شده برای ارسال را میتوانید مشاهده کنید! (همینطور در مسیر C:\Inetpub\mailroot\Badmail نیز این تعرض قابل مشاهده است)
اگر این موارد را مشاهده کردید، ابتدا سرور را استاپ کنید، سپس محتویات پوشههای یاد شده را تخلیه کرده و از مرحله یک فوق شروع به اعمال تنظیمات نمائید.
- قسمت اول - نیاز به تامین کنندهی هویت مرکزی
- قسمت دوم - ایجاد ساختار اولیه
- قسمت سوم - بررسی مفاهیم OpenID Connect
- قسمت چهارم - نصب و راه اندازی IdentityServer
- قسمت پنجم - پیاده سازی ورود و خروج از سیستم
- قسمت ششم - کار با User Claims
- قسمت هفتم- امن سازی Web API
- قسمت هشتم- تعریف سطوح دسترسی پیچیده
- قسمت نهم- مدیریت طول عمر توکنها
- قسمت دهم- ذخیره سازی اطلاعات کاربران IDP در بانک اطلاعاتی
- قسمت یازدهم- استفاده از تامین کنندههای هویت خارجی
- قسمت دوازدهم- یکپارچه سازی با اکانت گوگل
- قسمت سیزدهم- فعالسازی اعتبارسنجی دو مرحلهای
- قسمت چهاردهم- آماده شدن برای انتشار برنامه
راهنمای رایگان زیر نحوه نصب ویندوز سرور 2003 تا اس کیوال سرور 2005 ، تنظیمات IIS و نصب SharePoint و ابزارهای لازم برای برنامه نویسی آنرا در یک ماشین مجازی (اینبار در VMware) به صورت مصور و قدم به قدم توضیح داده است.
فهرست مطالب آن:
- Introduction
- Enabling 64-bit Guest OS Support on your Motherboard (if required)
- Creating the Virtual Machine
- Editing the Virtual Machine Settings
- Building Windows
- Configuring Windows
- Patch and Backup
- Domain Promotion and Configuration
- Moss Domain Accounts Creation
- Pop 3 Email Service Configuration
- Moss 2007 Base Installation
- SQL Server 2005 64-bit Enterprise Installation and Configuration
- Create MossSetup login
- Patch and Backup
- Office Enterprise 2007 Installation and Configuration
- SharePoint Designer 2007 Installation
- Visual Studio 2005 Team Developer Edition Installation
- Development Tools Installation
- Force IIS to use 64 bit mode and disable 32 bit mode
- Complete Moss 2007 Installation
- MOSS 2007 Basic Configuration Guide
- Check Search Services and Event Log
- Backup
Download
یا برای مثال این روند از اکسچنج سرور 2007 شروع شد (میل سرور مایکروسافت). نسخه سازمانی این محصول فقط 64 بیتی است.
فرم هایی که اطلاعاتی را از یک کاربر دریافت کرده و به سمت سرور Post میکنند، از مهمترین اجزای لاینفک یک وب سایت میباشند. بی شک همهی ما از چنین فرمهایی حتی در یک پروژهی هرچند کوچک استفاده کردهایم. ممکن است هنگام ارسال این فرمها، کاربری شیطنت به خرج داده و درون یکی از فیلدهای فرم، از عبارتهای HTML و یا یک اسکریپت استفاده کرده باشد. در ASP.Net + MVC از مکانیزم ValidationRequest برای مقابله با چنین حملاتی (XSS) استفاده شده است.
یک فرم با یک Textbox در یک صفحه قرار دهید و درون Textbox یک تگ HTML بنویسید و آنرا به سرور ارسال کنید، در حالت پیش فرض اتفاقی که خواهد افتاد اینست که با یک صفحهی خطا روبرو خواهید شد که به شما هشدار میدهد دادههای ارسال شده، دارای مقادیر غیرمجازی میباشند. شما میتوانید این مکانیزم اعتبارسنجی-امنیتی را غیرفعال کنید. برای غیرفعال کردن آن هم در لینکی که در فوق معرفی گردید توضیحات کافی داده شده است. ولی توصیه میشود برای جلوگیری از حملات XSS هیچگاه این مکانیزم را غیرفعال نکنید، مگر اینکه هیچ دادهای را بدون Encode کردن در صفحه نمایش ندهید.
راههای زیادی برای هندل کردن این خطا و مطلع کردن کاربر وجود دارند و معمولا از صفحهی خطای سفارشی برای اینکار استفاده میشود. اما ایدهی بهتری نیز برای مقابله با این خطا وجود دارد!
فرض کنید اطلاعات فرم شما از طریق Ajax به سرور ارسال میشود و نتیجه بصورت Json به مروگر برگشت داده میشود. در حالت معمول در صورت رخ دادن خطای فوق، سرور کد 500 را برگشت میدهد و تنها راه هندل کردن آن در رویداد error شئ Ajax شما میباشد؛ آنهم با یک پیغام ساده. ولی من ترجیح میدهم به جای صادر کردن خطای 500، در صورت وقوع این خطا آنرا بصورت یک خطای ModelState به کاربر نمایش دهم. به نظر من اینکار وجههی بهتری دارد و ضمنا لازم نیست در هر رویدادی این خطا را هندل کنید. برای رسیدن به این هدف هم چندین راه وجود دارد که سادهترین آنها اینست که یک ModelBinder سفارشی ایجاد کنید و با هندل کردن این خطا، یک پیام خطا را به ModelState اضافه کنید و بعد به MVC بگویید که از این ModelBinder برای پروژهی من استفاده کن. با این روش هرگاه کاربر دادهای حاوی کدهای HTML درون فیلدهای فرم وارد کرده باشد، بدون هیچ کار اضافهای وضعیت ModelState شما Invalid میشود و خطای مدل به کاربر نمایش داده خواهد شد.
ابتدا کلاسی برای ModelBinder سفارشی خود ایجاد کنید و از کلاس DefaultModelBinder ارث بری کنید. سپس با بازنویسی متد BindModel آن منطق خود را پیاده سازی کنید:
در این کلاس ابتدا سعی میکنیم بطور عادی کار را به متد BindModel کلاس پایه بسپاریم. اگر دادههای ارسال شده حاوی کد HTML نباشد، بدون هیچ خطایی Model Binding صورت میگیرد. ولی در صورتیکه کاربر در فیلدی، از کدهای HTML استفاده کرده باشد، یک خطای HttpRequestValidationException رخ خواهد داد که با هندل کردن آن هدف خود را تامین میکنیم.
برای اینکار در قسمت catch بلوک مدیریت خطا، ابتدا یک نمونه از کلاس ModelState را میسازیم. بعد پیام خطای مورد نظر خود را به Errorsهای آن اضافه میکنیم. حال باید یک زوج کلید/مقدار برای این ModelState تعریف کنیم و به bindingContext اضافه کنیم. کلید ما در اینجا نام مدل جاری و مقدار آن هم نام فیلدی از فرم است که سبب بروز این خطا شده است.
حالا نهایت کاری که باید انجام دهیم اینست که در رویداد Application_Start این مدل بایندیگ سفارشی را جایگزین مدل بایندیگ پیش فرض کنیم:
کار تمام است. از حالا به بعد در صورتیکه کاربر در فیلدهای هر فرمی از سایت شما از کدهای HTML استفاده کند دیگر خطایی رخ نمیدهد و فقط ModelState در وضعیت Invalid قرار میگیرد که میتوانید با قرار دادن یک ValidationMessage یا ValidationSummary به راحتی خطا را به کاربر نشان دهید.
یک فرم با یک Textbox در یک صفحه قرار دهید و درون Textbox یک تگ HTML بنویسید و آنرا به سرور ارسال کنید، در حالت پیش فرض اتفاقی که خواهد افتاد اینست که با یک صفحهی خطا روبرو خواهید شد که به شما هشدار میدهد دادههای ارسال شده، دارای مقادیر غیرمجازی میباشند. شما میتوانید این مکانیزم اعتبارسنجی-امنیتی را غیرفعال کنید. برای غیرفعال کردن آن هم در لینکی که در فوق معرفی گردید توضیحات کافی داده شده است. ولی توصیه میشود برای جلوگیری از حملات XSS هیچگاه این مکانیزم را غیرفعال نکنید، مگر اینکه هیچ دادهای را بدون Encode کردن در صفحه نمایش ندهید.
راههای زیادی برای هندل کردن این خطا و مطلع کردن کاربر وجود دارند و معمولا از صفحهی خطای سفارشی برای اینکار استفاده میشود. اما ایدهی بهتری نیز برای مقابله با این خطا وجود دارد!
فرض کنید اطلاعات فرم شما از طریق Ajax به سرور ارسال میشود و نتیجه بصورت Json به مروگر برگشت داده میشود. در حالت معمول در صورت رخ دادن خطای فوق، سرور کد 500 را برگشت میدهد و تنها راه هندل کردن آن در رویداد error شئ Ajax شما میباشد؛ آنهم با یک پیغام ساده. ولی من ترجیح میدهم به جای صادر کردن خطای 500، در صورت وقوع این خطا آنرا بصورت یک خطای ModelState به کاربر نمایش دهم. به نظر من اینکار وجههی بهتری دارد و ضمنا لازم نیست در هر رویدادی این خطا را هندل کنید. برای رسیدن به این هدف هم چندین راه وجود دارد که سادهترین آنها اینست که یک ModelBinder سفارشی ایجاد کنید و با هندل کردن این خطا، یک پیام خطا را به ModelState اضافه کنید و بعد به MVC بگویید که از این ModelBinder برای پروژهی من استفاده کن. با این روش هرگاه کاربر دادهای حاوی کدهای HTML درون فیلدهای فرم وارد کرده باشد، بدون هیچ کار اضافهای وضعیت ModelState شما Invalid میشود و خطای مدل به کاربر نمایش داده خواهد شد.
ابتدا کلاسی برای ModelBinder سفارشی خود ایجاد کنید و از کلاس DefaultModelBinder ارث بری کنید. سپس با بازنویسی متد BindModel آن منطق خود را پیاده سازی کنید:
using System.Web; using System.Web.Mvc; using System.Web.Helpers; using System.Globalization; namespace Parsnet { public class ParsnetModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { try { return base.BindModel(controllerContext, bindingContext); } catch (HttpRequestValidationException ex) { var modelState = new ModelState(); modelState.Errors.Add("اطلاعات ارسالی شما دارای کدهای HTML میباشند."); var key = bindingContext.ModelName; var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key]; modelState.Value = new ValueProviderResult(value, value, CultureInfo.InvariantCulture); bindingContext.ModelState.Add(key, modelState); } return null; } } }
در این کلاس ابتدا سعی میکنیم بطور عادی کار را به متد BindModel کلاس پایه بسپاریم. اگر دادههای ارسال شده حاوی کد HTML نباشد، بدون هیچ خطایی Model Binding صورت میگیرد. ولی در صورتیکه کاربر در فیلدی، از کدهای HTML استفاده کرده باشد، یک خطای HttpRequestValidationException رخ خواهد داد که با هندل کردن آن هدف خود را تامین میکنیم.
برای اینکار در قسمت catch بلوک مدیریت خطا، ابتدا یک نمونه از کلاس ModelState را میسازیم. بعد پیام خطای مورد نظر خود را به Errorsهای آن اضافه میکنیم. حال باید یک زوج کلید/مقدار برای این ModelState تعریف کنیم و به bindingContext اضافه کنیم. کلید ما در اینجا نام مدل جاری و مقدار آن هم نام فیلدی از فرم است که سبب بروز این خطا شده است.
حالا نهایت کاری که باید انجام دهیم اینست که در رویداد Application_Start این مدل بایندیگ سفارشی را جایگزین مدل بایندیگ پیش فرض کنیم:
ModelBinders.Binders.DefaultBinder = new ParsnetModelBinder();
کار تمام است. از حالا به بعد در صورتیکه کاربر در فیلدهای هر فرمی از سایت شما از کدهای HTML استفاده کند دیگر خطایی رخ نمیدهد و فقط ModelState در وضعیت Invalid قرار میگیرد که میتوانید با قرار دادن یک ValidationMessage یا ValidationSummary به راحتی خطا را به کاربر نشان دهید.
نظرات مطالب
خلاصه اشتراکهای روز دو شنبه 16 آبان 1390
سلام
من از reportViewer مایکروسافت برای نشون دادن report های خودم استفاده می کنم
وقتی صفحه رو با ie نگاه می کنم مشکلی وجود نداره اما وقتی صفحه رو با ff نگاه می کنم به دلیل اینکه دکمه print یک ActieX هستش و فقط در ie کار می کنه ؛ در ff دکمه print نمایش داده نمیشه
خیلی جستجو کردم تا راه حلی پیدا کنم اما موفق نشدم
لطفا منو در این زمینه راهنمایی کنید
من از reportViewer مایکروسافت برای نشون دادن report های خودم استفاده می کنم
وقتی صفحه رو با ie نگاه می کنم مشکلی وجود نداره اما وقتی صفحه رو با ff نگاه می کنم به دلیل اینکه دکمه print یک ActieX هستش و فقط در ie کار می کنه ؛ در ff دکمه print نمایش داده نمیشه
خیلی جستجو کردم تا راه حلی پیدا کنم اما موفق نشدم
لطفا منو در این زمینه راهنمایی کنید
دقیقا همینطور هست. در اینجا فناوریهای سمت سرور فقط تبدیل به ارائه کنندهی وب سرویس میشوند و نه بیشتر.
مزیت آن این است که شما با Razor فقط یک سری فرمهای ابتدایی و اعتبارسنجی آنها را به خوبی میتوانید مدیریت کنید. یک مقدار کار UI که پیچیدهتر شد، به صفحهای میرسید که درون آن 100ها سطر کد جیکوئری با کدهای Razor مخلوط شدن و 2 ماه بعد حتی جرات نمیکنید به این صفحه دست بزنید و تغییری را در آن اعمال کنید. اینجا است که فریم ورکهای SPA ارزش خودشان را نشان میدهند.
برای فرمهای معمولی، Razor عالی است. برای UI پیچیده، ترکیب Razor و jQuery اصلا قابلیت نگهداری ندارد (صفحاتی پر از قطعات جاوا اسکریپت که نه فضای نامی دارند، به راحتی تداخل میکنند، عموما از TypeScript استفاده نمیکنند و مبتنی بر قابلیتهای جدید این زبان نیستند). در یک چنین حالتی قابلیت تست UI را هم از دست خواهید داد. همچنین مدام هم محدود به افزونههای جیکوئری خواهید بود، اما با فریم ورکهای SPA، خیلی از این افزونهها، کارهای معمولی آنها هستند. به علاوه زمانیکه back-end (سمت سرور) و front-end (مدیریت کدهای سمت کلاینت) را از هم جدا میکنید، بهتر میتوانید از مزیت کار با طراحان UI استفاده کنید. کسانیکه عموما قرار نیست با کدهای سمت سرور کار کنند.
مزیت آن این است که شما با Razor فقط یک سری فرمهای ابتدایی و اعتبارسنجی آنها را به خوبی میتوانید مدیریت کنید. یک مقدار کار UI که پیچیدهتر شد، به صفحهای میرسید که درون آن 100ها سطر کد جیکوئری با کدهای Razor مخلوط شدن و 2 ماه بعد حتی جرات نمیکنید به این صفحه دست بزنید و تغییری را در آن اعمال کنید. اینجا است که فریم ورکهای SPA ارزش خودشان را نشان میدهند.
برای فرمهای معمولی، Razor عالی است. برای UI پیچیده، ترکیب Razor و jQuery اصلا قابلیت نگهداری ندارد (صفحاتی پر از قطعات جاوا اسکریپت که نه فضای نامی دارند، به راحتی تداخل میکنند، عموما از TypeScript استفاده نمیکنند و مبتنی بر قابلیتهای جدید این زبان نیستند). در یک چنین حالتی قابلیت تست UI را هم از دست خواهید داد. همچنین مدام هم محدود به افزونههای جیکوئری خواهید بود، اما با فریم ورکهای SPA، خیلی از این افزونهها، کارهای معمولی آنها هستند. به علاوه زمانیکه back-end (سمت سرور) و front-end (مدیریت کدهای سمت کلاینت) را از هم جدا میکنید، بهتر میتوانید از مزیت کار با طراحان UI استفاده کنید. کسانیکه عموما قرار نیست با کدهای سمت سرور کار کنند.
حدود یک سال پیش Scott Guthrie از تیم توسعه مایکروسافت جدا شد و به عنوان مدیر جدید به تیم Azure پیوست. او در این مدت با تغییرات بنیادی و اساسی ویندوز Azure رو متحول کرده است.
با انتشار ویژال استودیو 2012 نوبت به Jason Zander رسید که از سمت Corporate Vice President of the Visual Studio engineering team به تیم Azure بپیوندد.
به نظر میرسد که مایکروسافت تمام عیار بر روی Window Azure در حال سرمایهگذاری ست. و تمرکز قویترین و بهترین نیروها در این حوزه موید این مطلب میباشد.
با انتشار ویژال استودیو 2012 نوبت به Jason Zander رسید که از سمت Corporate Vice President of the Visual Studio engineering team به تیم Azure بپیوندد.
به نظر میرسد که مایکروسافت تمام عیار بر روی Window Azure در حال سرمایهگذاری ست. و تمرکز قویترین و بهترین نیروها در این حوزه موید این مطلب میباشد.