Esempio n. 1
0
        public override void ExecuteResult(ControllerContext context)
        {
            //-- ایجاد یک تصویر نقشه بیتی 32 بیتی
            Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);

            //-- ایجاد یک شیء گرافیکی برای عملیات ترسیم روی تصویر امنیتی
            Graphics gfxCaptchaImage = Graphics.FromImage(bitmap);

            gfxCaptchaImage.PageUnit      = GraphicsUnit.Pixel;
            gfxCaptchaImage.SmoothingMode = SmoothingMode.HighQuality;

            //-- پاک کردن پس زمینه تصویر امنیتی با یک رنگ سفید
            gfxCaptchaImage.Clear(_backGroundColor);

            //-- ایجاد یک عدد اتفاقی بین 1000 و 9999
            int salt = CaptchaHelper.CreateSalt();


            //-- تاریخ فعلی (فقط روز فعلی) باید به کلید رمزنگاری اطلاعات اضافه شود
            //-- این کار به این هدف متفاوت بودن کلید رمزنگاری اطلاعات در هر روز صورت گرفته است
            string encryptionSaltKey = EncryptionKey + DateTime.Now.Date.ToString();

            //-- چسباندن عدد اتفاقی تولید شده به تاریخ و زمان فعلی با یک جدا کننده
            //-- توضیح: تاریخ و زمان فعلی باید در کورکی ذخیره شود تا هنگام رمزگشایی
            //-- اطلاعات، اختلاف زمانی فی ما بین زمان ارسال فرم به مرورگر کاربر و زمان
            //-- ارسال فرم به سرور توسط کاربر محاسبه شود
            string plainText = salt.ToString() + "," + DateTime.Now.ToString();

            //-- رمزنگاری مقدار متغیر بالا جهت ذخیره در کوکی
            string encryptedValue = (plainText).Encrypt(encryptionSaltKey);

            //-- ذخیره کردن رشته رمزنگاری شده در کوکی
            HttpCookie cookie = new HttpCookie("captchastring");

            cookie.Value = encryptedValue;
            HttpContext.Current.Response.Cookies.Add(cookie);

            //-- تبدیل عدد اتفاقی تولید شده به حروف معادل
            string randomString = (salt).NumberToText(Language.Persian);

            //-- تنظیمات فرمت متن تصویر امنیتی
            var format = new StringFormat();
            int faLCID = new System.Globalization.CultureInfo("fa-IR").LCID;

            format.SetDigitSubstitution(faLCID, StringDigitSubstitute.National);
            format.Alignment     = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            format.FormatFlags   = StringFormatFlags.DirectionRightToLeft;

            //-- نوع و اندازه قلم تصویر امنیتی
            Font font = new Font(CaptchaFontFamily, CaptchaFontSize);

            //-- ایجاد یک مسیر گرافیکی در تصویر امنیتی
            GraphicsPath path = new GraphicsPath();

            path.AddString(randomString,
                           font.FontFamily,
                           (int)font.Style,
                           (gfxCaptchaImage.DpiY * font.SizeInPoints / 72),
                           new Rectangle(0, 0, Width, Height),
                           format);

            Random random = new Random();

            //-- ایجاد رنگ متن تصویر امنیتی به صورت اتفاقی
            Pen pen = new Pen(Color.FromArgb(random.Next(0, 100), random.Next(0, 100), random.Next(0, 100)));

            gfxCaptchaImage.DrawPath(pen, path);

            //-- ایجاد یک موج سینوسی و کسینوسی اتفاقی برای نوشتن حروف کد امنیتی در آن
            int distortion = random.Next(-10, 10);

            using (Bitmap copy = (Bitmap)bitmap.Clone())
            {
                for (int y = 0; y < Height; y++)
                {
                    for (int x = 0; x < Width; x++)
                    {
                        int newX = (int)(x + (distortion * Math.Sin(Math.PI * y / 64.0)));
                        int newY = (int)(y + (distortion * Math.Cos(Math.PI * x / 64.0)));
                        if (newX < 0 || newX >= Width)
                        {
                            newX = 0;
                        }
                        if (newY < 0 || newY >= Height)
                        {
                            newY = 0;
                        }
                        bitmap.SetPixel(x, y, copy.GetPixel(newX, newY));
                    }
                }
            }

            //-- اضافه کردن نویز به تصویر امنیتی
            int i, r, xx, yy, u, v;

            for (i = 1; i < 10; i++)
            {
                pen.Color = Color.FromArgb((random.Next(0, 255)), (random.Next(0, 255)), (random.Next(0, 255)));
                r         = random.Next(0, (Width / 3));
                xx        = random.Next(0, Width);
                yy        = random.Next(0, Height);
                u         = xx - r;
                v         = yy - r;
                gfxCaptchaImage.DrawEllipse(pen, u, v, r, r);
            }

            //-- رسم تصویر امنیتی
            gfxCaptchaImage.DrawImage(bitmap, new Point(0, 0));
            gfxCaptchaImage.Flush();

            //-- خروجی به عنوان یک تصویر jpeg و به صورت جریان به مرورگر کاربر فرستاده می شود
            HttpResponseBase response = context.HttpContext.Response;

            response.ContentType = "image/jpeg";
            context.HttpContext.DisableBrowserCache();
            bitmap.Save(response.OutputStream, ImageFormat.Jpeg);

            //-- آزاد سازی حافظه های اشغال شده
            font.Dispose();
            gfxCaptchaImage.Dispose();
            bitmap.Dispose();
        }