برنامه جاری طوری تنظیم شده که اگر فایل dotnet_run.bat یا دستور «dotnet watch run» را اجرا کنید، تمام عملیات و خطاهای سمت سرور را در برنامه‌ی کنسول dotnet نمایش می‌دهد. فقط کافی است محتوای پنجره‌ی کنسول آن‌را بررسی کنید.
ASP.NET Core در نگارش فعلی آن برای خطای 500 یا Internal server error (خطای سمت سرور که باید لاگ و بررسی شود)، حتی اگر CORS را تنظیم کرده باشید، هدرهای آن‌را ارسال نمی‌کند. به همین جهت مرورگر خطای عدم تنظیم این هدرها را نمایش می‌دهد (که مهم نیست و بی‌ربط به اصل موضوع خطای سمت سرور است). 
‫۶ سال و ۸ ماه قبل، دوشنبه ۱۸ دی ۱۳۹۶، ساعت ۱۳:۲۸
احتمالا مرتبط است به قسمت حذف توکن‌های قدیمی یا ضعف مدیریت طول عمر Context در برنامه‌ی شما (بررسی این مورد، نیاز به بازبینی دقیق کدهای شخصی شما را دارد). می‌توان این مورد را به صورت مستقل و خارج از لاگین در یک وظیفه‌ی پس زمینه انجام داد تا با سایر قسمت‌های برنامه‌ی شما تداخل نکند.
‫۶ سال و ۸ ماه قبل، یکشنبه ۱۷ دی ۱۳۹۶، ساعت ۱۹:۱۰
استاندارد آن به این صورت است:
 Its value MUST be a number containing a NumericDate value.
و این NumericDate به نحو زیر باید تعریف شود (Section 2. Terminology):
 A JSON numeric value representing the number of seconds from 1970-01-01T00:00:00Z UTC until the specified UTC date/time, ignoring leap seconds. This is equivalent to the IEEE Std 1003.1, 2013 Edition [POSIX.1] definition "Seconds Since the Epoch", in which each day is accounted for by exactly 86400 seconds, other than that non-integer values can be represented. See RFC 3339 [RFC3339] for details regarding date/times in general and UTC in particular.
نمونه‌ی استفاده‌ی از آن در متد getAccessTokenExpirationDateUtc ارائه شده‌است.  
یک نکته‌ی تکمیلی: بهبود کنترل نمایش و مخفی سازی قسمت‌های مختلف

یک روش «نمایش و یا مخفی کردن قسمت‌های مختلف صفحه بر اساس نقش‌های کاربر وارد شده‌ی به سیستم» را در مطلب جاری مطالعه کردید. روش دیگر اینکار، تهیه‌ی یک دایرکتیو و سپس اعمال آن به المان‌های مختلف صفحه است. به علاوه با توجه به اینکه Auth Service ما رخ‌داد خروج کاربر را نیز گزارش می‌کند، روش ارائه شده‌ی در اینجا نیاز به اندکی بهبود هم دارد:
  ngOnInit() {
    this.isAdmin = this.authService.isAuthUserInRole("Admin");
    this.isUser = this.authService.isAuthUserInRole("User");
  }
نتیجه‌ی این بررسی، حتی با خروج کاربر نیز تغییری نخواهد کرد و ثابت است. بنابراین بهتر است مشترک this.authService.authStatus شد و نسبت به رخ‌دادهای صادر شده‌ی توسط سرویس اعتبارسنجی، همانند کامپوننت هدر، واکنش نشان داد.
برای پیاده سازی آن و همچنین کپسوله سازی این عملیات تکراری، دایرکتیو جدیدی را در مسیر src\app\shared\directives\is-visible-for-auth-user.directive.ts ایجاد می‌کنیم:
import { Directive, ElementRef, Input, OnDestroy, OnInit } from "@angular/core";
import { Subscription } from "rxjs/Subscription";

import { AuthService } from "../../core/services/auth.service";

@Directive({
  selector: "[isVisibleForAuthUser]"
})
export class IsVisibleForAuthUserDirective implements OnInit, OnDestroy {

  private subscription: Subscription;

  @Input() isVisibleForRoles: string[];

  constructor(private elem: ElementRef, private authService: AuthService) { }

  ngOnDestroy(): void {
    this.subscription.unsubscribe();
  }

  ngOnInit(): void {
    this.subscription = this.authService.authStatus$.subscribe(status => this.changeVisibility(status));
    this.changeVisibility(this.authService.isAuthUserLoggedIn());
  }

  private changeVisibility(status: boolean) {
    const isInRoles = !this.isVisibleForRoles ? true : this.authService.isAuthUserInRoles(this.isVisibleForRoles);
    this.elem.nativeElement.style.display = isInRoles && status ? "" : "none";
  }
}
در اینجا علاوه بر بررسی isAuthUserLoggedIn و isAuthUserInRoles، نسبت به تغییرات this.authService.authStatus نیز واکنش نشان داده می‌شود.

سپس تعریف آن‌را به قسمت‌های declarations و exports مربوط به SharedModule اضافه می‌کنیم:
import { IsVisibleForAuthUserDirective } from "./directives/is-visible-for-auth-user.directive";

@NgModule({
  declarations: [
    IsVisibleForAuthUserDirective
  ],
  exports: [
    IsVisibleForAuthUserDirective
  ]
})
export class SharedModule {}

اکنون ماژول Dashboard برای استفاده‌ی از این امکانات تنها کافی است SharedModule را دریافت کند (یا هر ماژول دیگری نیز به همین ترتیب است):
import { SharedModule } from "../shared/shared.module";

@NgModule({
  imports: [
    SharedModule
  ]
})
export class DashboardModule { }

پس از آن برای مخفی سازی یک المان از دید کاربران وارد نشده‌ی به سیستم، فقط کافی است دایرکتیو isVisibleForAuthUser را به المان اعمال کنیم:
<div class="alert alert-info" isVisibleForAuthUser>
      Is-Visible-For-AuthUser
</div>
و یا اگر نیاز به اعمال نقش‌ها نیز وجود داشت می‌توان از خاصیت isVisibleForRoles آن استفاده کرد:
<div class="alert alert-success" isVisibleForAuthUser [isVisibleForRoles]="['Admin','User']">
      Is-Visible-For-Roles = ['Admin','User']
</div>

خلاصه‌ی این تغییرات به کدهای نهایی این سری اعمال شده‌اند.
‫۶ سال و ۸ ماه قبل، سه‌شنبه ۱۲ دی ۱۳۹۶، ساعت ۰۰:۰۰
به هر قسمتی که در نهایت Get دارد و خروجی را ارائه می‌دهد، باید اعمال شود.
‫۶ سال و ۸ ماه قبل، دوشنبه ۱۱ دی ۱۳۹۶، ساعت ۱۷:۰۳
اگر یکی از UseDefaultRouteUrl و یا UseCurrentRouteUrl به true تنظیم شده باشند، از خاصیت Url استفاده نخواهد شد.
ابتدای متد scheduleRefreshToken بررسی isLoggedIn است:
scheduleRefreshToken() {
    if (!this.isLoggedIn()) {
      return;
    }
در قسمتی از isLoggedIn کار بررسی منقضی شدن طول عمر توکن هم انجام می‌شود. بنابراین پس از انقضای توکن، درخواستی به سمت سرور ارسال نخواهد شد.
initialDelay هم همواره اندکی کمتر است از زمان انقضای توکن.