PDA

View Full Version : سوال: مشکل MSCaptcha در UserControl با فشرده سازی ViewState



hamedsabzian
یک شنبه 23 خرداد 1389, 18:31 عصر
با سلام خدمت دوستان عزیز!
من از کنترل MSCaptcha به عنوان تصویر امنیتی استفاده می کنم. و البته ViewState صفحات رو هم فشرده می کنم (خیلی حال میده! توصیه می کنم حتما این کار رو بکنید).
تا حالا مشکلی نیست. این هم کد Captcha:

<%@ Register Assembly="MSCaptcha" Namespace="MSCaptcha" TagPrefix="SecImage" %>

<SecImage:CaptchaControl ID="CC1" runat="server" NoiseColor="MediumBlue" ForeColor="#3366FF"
CaptchaHeight="40" CaptchaWidth="150" Font-Size="5px" ValidationGroup="A" CaptchaBackgroundNoise="Extreme"
CaptchaLineNoise="High" FontColor="CornflowerBlue" LineColor="Cornsilk" />
این هم به web.config اضافه شده:

<httpHandlers>
<add path="CaptchaImage.axd" verb="GET" type="MSCaptcha.CaptchaImageHandler, MSCaptcha" />
</httpHandlers>

وقتی MSCaptcha رو توی یک UserControl میزارم و UserControl رو توی صفحه، وقتی میخوام Captcha رو Validate کنم با خطایی مبنی بر این که Key مقدارش نباید null باشه مواجه میشم. (عکس در ضمایم موجود است). وقتی دیگه ViewState رو فشرده نمی کنم، مشکل حل میشه. (خارج UserControl ها در هردو حالت هیچ مشکلی نیست)
Validate:
CC1.ValidateCaptcha(TBCC.Text);
if (!CC1.UserValidated)
{
Utility.ShowReport(Page, "کد امنیتی اشتباه است", MessageType.Error);
return;
}

به نظر میاد MSCaptcha یه چیزی توی ViewState ذخیره میکنه و وقتی من Validation رو انجام میدم، هنوز ViewState بازیابی نشده، پس خطا میده.
دوستان بزرگوار، لطف کنن بگن چرا این اتفاق می افته؟
نمی تونم بیخیال استفاده از MSCaptch توی UserControl بشم. لطفا راه کار بدید.
با تشکر!

ضمایم:
1. عکس پیغام خطا.
2. MSCaptcha.dll (متاسفانه سورسش رو ندارم)

hamedsabzian
یک شنبه 23 خرداد 1389, 22:13 عصر
من SavePageStateToPersistenceMedium و LoadPageStateFromPersistenceMedium رو برای Compressing و DeCompressing ویو استست override می کنم.
آیا متد دیگه ای هست که به جای LoadPageStateFromPersistenceMedium استفاده کنم، به طوری که قبل از این که Captcha بخواد کاری بکنه، ViewState رو بازیابی کنه؟
لطفا کمک کنید!
private ObjectStateFormatter _formatter = new ObjectStateFormatter();
protected override void SavePageStateToPersistenceMedium(object viewState)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
_formatter.Serialize(ms, viewState);
byte[] viewStateArray = ms.ToArray();
ClientScript.RegisterHiddenField("__COMPRESSEDVIEWSTATE", Convert.ToBase64String(CompressViewState.Compress( viewStateArray)));
}
protected override object LoadPageStateFromPersistenceMedium()
{
string vsString = Request.Form["__COMPRESSEDVIEWSTATE"];
byte[] bytes = Convert.FromBase64String(vsString);
bytes = CompressViewState.Decompress(bytes);
return _formatter.Deserialize(Convert.ToBase64String(byte s));
}

hamedsabzian
دوشنبه 24 خرداد 1389, 02:14 صبح
به نظرتون مشکل از این Handler نیست؟

<httpHandlers>
<add path="CaptchaImage.axd" verb="GET" type="MSCaptcha.CaptchaImageHandler, MSCaptcha" />
</httpHandlers>
اساتید بزرگ، نظری ندارن؟
اگه راه حل راه حل اینه که بی خیال MSCaptcha بشم و برم سراغ یه Captcha دیگه، اشکال نداره! ولی خواهش می کنم منو تنها نزارید! :گریه: