PDA

View Full Version : سوال: حذف لینک ایمیل فعالسازی ارسال شده توسط Identity



OmMiD_MtWo
یک شنبه 22 فروردین 1395, 18:27 عصر
با سلام و عرض خسته نباشید خدمت اساتید گرامی
بنده از Identity برای امنیت سایت استفاده کردم و با استفاده از کدی که در Register Action به صورت پیش فرض وجود دارد، ایمیل تاییدی رو به ایمیل کاربر میفرستم:

string code = await UserManager.GenerateEmailConfirmationTokenAsync(us er.Id);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

حال قصد دارم تا در برنامه اعلام کنم که این لینک فقط برای بار اول که کاربر بر روی آن کلیک میکند، فعال است و اگر از داخل ایمیل برای بار دوم روی لینک کلیک کرد، لینک غیرفعال باشد و یا به کاربر اعلام کنم که همچین لینکی وجود ندارد. چه طور در برنامه این رو پیاده سازی کنم؟ به غیر از اینکه userId رو از QueryString بگیرم و از دیتابیس چک کنم که اگر ایمیل کاربر فعال شده بود، به کاربر پیغام بدهد که لینک فعالسازی استفاده شده است! من قصد دارم تا به طور کلی لینک فعالسازی غیرفعال باشد.
سوال بعدی این که این در خط اول یک متغیر از نوع string تعریف شده که یک کد فعالسازی برای ایمیل درست میکنه! من هر چی تو برنامه رو جستجو کردم، ندیدم که این کد برای یک کاربر جایی ذخیره بشه حتی در کوکی! پس این کجا ذخیره میشه که در Action ConfirmEmail ، این کد به همراه userId رو میگیره و ایمیل اون کاربر رو با استفاده از این کد فعال میکنه! اگر کسی از دوستان میدونه که این کد در کجا ذخیره میشه، ممنون میشم بگه...

hakim22
دوشنبه 23 فروردین 1395, 04:09 صبح
این کد جایی ذخیره نمیشه.
این کد بر اساس مقدار درون SecurityStamp ساخته میشه.
هر وقت یکی از فیلدهای درون ردیف مربوط به مشخصات کاربر تغییر کنه مقدار SecurityStamp تغییر میکنه.
بر همین اساس هم عدد تولید شده برای تایید پیامک و همینطور لینک تایید ایمیل تغییر خواهد کرد.
هر وقت Identity نیاز به چک کردن این عدد داشته باشه دوباره اونو از روی SecurityStamp میسازه.

شما می توانید در اکشن مربوط به به ConfirmEmail که کاربر وقتی رو لینک کلیک میکنه به اون ارجاع داده میشه کدی بنویسید که تایید ایمیل رو بررسی کنه و به کاربر پیغام بده که ایمیل قبلا تایید شده.

همینطور اگر در پروژه امکان تغییر ایمیل وجود داره باید بعد از تغییر ایمیل مقدار EmailConfirmed رو روی false تنظیم کنید.

OmMiD_MtWo
دوشنبه 23 فروردین 1395, 04:45 صبح
سپاس از پاسخ شما دوست عزیز
سوال دیگر اینکه چون security stamp یک guid هست، امکان تغییر اون به صورت دستی وجود دارد یا مکانیز identity به صورت خودکار باید این فیلد رو تغییر دهد؟

hakim22
دوشنبه 23 فروردین 1395, 06:22 صبح
متدی برای آپدیت مقدار اون از طریق UserManager وجود داره.



UserManager.UpdateSecurityStampAsync(userId);