گذر از کلیدهای ثابت به احراز هویت بدون رمز (Secretless): راهنمای پیادهسازی OIDC در انتشار بستههای NuGet
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۱۴ ۱۱:۳۵
آدرس: www.dntips.ir
چکیده: با اعلام سیاستهای جدید مایکروسافت و مایکروسافت نُگِت (NuGet.org)، طول عمر کلیدهای دسترسی API از تاریخ ۱۷ اوت به حداکثر ۳۰ روز کاهش یافته و کلیه کلیدهای طولانیمدت قدیمی در اول نوامبر غیرفعال میشوند. این تغییر سیاست، چالشهای عملیاتی متعددی را برای چرخههای یکپارچهسازی و تحویل مداوم (CI/CD) و مدیریت سنتی کلیدها در GitHub Actions ایجاد میکند. راهکار مدرن و ایمن مایکروسافت برای حل این مشکل، استفاده از پروتکل OpenID Connect (OIDC) و قابلیت Trusted Publishing است. در این مقاله، ضمن بررسی تعاملی این الگوی احراز هویت بدون کلید (Secretless)، شیوه تنظیم آن بر روی بستههای داتنت (.NET) و خودکارسازی چرخه انتشار در پلتفرم GitHub Actions تشریح میشود.Push به سمت NuGet ارسال میکرد. اما در الگوی OIDC، احراز هویت طی یک چرخه سه جانبه و امن صورت میپذیرد:[GitHub Runner] ---- (۱. درخواست Token با ادعاهای OIDC) ----> [GitHub OIDC Provider] [GitHub Runner] <--- (۲. دریافت JSON Web Token / JWT امضا شده) -- [GitHub OIDC Provider] [GitHub Runner] ---- (۳. تبادل JWT با کلید موقت ۱ ساعته) -----> [NuGet.org] [GitHub Runner] <--- (۴. دریافت Short-lived API Key) -------- [NuGet.org]
my_name).PersianCalendar).publish.yml).release) نام آن را ذکر کنید.نکته برای مخازن خصوصی (Private Repositories): زمانی که برای یک مخزن خصوصی policy تعریف میکنید، NuGet آن را به مدت ۷ روز فعال موقت نگه میدارد. پس از اولین انتشار موفق، این وضعیت به صورت دائمی تثبیت میشود.
.github/workflows/publish.yml را در پروژه خود ایجاد یا ویرایش کنید.permissions: id-token: write است تا Runner مجاز به دریافت توکن OIDC باشد:name: Publish to NuGet
on:
release:
types: [published] # اجرا هنگام انتشار یک Release جدید
workflow_dispatch: # امکان اجرای دستی ورکفلو
jobs:
publish:
runs-on: ubuntu-latest
environment: release
permissions:
contents: read
id-token: write # الزام دسترسی برای احراز هویت OIDC
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x' # نسخه SDK مورد نظر شما
- name: Restore dependencies
run: dotnet restore
- name: Build project
run: dotnet build --configuration Release --no-restore
- name: Run Tests
run: dotnet test --configuration Release --no-build
- name: Pack Package
run: dotnet pack --configuration Release --no-build --output ./artifacts
# ۱. تبادل توکن OIDC با کلید موقت ۱ ساعته NuGet
- name: NuGet Login via OIDC
id: login
uses: NuGet/login@v1
with:
user: ${{ secrets.NUGET_USER }} # نام کاربری پروفایل NuGet (نه ایمیل)
# ۲. ارسال بسته به NuGet با کلید موقت دریافت شده
- name: Push Package to NuGet.org
run: |
dotnet nuget push ./artifacts/*.nupkg \
--source https://api.nuget.org/v3/index.json \
--api-key "${{ steps.login.outputs.NUGET_API_KEY }}" \
--skip-duplicateNUGET_USER تعریف کرده و مقدار آن را برابر با نام کاربری خود در NuGet (برای مثال my_name) قرار دهید..csproj پیش از هر انتشار، پیشنهاد میشود از ابزارهایی مانند MinVer یا GitVersion استفاده کنید. این ابزارها بر اساس Tagهای Git (مانند v1.2.0)، نسخه بسته را به صورت خودکار در زمان Build تعیین میکنند.dotnet nuget sign بستههای خود را امضا کنید تا اصالت فایل پس از دانلود توسط کاربران قابل راستیآزمایی باشد.