برنامههایی که بخواهند سازگار با GDPR باشند، باید اصل 17 ام آن را که حق فراموش شدن است «Right to erasure ('right to be forgotten') »، پیاده سازی کنند؛ به علاوه اشخاص باید بتوانند اطلاعات شخصی خودشان را نیز بدون درنگ از آن سایت دریافت کنند. به عبارتی اگر شخصی در سایت شما ثبت نام کرد، باید قسمتی را هم در آن درنظر بگیرید که کاربر با فشردن یک کلیک، بتواند اکانت فعلی خودش را برای همیشه محو و نابود کند؛ بدون اینکه اثری از آن باقی بماند. همچنین پیش از این عمل نیز باید بتواند با کلیک بر روی یک دکمه، کلیه اطلاعات شخصی خودش را دانلود و ذخیره کند. از زمان ASP.NET Core Identity 2.1، هر دو مورد جزئی از این فریم ورک شدهاند:
روش پیاده سازی دریافت اطلاعات شخصی در ASP.NET Core Identity 2.1
اگر به IdentityUser نگارشهای اخیر ASP.NET Core Identity دقت کنید، شامل ویژگی جدید PersonalData نیز هست:
PersonalData یک نشانهگذار است و هدف از آن، مشخص کردن خواصی است که شخص میتواند درخواست دریافت اطلاعات مرتبط با آنها را بدهد.
سپس زمانیکه در تصویر فوق بر روی دکمهی download کلیک کرد، ابتدا توسط userManager.GetUserAsync، اطلاعات کاربر جاری از بانک اطلاعاتی دریافت شده و سپس حلقهای بر روی تمام خواص شیء IdentityUser تشکیل میشود. در اینجا هر کدام که مزین به PersonalDataAttribute بود، مقدارش دریافت شده و به دیکشنری personalData اضافه میشود.
در آخر این اطلاعات با فرمت JSON، جهت دریافت به کاربر ارائه خواهد شد:
روش پیاده سازی دادن «حق فراموش شدن» به کاربران
اگر به تصویر ارسال شده دقت کنید، یک دکمهی Delete نیز در آن قرار دارد. کار آن، حذف واقعی و فیزیکی کاربر جاری و تمام اطلاعات وابستهی به او از بانک اطلاعاتی است. این دکمه نیز بدون هیچ واسطی در اختیار خود کاربر قرار گرفتهاست. یعنی به این صورت نیست که ابتدا فرمی را پر کند و سپس شخص دیگری اکانت او را حذف کند.
روش پیاده سازی آن نیز به صورت زیر است:
برای اینکه کاربر بتواند درخواست حذف اکانت خود را صادر کند، باید ابتدا کلمهی عبور خود را نیز وارد کند. همانطور که مشاهده میکنید توسط متد CheckPasswordAsync سرویس userManager، کار صحت کلمهی عبور درخواستی بررسی میشود. سپس سطر زیر، اکانت او را حذف میکند:
موجودیت کاربر با سایر موجودیتهای دیگری که در ارتباط است، به صورت OnDelete(DeleteBehavior.Cascade) تنظیم شدهاست. یعنی اگر این کاربر حذف شود، تمام اطلاعات او در سایر جداول وابسته نیز به صورت خودکار حذف خواهند شد.
و در آخر، کوکی جاری شخص لاگین شده را نیز حذف میکند تا برای همیشه با او خداحافظی کند!
روش پیاده سازی دریافت اطلاعات شخصی در ASP.NET Core Identity 2.1
اگر به IdentityUser نگارشهای اخیر ASP.NET Core Identity دقت کنید، شامل ویژگی جدید PersonalData نیز هست:
public class IdentityUser<TKey> where TKey : IEquatable<TKey> { [PersonalData] public virtual TKey Id { get; set; }
سپس زمانیکه در تصویر فوق بر روی دکمهی download کلیک کرد، ابتدا توسط userManager.GetUserAsync، اطلاعات کاربر جاری از بانک اطلاعاتی دریافت شده و سپس حلقهای بر روی تمام خواص شیء IdentityUser تشکیل میشود. در اینجا هر کدام که مزین به PersonalDataAttribute بود، مقدارش دریافت شده و به دیکشنری personalData اضافه میشود.
var personalData = new Dictionary<string, string>(); var personalDataProps = typeof(TUser).GetProperties().Where( prop => Attribute.IsDefined(prop, typeof(PersonalDataAttribute))); foreach (var p in personalDataProps) { personalData.Add(p.Name, p.GetValue(user)?.ToString() ?? "null"); }
Response.Headers.Add("Content-Disposition", "attachment; filename=PersonalData.json"); return new FileContentResult(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(personalData)), "text/json");
روش پیاده سازی دادن «حق فراموش شدن» به کاربران
اگر به تصویر ارسال شده دقت کنید، یک دکمهی Delete نیز در آن قرار دارد. کار آن، حذف واقعی و فیزیکی کاربر جاری و تمام اطلاعات وابستهی به او از بانک اطلاعاتی است. این دکمه نیز بدون هیچ واسطی در اختیار خود کاربر قرار گرفتهاست. یعنی به این صورت نیست که ابتدا فرمی را پر کند و سپس شخص دیگری اکانت او را حذف کند.
روش پیاده سازی آن نیز به صورت زیر است:
var user = await _userManager.GetUserAsync(User); if (user == null) { return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); } RequirePassword = await _userManager.HasPasswordAsync(user); if (RequirePassword) { if (!await _userManager.CheckPasswordAsync(user, Input.Password)) { ModelState.AddModelError(string.Empty, "Password not correct."); return Page(); } }
var result = await _userManager.DeleteAsync(user);
و در آخر، کوکی جاری شخص لاگین شده را نیز حذف میکند تا برای همیشه با او خداحافظی کند!
await _signInManager.SignOutAsync();
پ.ن.
ما در این سایت هیچگاه شما را فراموش نخواهیم کرد!