jwt – برنامه ی وب یک درخواست برای یک API REST زمانی که در حال تأیید صحت است

من تازه به ASP.NET هسته و OpenID اتصال / AzureAD، بنابراین من به دنبال برخی از اعتبار سنجی (و یا در غیر اینصورت) از رویکرد من است. خواندن / گوگلینگ گسترده در طول چند هفته گذشته در حالی که من در حال یادگیری این است که پاسخ دقیق نگرفته است (اگر چه بسیاری از تقریبا نادرست است)

من یک برنامه وب مبتنی بر مرورگر است که باید با آن امن AzureAD، به طوری که انتظار می رود، از این استفاده می کند. همه کارها خوب است.

همچنین یک API را در همان نرم افزار قرار می دهم. من نمیخواهم به علت نگرانی CSRF از کوکی استفاده کنم و نیاز به API برای سرویس دهی یک برنامه تلفن همراه در تاریخ بعدی است. من API را برای استفاده از JWT Bearer مبتنی بر auth پیکربندی کردم. همچنین به خوبی کار میکند (به عنوان مثال از پستمن درخواست میکند)

یکی از صفحات در برنامه وب نیاز به برقراری تماس AJAX به API دارد، و من نمیخواهم / باید برنامه را به یک SPA تبدیل کنم. بنابراین رویکردی که در حال حاضر در حال تلاش هستم این است:

وقتی وارد برنامه میشوم، حافظه (از طرف سرور) را از AzureAD دریافت میکنم. وقتی صفحه با تماس AJAX بازدید می شود، من "id_token" را به یک فیلد پنهان می نویسم و ​​هنگامی که نیاز به برقراری تماس AJAX دارم، خواندن id_token در جاوا اسکریپت و اضافه کردن آن به عنوان "مجوز" هدر.

این همه به عنوان یک رویا کار می کند، بنابراین من آن را نگران کرده ام و آن را نگران کرده ام. من نمی توانم مسائل CSRF را ببینم، چون تماس AJAX دیگر کوکی نیست. اگر چه من یک id_token را به صفحه می نویسم، کاربر باید کوکی ها را برای دیدن این صفحه در اولویت قرار دهد.

آیا چیزی است که من از آن چشم پوشی می کنم؟

تأیید اعتبار – آیا JWT نشانه ها را در مرورگر واقعا خلع سلاح می کند؟

توجه: من به طور کامل تصدیق می کنم ممکن است چیزی که من در تصویر از دست بدهم، بخشی از دلیل من برای ارسال. من می خواهم نظرات افراد بیشتری را تجربه کنم که از پیاده سازی های مربوط به authN / Z برخوردارم.

در اینجا این است که در این کل "هیچ نشانه های refresh در برنامه های مشتری" گیر کرده ام:

فرض من این است که بدون نشانه refresh ما نیز نمی توانیم، به دلیل دلایل تجربه کاربر، یک نشانه دسترسی بسیار کوتاه مدت داشته باشیم، یعنی اگر ما تا به حال یک نشانه دسترسی که هر 15 دقیقه منقضی می شود، بدون شادی برای تازه کردن ما مجبور به ورود دوباره هر 15 دقیقه.

مشکل من: با گسترش طول عمر نشانه دسترسی، ما یک مهاجم بالقوه MIDM را یک سلاح خطرناک تر می کنیم، یعنی نشانه ای که به منابع دسترسی دارد که می تواند روزها یا حتی برای همیشه باشد ( همانطور که در بسیاری از پروژه ها دیده ام.

برای من، ساده ترین راه برای حل چنین وضعیتی یک نشانه تازه کردن است، حتی یکی که در انتهای جلوی آن قرار دارد، زیرا به نظر من هنوز هم طول می کشد این نشانه مجدد ممکن است:

  • همچنین یک JWT که منقضی می شود اما ممکن است منقضی شود در یک هفته یا بیشتر
  • یک نشانه "استفاده تنها یک بار" که برای نوشتن مجوز دسترسی مورد استفاده قرار می گیرد و پس از آن توسط یک نشانه تازه کردن جدید جایگزین می شود

به نظر من این رویکرد در برابر نشانه دسترسی طولانی مدت چندین مشکل را حل می کند:

  • با این روش، من یک نشانه دسترسی کوتاه مدت را نگه می دارم، بنابراین اگر آن را به دست بد، آن را نمی توان برای مدت طولانی استفاده می شود
  • اگر فکر می کنید نشانه تازه کردن است حتی بدتر، من مخالف هستم، زیرا دو چیز وجود دارد که آن را بهتر می کند:

    1. هنگامی که کاربر اصلی دوباره نشانه خود را دوباره تجسم می کند که نشانه قبلی بازنشانی دیگر نمی تواند قابل استفاده باشد
    2. اگر ما فرض کنیم کسی کسی را دزدی نشانه refresh ما در حالی که ما ' مرور مرورگر، در عرض چند دقیقه مرورگر ما سعی خواهد کرد که از آن کد بازنشانی استفاده کند، (زیرا شخص دیگری آن را استفاده کرده و بنابراین دیگر قابل استفاده نیست) و ما را به ورود به سیستم دعوت می کند که به طور کامل دیگر مجموعه ای از آخرین نشانه دریافت شده حتی در صورتی که 1 و 2 در هر سناریو صحت نداشته باشند (من من هستم
    3. چندین جلسه / تجدید نشانه اجازه داده شده است بنابراین نه یک پشته یا تازه کردن نشانه اما چند) من هنوز هم شرط می بندم که شما بهتر از جعل جوایز بازنشانی نامعتبر از هر روش که شما می خواهید از شما معتبر بودن توالی دسترسی است. یک نشانه دسترسی JWT به خودی خود معتبر است و کل هدف استفاده از آن این است که شما می توانید با تایید آن اعتماد کنید بدون اینکه دیگر عملیات گرانقیمت مانند چک کردن با سرور auth را در صورت اضافه بودن آن در لیست سیاه قرار دهید. این بدان معناست که نیاز به بررسی این نوع چیز برای هر درخواست هر بار با هر کدام از دسترسی ها انجام می شود = بسیار مقیاس پذیر نیست، به ویژه اگر شما این را مقایسه فقط به داشتن این نوع کار هر بار 15 دقیقه برای نشانه refresh (شما می توانید یک لیست سیاه لیست نشانه ها را نگه دارید)

بنابراین، با همه این گفته است، داشتن یک نشانگر بازنشانی "استفاده از یک بار" از طرف مشتری که همچنین JWT است و منقضی می شود که غیر منطقی است؟ ما از داشتن نشانه دسترسی در هفته گذشته اجتناب می کنیم، چگونه می تواند بد باشد؟

رمزگذاری – AES-CBC و سپس SHA در مقابل AES-GCM برای رمزگذاری و تأیید اعتبار یک نشانگر وب

من سعی میکنم چیزی شبیه به JWT داشته باشم اما به طور خاص و رمزگذاری شده. این نشانه به سادگی یک JSON رشته ای است که حاوی شناسه کاربر و زمان بندی یونیکس است. در حال حاضر، من سعی کردم از AES-128-GCM استفاده کنم، اما قبل از رمزگشایی برخی از اصلاحات ساده در متن رمز را انجام دادم، فقط بعضی از بایت ها را به متن رمزگذاری اضافه کردم و متوجه شدم که آن را با موفقیت رمزگشایی می کند، آیا این بدان معنی است که این بایت ها به عنوان padding و که AES GCM الگوریتم رمزنگاری را تایید می کند؟ زیرا احساس می کنم که رمزگذاری شده و سپس تأیید اعتبار را احساس می کند به من بیشتر امن است. همچنین، تأیید هویت AES GCM حتی ایمن به اندازه کافی برای مقایسه با SHA256 به عنوان مثال است، آیا CRC سطح برای یکپارچگی سریع است و نمی تواند برای احراز هویت امن مانند HMAC استفاده شود؟

به عبارت دیگر : AES-128-CBC سپس SHA-256 امن تر از AES-128-GCM است