نکته: در این مقاله کلمه "بازه زمانی" معادل 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);
برای درک بهتر مثال زیر را در نظر بگیرید:
- کاربر در مکان A لاگین میشود.
- همان کاربر مکان خود را تغییر داده و ده دقیقه بعد در مکان B لاگین میشود.
- کاربر رمزعبورش را در مکان B در دقیقه 12ام تغییر میدهد.
- کاربر به مکان A برمی گردد و یک درخواست را در دقیقه 20ام ارسال میکند.
- چون کاربر یک درخواست را بعد از مدت زمان مشخص شده در ValidateInterval (یعنی 15 دقیقه) در مکان A ارسال میکند، پس عملیات چک کردن فیلد SecurityStamp انجام میشود و از آنجایی که این فیلد به علت تغییر رمز عبور، به روز شده است، بنابراین کاربر لاگ آوت خواهد شد.
دلیل لاگ آوت شدن کاربر در این سناریو، با حالتی که کوکی منقضی میشود تفاوت دارد، چون مدت زمان انقضای کوکی یعنی 30 دقیقه (در این مثال) هرگز نمیرسد. درعین حال کاربر لاگ آوت میشود چون مقدار validateInterval بر روی 15 دقیقه تنظیم شده است.
تفاوت این دو چیست؟
تفاوت دو حالت در نگاه اول خیلی ظریف است اما این تفاوت مزایای بزرگی فراهم میکند، مانند
لاگ آوت کردن از هر مکان. اما این ویژگی میتواند گیج کننده هم باشد از آنجا که الگوی پیش فرض ASP.NET Identity فقط validateInterval را دارد و ExpireTimeSpan به طور صریح ذکر نشده و مقدار پیش فرض آن روی 14 روز تنظیم شده است.