Skip to content

Fix CredentialsProvider DI lifetime mismatch causing startup crash in Development#3783

Merged
gladjohn merged 2 commits intomasterfrom
fix/credentials-provider-di-lifetime
Apr 18, 2026
Merged

Fix CredentialsProvider DI lifetime mismatch causing startup crash in Development#3783
gladjohn merged 2 commits intomasterfrom
fix/credentials-provider-di-lifetime

Conversation

@Avery-Dunn
Copy link
Copy Markdown
Contributor

@Avery-Dunn Avery-Dunn commented Apr 17, 2026

PR #3747 introduced CredentialsProvider and registered it as a singleton unconditionally, before the isTokenAcquisitionSingleton check in services.TryAddSingleton<ICredentialsProvider, CredentialsProvider>();

This caused two DI scope validation failures:

  1. Scoped dependency consumed by singleton

CredentialsProvider takes an optional ITokenAcquisitionHost dependency, which is registered as scoped in the default ASP.NET Core path (isTokenAcquisitionSingleton = false). ASP.NET Core enables DI scope validation in Development mode, causing any app using AddMicrosoftIdentityWebApi() (or similar) to crash on startup with: Cannot consume scoped service 'ITokenAcquisitionHost' from singleton 'ICredentialsProvider'

This can be seen when running the TodoListService sample app locally, and is causing the failures in this pipeline run:
https://identitydivision.visualstudio.com/DevEx/_build/results?buildId=1622769&view=logs&j=209d31eb-74ac-5f16-8408-ec8d6b3913fc&t=9196b009-882a-5fd9-cf3b-dbb6d24a8df3&s=b49e7e65-b64b-557c-018e-3fd79c15ded6

  1. Stale registration after lifetime upgrade
    When AddTokenAcquisition is called twice with different lifetimes (e.g., EnableTokenAcquisitionToCallDownstreamApi() registers as scoped, then AddOidcFic() via AddAgentIdentities() re-registers as singleton), the method removes and re-registers core services to match the new lifetime. However, the stale scoped ICredentialsProvider was not included in this removal, so the HasImplementationType guard skipped the singleton re-registration. This left a scoped ICredentialsProvider consumed by the now-singleton IDownstreamApi, crashing the Sidecar and any app combining agent identities with downstream API calls with: Cannot consume scoped service 'ICredentialsProvider' from singleton 'IDownstreamApi'

This PR moves ICredentialsProvider registration into the existing isTokenAcquisitionSingleton conditional blocks, matching the pattern used by the other services in the method, and adds ICredentialsProvider to the lifetime-mismatch removal block so it is properly re-registered when the lifetime changes.

@Avery-Dunn Avery-Dunn marked this pull request as ready for review April 17, 2026 21:33
@Avery-Dunn Avery-Dunn requested a review from a team as a code owner April 17, 2026 21:33
@gladjohn
Copy link
Copy Markdown
Contributor

Copy link
Copy Markdown
Contributor

@gladjohn gladjohn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good, thanks @Avery-Dunn

@gladjohn gladjohn merged commit 9720661 into master Apr 18, 2026
6 of 7 checks passed
@gladjohn gladjohn deleted the fix/credentials-provider-di-lifetime branch April 18, 2026 13:04
This was referenced Apr 20, 2026
github-actions Bot pushed a commit to EelcoLos/nx-tinkering that referenced this pull request Apr 21, 2026
Pinned
[Microsoft.Identity.Web](https://github.com/AzureAD/microsoft-identity-web)
at 4.8.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Identity.Web's
releases](https://github.com/AzureAD/microsoft-identity-web/releases)._

## 4.8.0

## What's Changed
* Bump flatted from 3.3.3 to 3.4.2 in
/tests/DevApps/SidecarAdapter/typescript by @​dependabot[bot] in
AzureAD/microsoft-identity-web#3753
* Update changelog.md for ID.Web 4.6.0 by @​bgavrilMS in
AzureAD/microsoft-identity-web#3756
* Add token binding to MicrosoftIdentityMessageHandler by @​cpp11nullptr
in AzureAD/microsoft-identity-web#3743
* Bump picomatch in /tests/DevApps/SidecarAdapter/typescript by
@​dependabot[bot] in
AzureAD/microsoft-identity-web#3759
* Documentation: Clarify managed identity credential types for
containerized vs. VM/App Service deployments by @​Copilot in
AzureAD/microsoft-identity-web#3585
* Bump path-to-regexp from 8.3.0 to 8.4.0 in
/tests/DevApps/SidecarAdapter/typescript by @​dependabot[bot] in
AzureAD/microsoft-identity-web#3762
* Upgrade Microsoft Application Insights packages by @​RojaEnnam in
AzureAD/microsoft-identity-web#3763
* Use Abstractions 12 by @​pmaytak in
AzureAD/microsoft-identity-web#3761
* Post-4.7.0 by @​pmaytak in
AzureAD/microsoft-identity-web#3768
* Fix Comp Gov DOTNET-Security-10.0 by @​reginayap8 in
AzureAD/microsoft-identity-web#3769
* Upgrade CodeQL to V4: Fix 10 CodeQL Analysis Warnings and Errors by
@​reginayap8 in
AzureAD/microsoft-identity-web#3770
* fix warnings by @​gladjohn in
AzureAD/microsoft-identity-web#3771
* adding examples for using postgres as a distributed cache by
@​JaredMSFT in
AzureAD/microsoft-identity-web#3766
* Suppress AOT configuration-binding SYSLIB warnings in AotCompatibility
test app by @​Copilot in
AzureAD/microsoft-identity-web#3774
* Bump vite from 7.1.11 to 7.3.2 in
/tests/DevApps/SidecarAdapter/typescript by @​dependabot[bot] in
AzureAD/microsoft-identity-web#3772
* Skip legacy B2C local-account Todo UI test in WebAppUiTests by
@​Copilot in AzureAD/microsoft-identity-web#3778
* Fix initialization of ConfidentialClientApplicationOptions in
MergedOptions by @​cpp11nullptr in
AzureAD/microsoft-identity-web#3760
* Bump net8/net9/net10 runtime package baselines to patched crypto
servicing versions by @​Copilot in
AzureAD/microsoft-identity-web#3779
* Fix flaky certificate test failures on CI by @​gladjohn in
AzureAD/microsoft-identity-web#3780
* MTLS Without Tokens Support by @​tlupes in
AzureAD/microsoft-identity-web#3747
* Fix CredentialsProvider DI lifetime mismatch causing startup crash in
Development by @​Avery-Dunn in
AzureAD/microsoft-identity-web#3783
* Remove unused DataProtection configuration from Sidecar by @​Copilot
in AzureAD/microsoft-identity-web#3776

## New Contributors
* @​RojaEnnam made their first contribution in
AzureAD/microsoft-identity-web#3763
* @​reginayap8 made their first contribution in
AzureAD/microsoft-identity-web#3769
* @​JaredMSFT made their first contribution in
AzureAD/microsoft-identity-web#3766

**Full Changelog**:
AzureAD/microsoft-identity-web@4.6.0...4.8.0

Commits viewable in [compare
view](AzureAD/microsoft-identity-web@4.7.0...4.8.0).
</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants