دادن «حق فراموش شدن» به کاربران در ASP.NET Core Identity 2.1
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

برنامه‌هایی که بخواهند سازگار با 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 نیز هست:
public class IdentityUser<TKey> where TKey : IEquatable<TKey>
{
   [PersonalData]
   public virtual TKey Id { get; set; }
PersonalData یک نشانه‌گذار است و هدف از آن، مشخص کردن خواصی است که شخص می‌تواند درخواست دریافت اطلاعات مرتبط با آن‌ها را بدهد.
سپس زمانیکه در تصویر فوق بر روی دکمه‌ی 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");
}
در آخر این اطلاعات با فرمت JSON، جهت دریافت به کاربر ارائه خواهد شد:
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();
    }
}
برای اینکه کاربر بتواند درخواست حذف اکانت خود را صادر کند، باید ابتدا کلمه‌ی عبور خود را نیز وارد کند. همانطور که مشاهده می‌کنید توسط متد CheckPasswordAsync سرویس userManager، کار صحت کلمه‌ی عبور درخواستی بررسی می‌شود. سپس سطر زیر، اکانت او را حذف می‌کند:
var result = await _userManager.DeleteAsync(user);
موجودیت کاربر با سایر موجودیت‌های دیگری که در ارتباط است، به صورت OnDelete(DeleteBehavior.Cascade) تنظیم شده‌است. یعنی اگر این کاربر حذف شود، تمام اطلاعات او در سایر جداول وابسته نیز به صورت خودکار حذف خواهند شد.
و در آخر، کوکی جاری شخص لاگین شده را نیز حذف می‌کند تا برای همیشه با او خداحافظی کند!
await _signInManager.SignOutAsync();

 

پ.ن.
ما در این سایت هیچگاه شما را فراموش نخواهیم کرد!
  • #
    ‫۵ سال قبل، دوشنبه ۲۵ شهریور ۱۳۹۸، ساعت ۱۴:۵۲
    سلام و تشکر
    در مورد "قسمتی را هم در آن درنظر بگیرید که کاربر با فشردن یک کلیک، بتواند اکانت فعلی خودش را برای همیشه محو و نابود کند؛ بدون اینکه اثری از آن باقی بماند "
    دو سوال داشتم.
    ممکنه آی دی کاربر به صورت کلید خارجی در جداول دیگر استفاده شده باشه. در اینصورت وقتی بخواهیم اطلاعات کاربر را حذف کنیم چطور باید این مشکل فعالیت‌های کاربر که به صورت کلید خارجی در جداول دیگر داریم رو حذف نکنیم؟ مثلا در همین سایت اگر من مطالبی ثبت کرده باشم و بخواهم اکانتم رو حذف کنم باید اون مطالبی هم که قبلا در سایت ثبت کردم کاملا حذف بشه؟ اگر اینطوری باشه به نظرم یه ایرادت دیگری به وجود میاد.

    همینطور در مورد "
    با کلیک بر روی یک دکمه، کلیه اطلاعات شخصی خودش را دانلود و ذخیره کند."

    این اطلاعات به صورت Json برای کاربر نمایش داده میشه تا دانلود کنه. خوب امکان برعکسش هم باید داشته باشیم؟ یعنی مثلا من در سایتی  اکانتم رو حذف کرده بودم ولی حالا به دلایلی میخوام اکانتم رو دوباره برگردانم [شبیه اینستاگرام] باید اون فایل Json رو دوباره روی سایت آپلود کنم تا همان اطلاعات کاربری قبلی ام را برگردان کند؟

    • #
      ‫۵ سال قبل، دوشنبه ۲۵ شهریور ۱۳۹۸، ساعت ۱۵:۴۹
      هدف از فراموش شدن، دقیقا «کاملا» فراموش شدن هست؛ حتی در بک‌آپ‌های شما هم نباید اثری از آن شخص باقی بماند. این‌ها را با یک متخصص GDPR مطرح کنید و همچنین مباحث فلسفی پشت آن‌را هم خارج از این سایت پیگیری کنید؛ چون الان به نظر با درک قسمت «حق» فراموش شدن، مشکل هست، چه برسد به پیاده سازی آن. گاهی از اوقات هدف از یک مطلب یا قابلیت این نیست که حتما باید از آن استفاده کرد. هدف، طرح موضوع مرتبط با آن است؛ حداقل برای چند ثانیه‌ای فکر کردن.