تنظیمات مدت زمان اعتبار کاربران در ASP.NET Identity
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

نکته: در این مقاله کلمه "بازه زمانی" معادل Interval می‌باشد.
اگر از سیستم احراز هویت از طریق کوکی در asp.net Identity 2.1 استفاده می‌کنید، دو تنظیم برای  بررسی پایان یافتن اعتبار کاربر وجود دارد که در نگاه اول، هیچ تفاوتی باهم نداشته و شبیه به هم به نظر می‌رسند: ValidateInterval و ExpireTimeSpan
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(15),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
    },
    SlidingExpiration = false,
    ExpireTimeSpan = TimeSpan.FromMinutes(30)
});

ExpireTimeSpan

CookieAuthenticationOptions.ExpireTimeSpan یک خصیصه است که به شما اجازه می‌دهد تا مدت زمان اعتبار کوکی ساخته شده توسط Identity را مشخص کنید. در مثال بالا، کوکی به مدت 30 دقیقه از زمان ایجاد آن، معتبر است. هنگامی که این 30 دقیقه به پایان برسد، کاربر باید مجددا لاگین کند، چون SlidingExpiration به false تنظیم شده است.
اگر SlidingExpiration مقدار true داشته باشد، کوکی بعد از هر درخواستی که پس از گذشت بیش از نیمی از مدت زمان مشخص شده در ExpireTimeSpan ارسال شود، مجددا ایجاد خواهد شد. برای مثال در اینجا (با توجه قطعه به کد بالا) اگر کاربر login شود و درخواست بعدی را پس از گذشت 16 دقیقه ارسال کند، کوکی به مدت 30 دقیقه دیگر معتبر خواهد شد. اما اگر کاربر پس از لاگین، در خواست بعدی را 31 دقیقه بعد ارسال کند، باید مجددا عمل لاگین را انجام دهد.

بازه زمانی اعتبارسنجی SecurityStampValidator

ValidateInterval از تابع SecurityStampValidator.OnValidateIdentity، فیلد SecurityStamp را بعد از گذشت یک بازه زمانی بررسی می‌کند تا از اعتبار کوکی اطمینان حاصل شود. این همان بررسی منقضی شدن کوکی نیست، اگرچه می‌تواند سبب همان عملکرد و یا لاگ آوت کاربر شود.
Security Stamp هربار که رمز عبور ایجاد یا عوض شود و یا یک لاگین خارجی (External Login) ایجاد یا حذف شود، به روز می‌شود. اگر کاربر رمز عبورش را تغییر دهد این فیلد تغییر خواهد کرد و این تغییر باعث می‌شود که در بررسی مجدد این فیلد پس از مدت زمان مشخص شده در ValidateInterval، کوکی نامعتبر شناخته شود و کاربر را مجبور به لاگین مجدد کند.
نکته: در صورتی که بخواهید به صورت دستی مقدار این فیلد را تغییر دهید می‌توانید از کد زیر استفاده کنید:
UserManager.UpdateSecurityStampAsync(userId);
برای درک بهتر مثال زیر را در نظر بگیرید:
  1. کاربر در مکان A لاگین می‌شود.
  2. همان کاربر مکان خود را تغییر داده و ده دقیقه بعد در مکان B لاگین می‌شود.
  3. کاربر رمزعبورش را در مکان B در دقیقه 12ام تغییر می‌دهد.
  4. کاربر به مکان A برمی گردد و یک درخواست را در دقیقه 20ام ارسال می‌کند.
  5. چون کاربر یک درخواست را بعد از مدت زمان مشخص شده در ValidateInterval (یعنی 15 دقیقه) در مکان A ارسال می‌کند، پس عملیات چک کردن فیلد SecurityStamp انجام می‌شود و از آنجایی که این فیلد به علت تغییر رمز عبور، به روز شده است، بنابراین کاربر لاگ آوت خواهد شد.
دلیل لاگ آوت شدن کاربر در این سناریو، با حالتی که کوکی منقضی می‌شود تفاوت دارد، چون مدت زمان انقضای کوکی یعنی 30 دقیقه (در این مثال) هرگز نمی‌رسد. درعین حال کاربر لاگ آوت می‌شود چون مقدار validateInterval بر روی 15 دقیقه تنظیم شده است.

تفاوت این دو چیست؟
تفاوت دو حالت در نگاه اول خیلی ظریف است اما این تفاوت مزایای بزرگی فراهم می‌کند، مانند لاگ آوت کردن از هر مکان. اما این ویژگی می‌تواند گیج کننده هم باشد از آنجا که الگوی پیش فرض ASP.NET Identity فقط validateInterval را دارد و ExpireTimeSpan به طور صریح ذکر نشده و مقدار پیش فرض آن روی 14 روز تنظیم شده است.
  • #
    ‫۷ سال و ۱۰ ماه قبل، دوشنبه ۱۰ آبان ۱۳۹۵، ساعت ۱۶:۵۹
    با سلام.
    اگر یک نفر با چندین سیستم به وبسایت لاگین کرده باشه، چطور میشه همه لاگین‌ها رو لاگ آف کرد؟ با این فرض که در سایر سیستم‌ها (( مرا به خاطر بسپار)) رو هم فعال کرده باشه.
    • #
      ‫۷ سال و ۱۰ ماه قبل، دوشنبه ۱۰ آبان ۱۳۹۵، ساعت ۱۷:۱۹
      در کدهای فوق این تغییر را اعمال کنید (تعیین زمان بررسی مجدد معتبر بودن security stamp کاربر):
       validateInterval: TimeSpan.FromSeconds(0)
      یک مثال
      • #
        ‫۷ سال و ۱۰ ماه قبل، دوشنبه ۱۰ آبان ۱۳۹۵، ساعت ۱۸:۵۹
        با تشکر از جوابتون.
        من به صورت زیر تغییر دادم ولی بازم برنامه رو توی دو تا بروسر ران میکنم و با یک کاربر لاگین میکنم و وقتی با یکیشون لاگ آف میکنم اون یکی لاگین میمونه.
        Provider = new CookieAuthenticationProvider
                        {
                            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager<ApplicationUser>, ApplicationUser>(
                            validateInterval: TimeSpan.FromSeconds(0),
                            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
                        },

        • #
          ‫۷ سال و ۱۰ ماه قبل، دوشنبه ۱۰ آبان ۱۳۹۵، ساعت ۲۲:۵۵
          «.. اون یکی لاگین میمونه ..»
          پس از خروج یکی، لاگین‌های دیگر، با اولین درخواستی که به سرور ارسال می‌کنند، وادار به لاگین مجدد خواهند شد (چون بازه زمانی اعتبارسنجی security stamp موجود در کوکی، با اطلاعات جدید کاربر در سرور، به صفر تنظیم شده‌است). بنابراین این مورد صرفا با به روز رسانی security stamp کاربر در بانک اطلاعاتی عملی می‌شود که باید در حین logoff انجام شود:
          await _userManager.UpdateSecurityStampAsync(user.Id);