~60
expired credentials retired on the first pass
2026
Credential expiry notification for about 1,000 Entra ID app registrations
- Problem
- Client secrets and certificates on about 1,000 app registrations were expiring silently. An integration would stop working, a ticket would arrive days later, and nobody could say who owned the app or what it was for.
- What I did
- Inventoried every app and credential through Microsoft Graph and matched each credential against roughly a thousand sign-in records to separate "in use" from "forgotten". A Logic App now writes to the app owner at 30 and 7 days before expiry. Owners are mostly product owners, not engineers, and the raw configuration (permission scopes, redirect URIs, sign-in audience) does not tell them what will break. So the notice includes a plain-language summary of what the application does and what stops working if the credential lapses, generated by Azure OpenAI from configuration metadata only: permission names, redirect domains, whether the credential shows recent use. No secrets or tokens are sent; flags such as "involves user sign-in" are computed deterministically first, and the model returns strict JSON with a confidence score so low-confidence summaries are reviewed before sending. A companion script retires credentials expired for over 30 days; dry-run is the default.
- Result
- Owners receive a notice they can act on without a ticket to IT: renew, or confirm the app can be retired. The first clean-up pass found and retired around 60 credentials that had already expired, some by years.
- Microsoft Graph
- PowerShell
- Logic Apps
- Entra ID