Duende Documentation Skill CRITICAL: Path Doubling Prevention - MANDATORY ABSOLUTE PROHIBITION: NEVER use with in PowerShell when running scripts from this skill. The Problem: If your current working directory is already inside the skill directory, using relative paths causes PowerShell to resolve paths relative to the current directory instead of the repository root, resulting in path doubling. REQUIRED Solutions (choose one): 1. ALWAYS use absolute paths (recommended) 2. Use separate commands (never with ) 3. Run from repository root with relative paths NEVER DO THIS: - Chain with : causes…

is incorrect.* or *Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near the keyword 'WITH'.* Please see \u003chttps://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/breaking-changes#mitigations> for more information.\n* For container deployments, the [default ASP.NET Core port changed from 80 to 8080](https://learn.microsoft.com/en-us/dotnet/core/compatibility/containers/8.0/aspnet-port). This might require configuration updates to either continue using port 80 or to migrate to using 8080.\n* IdentityServer and the ASP.NET Authentication packages all depends on the `Microsoft.IdentityModel.*` packages. With packages that are brought in as transient dependencies there is less control of the versions being pulled in. If different packages from the `Microsoft.IdentityModel.`\\* family end up having different versions, there will be odd bugs. We've seen reports where the refresh token isn't stored and where the OIDC handler fails to redirect to an OIDC Provider because it failed reading the discovery document. **Always ensure that all Microsoft.IdentityModel.* packages are of exactly the same version*\\*. If they are not, you might need to make an explicit `\u003cPackageReference>` to pin an exact version.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":14666,"content_sha256":"5bebe3880d56da55e9e2e9acb0dbfce9f04a84faca0a14f3760a7a3be61a8303"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver-v70-to-v71.md","content":"---\ntitle: Duende IdentityServer v7.0 to v7.1\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver-v70-to-v71/\nsource_type: llms-full-txt\ncontent_hash: sha256:9dc3cf7c37ee0ef001f9b5cbe249ffb1ba0cecba031a32ff949af45f2258c565\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver-v70-to-v71\n---\n\nIdentityServer v7.1 includes support for .NET 9 and many other smaller fixes and enhancements. Please see our [release notes](https://github.com/DuendeSoftware/products/releases/tag/is%2F7.1.0) for complete details.\n\nThere are no schema changes needed for IdentityServer 7.1. There are two changes that may require small code changes for a minority of users:\n\n* IdentityModel renamed Duende.IdentityModel\n* `ClientConfigurationStore` now uses IConfigurationDbContext\n\n## Step 1: Target Framework Optional\n\n[Section titled \"Step 1: Target Framework \"Optional](#step-1-target-framework)\n\nIdentityServer 7.1 supports both .NET 8 and 9. If you wish, you can update your .NET version as part of this upgrade.\n\nFor example in your project file:\n\n```xml\n\u003cTargetFramework>net8.0\u003c/TargetFramework>\n```\n\nwould change to:\n\n```xml\n\u003cTargetFramework>net9.0\u003c/TargetFramework>\n```\n\nAny NuGet packages that you are using that target an older version of .NET should also be updated. For example, the version of `Microsoft.EntityFrameworkCore.SqlServer` or `Microsoft.AspNetCore.Authentication.Google` should be updated. Depending on what your IdentityServer host project is using, there may or may not be code changes based on those updated dependencies.\n\n## Step 2: NuGet Packages\n\n[Section titled \"Step 2: NuGet Packages\"](#step-2-nuget-packages)\n\nIn your IdentityServer host project, update the version of the Duende.IdentityServer package. For example in your project file:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.0.8\" />\n```\n\nwould change to:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.1.0\" />\n```\n\n## Step 3: Interface Change Breaking\n\n[Section titled \"Step 3: Interface Change \"Breaking](#step-3-interface-change)\n\n#### IdentityModel renamed Duende.IdentityModel\n\n[Section titled \"IdentityModel renamed Duende.IdentityModel\"](#identitymodel-renamed-duendeidentitymodel)\n\nOur open source IdentityModel library has been renamed Duende.IdentityModel, and we now depend on Duende.IdentityModel instead of IdentityModel. Duende.IdentityModel is a drop-in replacement for IdentityModel with updated namespaces that include the Duende prefix. If you are using IdentityModel's types in your IdentityServer implementation, you will need to update references from IdentityModel to Duende.IdentityModel (replace \"using IdentityModel\" with \"using Duende.IdentityModel\").\\_\n\n#### ClientConfigurationStore now uses IConfigurationDbContext\n\n[Section titled \"ClientConfigurationStore now uses IConfigurationDbContext\"](#clientconfigurationstore-now-uses-iconfigurationdbcontext)\n\nThe `ClientConfigurationStore` in the `Duende.Configuration.EntityFramework` package now depends on `IConfigurationDbContext` instead of `ConfigurationDbContext` to allow for customization. If you have a customized store that derives from the default store, you may need to update your constructors. Note that this only affects the Entity Framework based implementation of the configuration store used by the dynamic client registration configuration API.\n\n## Step 4: Done!\n\n[Section titled \"Step 4: Done!\"](#step-4-done)\n\nThat's it. Of course, at this point you can and should test that your IdentityServer is updated and working properly.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3587,"content_sha256":"32541b34c3bc22b57784d1682be3dfdb548a14fccd176b4f66136b099d4aa1ea"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver-v71-to-v72.md","content":"---\ntitle: Duende IdentityServer v7.1 to v7.2\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver-v71-to-v72/\nsource_type: llms-full-txt\ncontent_hash: sha256:e1df924c7a32d09886d8bdbf7f48e29ad2b789cc7b06557090438a73e2b3f55d\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver-v71-to-v72\n---\n\nThis upgrade guide covers upgrading from Duende IdentityServer v7.1 to v7.2 ([release notes](https://github.com/DuendeSoftware/products/releases/tag/is-7.2.0)).\n\nDuende IdentityServer 7.2 adds:\n\n* Do not issue `TokenIssuedFailureEvent` for `use_dpop_nonce` error\n* Use `AsyncServiceScope` in Background Services\n* Use query-safe URL fragment when returning an error\n* Add an option for strict validation of assertion audiences\n* General improvements to XML documentation and null reference exception handling\n* Preview Features: Strict Audience Validation and Discovery Document Caching\n* Bug fixes and ongoing maintenance\n\nThere are no changes to the data stores in this release.\n\n## Step 1: Update NuGet package\n\n[Section titled \"Step 1: Update NuGet package\"](#step-1-update-nuget-package)\n\nIn your IdentityServer host project, update the version of the NuGet. For example in your project file:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.1.0\" />\n```\n\nwould change to:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.2.0\" />\n```\n\n## Step 2: Done!\n\n[Section titled \"Step 2: Done!\"](#step-2-done)\n\nThat's it. Of course, at this point you can and should test that your IdentityServer is updated and working properly.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1601,"content_sha256":"b1a3bbf785fdc44bbd6ab06019b1359bfe963d91171a75085fbb4853cf0c0e98"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver-v72-to-v73.md","content":"---\ntitle: Duende IdentityServer v7.2 to v7.3\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver-v72-to-v73/\nsource_type: llms-full-txt\ncontent_hash: sha256:945a8a3fceba99d1634d14b23aa0e82326c9a54496f57f3d1078a02b77e90b47\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver-v72-to-v73\n---\n\nThis upgrade guide covers upgrading from Duende IdentityServer v7.2 to v7.3 ([release notes](https://github.com/DuendeSoftware/products/releases/tag/is-7.3.0)).\n\nIdentityServer 7.3.0 is a significant release that includes:\n\n* [FAPI 2.0 Security Profile](https://openid.net/specs/fapi-security-profile-2_0-final.html) certification\n* JWT Response from the introspection endpoint ([RFC 9701](https://www.rfc-editor.org/rfc/rfc9701.html))\n* Diagnostic data\n* Removal of the experimental label from OpenTelemetry metrics\n* Additional license compliance warnings\n* Several bug fixes\n* Numerous small code quality and performance enhancements from the community\n\nThere are no schema changes needed for IdentityServer 7.3. Small code changes maybe be required for some users to upgrade:\n\n* The `SendLogoutNotificationAsync` method has been removed from the `DefaultBackChannelLogoutService` class\n* Client `Secret` is now required for Clients with `ClientCredentials` grant\n\n## Step 1: Update NuGet package\n\n[Section titled \"Step 1: Update NuGet package\"](#step-1-update-nuget-package)\n\nIn your IdentityServer host project, update the version of the NuGet. For example in your project file:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.2.0\" />\n```\n\nwould change to:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.3.0\" />\n```\n\n## Step 2: Breaking Changes\n\n[Section titled \"Step 2: Breaking Changes\"](#step-2-breaking-changes)\n\nSmall code changes maybe be required for some users to upgrade.\n\n#### The `SendLogoutNotificationAsync` Method Has Been Removed From The `DefaultBackChannelLogoutService` Class\n\n[Section titled \"The SendLogoutNotificationAsync Method Has Been Removed From The DefaultBackChannelLogoutService Class\"](#the-sendlogoutnotificationasync-method-has-been-removed-from-the-defaultbackchannellogoutservice-class)\n\nTo fix a bug where when using Entity Framework Core, code which previously executed in parallel needed to be modified to execute sequentially. This required the removal of the `SendLogoutNotificationAsync` method in the `DefaultBackChannelLogoutService` class.\n\nIf you have previously overridden the `SendLogoutNotificationAsync` as an extensibility point, you will likely need to move your customization to the `PostLogoutJwt` method.\n\n\u003chttps://github.com/DuendeSoftware/products/pull/2019>\n\n#### Client `Secret` Is Now Required For Clients With `ClientCredentials` Grant\n\n[Section titled \"Client Secret Is Now Required For Clients With ClientCredentials Grant\"](#client-secret-is-now-required-for-clients-with-clientcredentials-grant)\n\nPreviously, it was possible to configure a client to allow the `ClientCredentials` grant without requiring a client secret, which is undesirable. The default validation of clients has been updated to ensure any client which allows the `ClientCredentials` grant also sets the `RequireClientSecret` flag to `true`, to disallow the configuration of a private client to behave like a public client.\n\n\u003chttps://github.com/DuendeSoftware/products/pull/1796>\n\n#### Removal Of The Experimental Label From OpenTelemetry Metrics\n\n[Section titled \"Removal Of The Experimental Label From OpenTelemetry Metrics\"](#removal-of-the-experimental-label-from-opentelemetry-metrics)\n\nSeveral [OpenTelemetry metrics](/identityserver/diagnostics/otel/#detailed-metrics) previously created by the meter named \"Duende.IdentityServer.Experimental\" have been moved to the \"Duende.IdentityServer\" meter.\n\n#### Default Supported Signing Algorithms Have Changed For Client Assertions And Request Objects\n\n[Section titled \"Default Supported Signing Algorithms Have Changed For Client Assertions And Request Objects\"](#default-supported-signing-algorithms-have-changed-for-client-assertions-and-request-objects)\n\nTo support the [FAPI 2.0 Security Profile](https://openid.net/specs/fapi-security-profile-2_0-final.html), we've added new options to configure the supported signing algorithms for client assertions and request objects, and only included asymmetric algorithms by default. Before this release, all signing algorithms were supported, including the symmetric algorithms `HS256`, `HS384`, and `HS512`.\n\nIf you're using symmetric keys to sign client assertions or request objects, you can restore the previous behavior by adding the following code to your IdentityServer configuration:\n\nProgram.cs\n\n```csharp\nbuilder.Services.AddIdentityServer(options =>\n{\n // To re-enable symmetric algorithms for signing client assertions:\n options.SupportedClientAssertionSigningAlgorithms =\n [\n SecurityAlgorithms.RsaSha256,\n SecurityAlgorithms.RsaSha384,\n SecurityAlgorithms.RsaSha512,\n\n\n SecurityAlgorithms.RsaSsaPssSha256,\n SecurityAlgorithms.RsaSsaPssSha384,\n SecurityAlgorithms.RsaSsaPssSha512,\n\n\n SecurityAlgorithms.EcdsaSha256,\n SecurityAlgorithms.EcdsaSha384,\n SecurityAlgorithms.EcdsaSha512,\n\n\n SecurityAlgorithms.HmacSha256,\n SecurityAlgorithms.HmacSha384,\n SecurityAlgorithms.HmacSha512\n ];\n\n\n // To re-enable symmetric algorithms for signing request objects:\n options.SupportedRequestObjectSigningAlgorithms =\n [\n SecurityAlgorithms.RsaSha256,\n SecurityAlgorithms.RsaSha384,\n SecurityAlgorithms.RsaSha512,\n\n\n SecurityAlgorithms.RsaSsaPssSha256,\n SecurityAlgorithms.RsaSsaPssSha384,\n SecurityAlgorithms.RsaSsaPssSha512,\n\n\n SecurityAlgorithms.EcdsaSha256,\n SecurityAlgorithms.EcdsaSha384,\n SecurityAlgorithms.EcdsaSha512,\n\n\n SecurityAlgorithms.HmacSha256,\n SecurityAlgorithms.HmacSha384,\n SecurityAlgorithms.HmacSha512\n ];\n});\n```\n\n\u003chttps://github.com/DuendeSoftware/products/pull/2077>\n\n## Step 3: Done!\n\n[Section titled \"Step 3: Done!\"](#step-3-done)\n\nThat's it. Of course, at this point you can and should test that your IdentityServer is updated and working properly.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6285,"content_sha256":"800ab383c852a745c3787b2b00fbc2c915d254d2285b0af427ee156a55a9bf8a"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver-v73-to-v74.md","content":"---\ntitle: Duende IdentityServer v7.3 to v7.4\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver-v73-to-v74/\nsource_type: llms-full-txt\ncontent_hash: sha256:10ab4ed66fbb8c1ae4a9821e1e6fbe7e49989735ef0b671d866e89e4e6748e48\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver-v73-to-v74\n---\n\nThis upgrade guide covers upgrading from Duende IdentityServer v7.3 to v7.4 ([release notes](https://github.com/DuendeSoftware/products/releases/tag/is-7.4.0)).\n\nIdentityServer 7.4 is a significant release that includes:\n\n* Support for [.NET 10](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/overview)\n* Support for OAuth 2.0 Authorization Server Metadata ([RFC 8414](https://www.rfc-editor.org/rfc/rfc8414.html))\n* Add service for diagnostic data by [@josephdecock](https://github.com/josephdecock) in [#2252](https://github.com/DuendeSoftware/products/pull/2252)\n* Trigger Back Channel Logout Earlier in Pipeline by [@bhazen](https://github.com/bhazen) in [#2258](https://github.com/DuendeSoftware/products/pull/2258)\n* Enable Customizing ErrorMessage on Redirect to Error Page by [@bhazen](https://github.com/bhazen) in [#2263](https://github.com/DuendeSoftware/products/pull/2263)\n* Better DCR Support for Public Clients by [@bhazen](https://github.com/bhazen) in [#2264](https://github.com/DuendeSoftware/products/pull/2264)\n* New Callback option for path detection in Dynamic Providers\n* Improved UI locales support\n* Support for custom parameters in the Authorize Redirect Uri\n* Identity package now persists session claims based on an interface\n* Skipping front-channel logout iframe when unnecessary\n* Set HTTP activity name on routing\n\nThere are no schema changes needed for IdentityServer 7.4. Small code changes may be required for some users to upgrade:\n\n* Removed public unused class `Duende.IdentityServer.Models.DiscoveryDocument`\n* Marked static properties referring to counters in `Telemetry.cs` as `readonly`\n\nNote that `Duende.IdentityServer.EntityFramework.Storage` now depends on Entity Framework Core 9.x in the `net8.0` target framework, which should be fully supported on both .NET 8 and .NET 9. .NET 10 projects will use Entity Framework Core 10.x.\n\n## Step 1: Update NuGet package\n\n[Section titled \"Step 1: Update NuGet package\"](#step-1-update-nuget-package)\n\nIn your IdentityServer host project, update the version of the NuGet. For example, in your project file:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.3.0\" />\n```\n\nwould change to:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.4.7\" />\n```\n\n## Step 2: Breaking Changes\n\n[Section titled \"Step 2: Breaking Changes\"](#step-2-breaking-changes)\n\nSmall code changes may be required for some users to upgrade.\n\n#### Removed public unused class `Duende.IdentityServer.Models.DiscoveryDocument`\n\n[Section titled \"Removed public unused class Duende.IdentityServer.Models.DiscoveryDocument\"](#removed-public-unused-class-duendeidentityservermodelsdiscoverydocument)\n\nIn the process of internal code cleanup, we found that the `Duende.IdentityServer.Models.DiscoveryDocument` class was public but not used anywhere in the codebase.\n\nIf you were using this class in your codebase, you would need to replace it with your own implementation or use a different class that provides similar functionality. You can find the removed class in the [pull request](https://github.com/DuendeSoftware/products/pull/2128/files#diff-b9470315ba30a728f573d4fd52fae80da4f3f180b19d5e1b9b0bf3a9c7ce6841).\n\n\u003chttps://github.com/DuendeSoftware/products/pull/2128>\n\n#### Marked static properties referring to counters in `Telemetry.cs` as `readonly`\n\n[Section titled \"Marked static properties referring to counters in Telemetry.cs as readonly\"](#marked-static-properties-referring-to-counters-in-telemetrycs-as-readonly)\n\nIn the process of internal code cleanup, these properties were updated to be marked as `readonly`. Code should not have been updating these properties as it would likely change the behavior of the telemetry emitted by IdentityServer.\n\nAny code which was updating these properties should instead create its own counters for their specific scenario.\n\n\u003chttps://github.com/DuendeSoftware/products/pull/2170>\n\n## Step 3: Done!\n\n[Section titled \"Step 3: Done!\"](#step-3-done)\n\nThat's it. Of course, at this point, you can and should test that your IdentityServer is updated and working properly.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4478,"content_sha256":"d04bce6a6b72b5f840bc157e6fe577e5b74df37cfe9d6af3dd0ee163b4a4e7cd"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver-v74-to-v80.md","content":"---\ntitle: Duende IdentityServer v7.4 to v8.0\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver-v74-to-v80/\nsource_type: llms-full-txt\ncontent_hash: sha256:0c68cf474644d68bdd6d55ff2f1dade0286ea1a782844ce1530891e5931376c0\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver-v74-to-v80\n---\n\n> Upgrade guide from IdentityServer v7.4 to v8.0 covering .NET 10, breaking changes, SAML 2.0 support, and new features.\n\nPrerelease version\n\nIdentityServer v8.0 is currently a prerelease version.\n\nIdentityServer v8.0 includes support for .NET 10, SAML 2.0 Identity Provider support, conformance reporting, and many other fixes and enhancements.\n\n## Step 1: Update .NET Version\n\n[Section titled \"Step 1: Update .NET Version\"](#step-1-update-net-version)\n\nIdentityServer 8.0 targets .NET 10 only. In your IdentityServer host project, update the target framework. For example, in your project file:\n\n```xml\n\u003cTargetFramework>net8.0\u003c/TargetFramework>\n```\n\nor\n\n```xml\n\u003cTargetFramework>net9.0\u003c/TargetFramework>\n```\n\nwould change to:\n\n```xml\n\u003cTargetFramework>net10.0\u003c/TargetFramework>\n```\n\nAny NuGet packages you use that target an older version of .NET should also be updated. For example, `Microsoft.EntityFrameworkCore.SqlServer` or `Microsoft.AspNetCore.Authentication.Google` should be updated to their .NET 10-compatible versions. Depending on your IdentityServer host project, there may or may not be code changes from those updated dependencies.\n\n## Step 2: Update NuGet Packages\n\n[Section titled \"Step 2: Update NuGet Packages\"](#step-2-update-nuget-packages)\n\nIn your IdentityServer host project, update the version of the Duende.IdentityServer package. For example, in your project file:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"7.4.0\"/>\n```\n\nwould change to:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer\" Version=\"8.0.0-*\"/>\n```\n\nIf you use any of the other Duende.IdentityServer packages, update those as well:\n\n```xml\n\u003cPackageReference Include=\"Duende.IdentityServer.EntityFramework\" Version=\"8.0.0-*\"/>\n\u003cPackageReference Include=\"Duende.IdentityServer.AspNetIdentity\" Version=\"8.0.0-*\"/>\n\u003cPackageReference Include=\"Duende.IdentityServer.Configuration\" Version=\"8.0.0-*\"/>\n```\n\n## Step 3: Update Database Schema\n\n[Section titled \"Step 3: Update Database Schema\"](#step-3-update-database-schema)\n\nIf you are using the SAML 2.0 Identity Provider feature and the Entity Framework storage packages, new tables are required to store SAML Service Provider configurations. Run the following migration commands to update your database schema:\n\n```bash\ndotnet ef migrations add Update_DuendeIdentityServer_v8_0 -c ConfigurationDbContext -o Migrations/ConfigurationDb\ndotnet ef database update -c ConfigurationDbContext\n```\n\nThe migration creates five new tables in the configuration database: `SamlServiceProviders`, `SamlServiceProviderAssertionConsumerServices`, `SamlServiceProviderSigningCertificates`, `SamlServiceProviderEncryptionCertificates`, and `SamlServiceProviderClaimMappings`.\n\nSQL Server database objects created by this migration\n\n```sql\n-- saml-service-providers.sql\nCREATE TABLE [SamlServiceProviders] (\n [Id] int NOT NULL IDENTITY,\n [EntityId] nvarchar(200) NOT NULL,\n [DisplayName] nvarchar(200) NULL,\n [Description] nvarchar(1000) NULL,\n [Enabled] bit NOT NULL DEFAULT CAST(1 AS bit),\n [ClockSkewTicks] bigint NULL,\n [RequestMaxAgeTicks] bigint NULL,\n [AssertionConsumerServiceBinding] int NOT NULL,\n [SingleLogoutServiceUrl] nvarchar(2000) NULL,\n [SingleLogoutServiceBinding] int NULL,\n [RequireSignedAuthnRequests] bit NOT NULL,\n [EncryptAssertions] bit NOT NULL,\n [RequireConsent] bit NOT NULL,\n [AllowIdpInitiated] bit NOT NULL,\n [DefaultNameIdFormat] nvarchar(500) NOT NULL DEFAULT N'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',\n [DefaultPersistentNameIdentifierClaimType] nvarchar(500) NULL,\n [SigningBehavior] int NULL,\n [Created] datetime2 NOT NULL,\n [Updated] datetime2 NULL,\n [LastAccessed] datetime2 NULL,\n [NonEditable] bit NOT NULL,\n CONSTRAINT [PK_SamlServiceProviders] PRIMARY KEY ([Id])\n);\n\n\nCREATE UNIQUE INDEX [IX_SamlServiceProviders_EntityId]\n ON [SamlServiceProviders] ([EntityId]);\n\n\nCREATE TABLE [SamlServiceProviderAssertionConsumerServices] (\n [Id] int NOT NULL IDENTITY,\n [Url] nvarchar(2000) NOT NULL,\n [SamlServiceProviderId] int NOT NULL,\n CONSTRAINT [PK_SamlServiceProviderAssertionConsumerServices] PRIMARY KEY ([Id]),\n CONSTRAINT [FK_SamlServiceProviderAssertionConsumerServices_SamlServiceProviders_SamlServiceProviderId]\n FOREIGN KEY ([SamlServiceProviderId]) REFERENCES [SamlServiceProviders] ([Id]) ON DELETE CASCADE\n);\n\n\nCREATE UNIQUE INDEX [IX_SamlServiceProviderACS_ProviderId_Url]\n ON [SamlServiceProviderAssertionConsumerServices] ([SamlServiceProviderId], [Url]);\n\n\nCREATE TABLE [SamlServiceProviderSigningCertificates] (\n [Id] int NOT NULL IDENTITY,\n [Data] nvarchar(4000) NOT NULL,\n [SamlServiceProviderId] int NOT NULL,\n CONSTRAINT [PK_SamlServiceProviderSigningCertificates] PRIMARY KEY ([Id]),\n CONSTRAINT [FK_SamlServiceProviderSigningCertificates_SamlServiceProviders_SamlServiceProviderId]\n FOREIGN KEY ([SamlServiceProviderId]) REFERENCES [SamlServiceProviders] ([Id]) ON DELETE CASCADE\n);\n\n\nCREATE TABLE [SamlServiceProviderEncryptionCertificates] (\n [Id] int NOT NULL IDENTITY,\n [Data] nvarchar(4000) NOT NULL,\n [SamlServiceProviderId] int NOT NULL,\n CONSTRAINT [PK_SamlServiceProviderEncryptionCertificates] PRIMARY KEY ([Id]),\n CONSTRAINT [FK_SamlServiceProviderEncryptionCertificates_SamlServiceProviders_SamlServiceProviderId]\n FOREIGN KEY ([SamlServiceProviderId]) REFERENCES [SamlServiceProviders] ([Id]) ON DELETE CASCADE\n);\n\n\nCREATE TABLE [SamlServiceProviderClaimMappings] (\n [Id] int NOT NULL IDENTITY,\n [ClaimType] nvarchar(250) NOT NULL,\n [SamlAttributeName] nvarchar(250) NOT NULL,\n [SamlServiceProviderId] int NOT NULL,\n CONSTRAINT [PK_SamlServiceProviderClaimMappings] PRIMARY KEY ([Id]),\n CONSTRAINT [FK_SamlServiceProviderClaimMappings_SamlServiceProviders_SamlServiceProviderId]\n FOREIGN KEY ([SamlServiceProviderId]) REFERENCES [SamlServiceProviders] ([Id]) ON DELETE CASCADE\n);\n\n\nCREATE UNIQUE INDEX [IX_SamlServiceProviderClaimMappings_ProviderId_ClaimType]\n ON [SamlServiceProviderClaimMappings] ([SamlServiceProviderId], [ClaimType]);\n```\n\nIf you are not using the SAML 2.0 feature, no schema changes are required.\n\n#### Custom Store Implementations\n\n[Section titled \"Custom Store Implementations\"](#custom-store-implementations)\n\nIf your IdentityServer implementation uses a custom `IClientStore`, you must add the new `GetAllClientsAsync` method (see [Breaking Change](#iclientstoregetallclientsasync-now-required) below).\n\n#### Duende.IdentityServer.EntityFramework\n\n[Section titled \"Duende.IdentityServer.EntityFramework\"](#duendeidentityserverentityframework)\n\nIf you are using `Duende.IdentityServer.EntityFramework`, the package migration will handle schema updates automatically when you run the EF migrations command above.\n\n## Step 4: Breaking Changes\n\n[Section titled \"Step 4: Breaking Changes\"](#step-4-breaking-changes)\n\n### IClock Removed -- Use TimeProvider\n\n[Section titled \"IClock Removed -- Use TimeProvider\"](#iclock-removed--use-timeprovider)\n\n`Duende.IdentityServer.IClock` has been removed. Replace it with the standard .NET `System.TimeProvider` (available since .NET 8).\n\n```csharp\n// Before (v7.x)\npublic class MyService\n{\n public MyService(IClock clock) { }\n}\n\n\n// After (v8.0)\npublic class MyService\n{\n public MyService(TimeProvider timeProvider) { }\n}\n```\n\nTo get the current time, use `timeProvider.GetUtcNow()` instead of `clock.UtcNow`.\n\nInternal IdentityServer services such as `DefaultTokenCreationService` and `DefaultTokenService` have been updated to accept `TimeProvider` in place of `IClock`.\n\n### CancellationToken Now Required on All Interface Methods\n\n[Section titled \"CancellationToken Now Required on All Interface Methods\"](#cancellationtoken-now-required-on-all-interface-methods)\n\nAll store and service interfaces now include a `CancellationToken` parameter on every async method. The parameter name is `ct` (not `cancellationToken`).\n\n```csharp\n// Before (v7.x)\npublic class MyClientStore : IClientStore\n{\n public Task\u003cClient?> FindClientByIdAsync(string clientId)\n {\n // ...\n }\n}\n\n\n// After (v8.0)\npublic class MyClientStore : IClientStore\n{\n public Task\u003cClient?> FindClientByIdAsync(string clientId, CancellationToken ct)\n {\n // ...\n }\n\n\n public IAsyncEnumerable\u003cClient> GetAllClientsAsync(CancellationToken ct)\n {\n // ...\n }\n}\n```\n\nThis applies to all store interfaces in `Duende.IdentityServer.Stores` and service interfaces in `Duende.IdentityServer.Services`. Update all custom implementations to add the `CancellationToken ct` parameter.\n\n### ICancellationTokenProvider Removed\n\n[Section titled \"ICancellationTokenProvider Removed\"](#icancellationtokenprovider-removed)\n\n`ICancellationTokenProvider` has been removed from both `Duende.IdentityServer` and `Duende.IdentityServer.Configuration.EntityFramework`. If you injected this service, remove that dependency. Use the `CancellationToken` passed directly to interface methods instead.\n\n### HTTP 303 Redirects Now Unconditional\n\n[Section titled \"HTTP 303 Redirects Now Unconditional\"](#http-303-redirects-now-unconditional)\n\nIdentityServer now always uses HTTP 303 (See Other) for redirects from POST endpoints, in compliance with [FAPI 2.0 Section 5.3.2.2](https://openid.net/specs/fapi-security-profile-2_0.html).\n\n### IClientStore.GetAllClientsAsync Now Required\n\n[Section titled \"IClientStore.GetAllClientsAsync Now Required\"](#iclientstoregetallclientsasync-now-required)\n\n`IClientStore` now includes a second required method:\n\n```csharp\nIAsyncEnumerable\u003cClient> GetAllClientsAsync(CancellationToken ct);\n```\n\nAll custom `IClientStore` implementations must add this method. It is used by the conformance report and configuration validation features. Return an async enumerable of all configured clients.\n\nFor the in-memory store, this returns all clients passed to `AddInMemoryClients`. For Entity Framework, it queries the `Clients` table. Custom implementations should return all clients without filtering.\n\n### DPoP Changes (JwtBearer Package)\n\n[Section titled \"DPoP Changes (JwtBearer Package)\"](#dpop-changes-jwtbearer-package)\n\nThe `Client.DPoPValidationMode` property (of type `DPoPTokenExpirationValidationMode`) is **unchanged** in IdentityServer's client model.\n\nIn the **JwtBearer** package (`Duende.AspNetCore.Authentication.JwtBearer`), the DPoP configuration was restructured for v8.0:\n\n* New enum `DPoPProofExpirationMode` with values `IssuedAt`, `Nonce`, and `Both`\n* `DPoPOptions.ProofTokenExpirationMode` property (default: `IssuedAt`)\n* New properties: `ProofTokenIssuedAtClockSkew`, `ProofTokenNonceClockSkew`, `EnableReplayDetection`\n* New interface `IDPoPNonceValidator` with default implementation `DefaultDPoPNonceValidator`\n* `DPoPExtensions` class replaced by `DPoPServiceCollectionExtensions`\n\nUpdate any code that references `DPoPExtensions` to use `DPoPServiceCollectionExtensions` instead.\n\n## Step 5: New Features\n\n[Section titled \"Step 5: New Features\"](#step-5-new-features)\n\n### SAML 2.0 Identity Provider\n\n[Section titled \"SAML 2.0 Identity Provider\"](#saml-20-identity-provider)\n\nIdentityServer 8.0 adds support for acting as a SAML 2.0 Identity Provider, enabling integration with enterprise applications and legacy systems that use SAML. See the [SAML 2.0 documentation](/identityserver/saml/) for setup and configuration details.\n\nNote\n\nSAML 2.0 Identity Provider support requires an Enterprise Edition license.\n\n### Conformance Report\n\n[Section titled \"Conformance Report\"](#conformance-report)\n\nA new `Duende.IdentityServer.ConformanceReport` package generates an HTML report assessing your IdentityServer deployment against OAuth 2.1 and FAPI 2.0 specifications. See the [Conformance Report documentation](/identityserver/diagnostics/conformance-report/) for details.\n\n## Step 6: Done!\n\n[Section titled \"Step 6: Done!\"](#step-6-done)\n\nThat's it. Of course, at this point you can and should test that your IdentityServer is updated and working properly.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":12409,"content_sha256":"ecaf8633442e68d0f759b5f6f4e0b4132087ae8d6e6432fcb9d3271287a3c4a2"},{"filename":"canonical/duendesoftware-com/identityserver/duende-identityserver.md","content":"---\ntitle: Duende IdentityServer\nsource_url: https://docs.duendesoftware.com/identityserver/duende-identityserver/\nsource_type: llms-full-txt\ncontent_hash: sha256:bdeb5a0d69e4f66238b7f3f145f679d56edb1288a2443d02419ec0d5181e2322\ncategory: identityserver\ndoc_id: identityserver/duende-identityserver\n---\n\n> Overview of Duende IdentityServer framework for OpenID Connect and OAuth 2.x protocols, covering extensibility, security scenarios, licensing, and support.\n\nDuende IdentityServer is a highly extensible, standards-compliant framework for implementing the OpenID Connect and OAuth 2.x protocols in ASP.NET Core. It offers deep flexibility for handling authentication, authorization, and token issuance and can be adapted to fit complex custom security scenarios.\n\n[GitHub Repository ](https://github.com/DuendeSoftware/products/tree/main/identity-server/)View the source code for this library on GitHub.\n\n[NuGet Package ](https://www.nuget.org/packages/Duende.IdentityServer/)View the package on NuGet.org.\n\n## Extensibility Points\n\n[Section titled \"Extensibility Points\"](#extensibility-points)\n\n* **Customizable User Experience**: Go beyond simple branding to fully customizable user interfaces.\n* **Core Engine Customization**: The engine itself is modular and built from services that can be extended or overridden.\n\n## Advanced Security Scenarios\n\n[Section titled \"Advanced Security Scenarios\"](#advanced-security-scenarios)\n\nDuende IdentityServer supports a wide range of security scenarios for modern applications:\n\n* **Federation**: Easily integrate with external identity providers or other authentication services using [federation](/identityserver/ui/federation/).\n* **Token Exchange**: Enable secure token exchange between clients and services with [Token Exchange](/identityserver/tokens/extension-grants/#token-exchange).\n* **Audience Constrained Tokens**: Restrict tokens to specific audiences, increasing security in multi-service architectures. Learn more about [audience-constrained tokens](/identityserver/fundamentals/resources/isolation/).\n* **Sender Constrained Tokens**: Implement Proof of Possession (PoP) tokens with [DPoP or mTLS](/identityserver/tokens/pop/), which bind tokens to the client, adding another layer of protection.\n* **Pushed Authorization Requests (PAR)**: Support [Pushed Authorization Requests](/identityserver/tokens/par/) to enhance the security of the authorization flow.\n* **FAPI 2.0**: protect APIs in high-value scenarios with the[FAPI 2.0 Security profile](/identityserver/tokens/fapi-2-0-specification/).\n\n## Licensing\n\n[Section titled \"Licensing\"](#licensing)\n\nDuende IdentityServer is source-available, but **requires a paid [license](https://duendesoftware.com/products/identityserver) for production use.**\n\n* **Development and Testing**: You are free to use and explore the code for development, testing, or personal projects without a license.\n* **Production**: A license is required for production environments.\n* **Free Community Edition**: A free Community Edition license is available for qualifying companies and non-profit organizations. Learn more [here](https://duendesoftware.com/products/communityedition).\n\n## Reporting Issues and Getting Support\n\n[Section titled \"Reporting Issues and Getting Support\"](#reporting-issues-and-getting-support)\n\n* For bug reports or feature requests, [use our developer community forum](https://github.com/DuendeSoftware/community).\n* For security-related concerns, please contact us privately at: **\[email protected]>**.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3537,"content_sha256":"4d50002a1b01766b886640cbba899074bb405615189c0cd159ae2a33d499c12c"},{"filename":"canonical/duendesoftware-com/identityserver/duende-software-docs.md","content":"---\ntitle: Duende Software Docs\nsource_url: https://docs.duendesoftware.com/identityserver/\nsource_type: llms-full-txt\ncontent_hash: sha256:2f660394c73393bd00a6df5a4d84a5e685bcfc8b566e8c199c05c5c421f783f3\ncategory: identityserver\ndoc_id: identityserver/duende-software-docs\n---\n\n> Get started building your .NET applications with IdentityServer, Backend-for-Frontend (BFF) and our open-source tools.\n\nInstall templates\n\nInstall the [Duende templates](/identityserver/overview/packaging/#templates) to get started quickly.\n\nTerminal\n\n```bash\ndotnet new install Duende.Templates\ndotnet new duende-is -o DuendeIdentityServer\ndotnet run --project DuendeIdentityServer\n```\n\nDemo Server\n\nExperience IdentityServer in action with our live demo server. Test OAuth 2.0 and OpenID Connect flows, explore client configurations, and see how security tokens work in practice.\n\n[Try it out](https://demo.duendesoftware.com)\n\nIdentityServer\n\nThe most flexible and standards-compliant OpenID Connect and OAuth 2.0 framework for ASP.NET Core.\n\n[Learn more](/identityserver/)\n\nBackend-for-Frontend (BFF)\n\nSecuring SPAs and Blazor WASM Applications once and for all, without storing tokens in the browser.\n\n[Learn more](/bff/)\n\nAccess Token Management\n\nOSS .NET identity library for access token management.\n\n[Learn more](/accesstokenmanagement/)\n\nIdentity Model\n\nOSS .NET identity library for OAuth 2.0 related protocol operations.\n\n[Learn more](/identitymodel/)\n\nOIDC Client\n\nOSS .NET identity libraries for OpenID Connect related protocol operations.\n\n[Learn more](/identitymodel-oidcclient/)\n\nIntrospection for ASP.NET Core\n\nOSS ASP.NET Core authentication handler for OAuth 2.0 token introspection.\n\n[Learn more](/introspection/)\n\n***\n\nSubscribe To Our Newsletter!\n\nStay ahead in the world of identity and access management!\n\n* Latest security best practices\n* Product updates and releases\n* Technical tips and implementation guides\n* Industry news and trends\n\nJoin our community of developers and security professionals building secure applications.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2037,"content_sha256":"7bebf80312b9eef69d647f30e386ee9367bbcb4147ddcf9fe933b841949423cd"},{"filename":"canonical/duendesoftware-com/identityserver/dynamic-request-validation-and-customization.md","content":"---\ntitle: Dynamic Request Validation and Customization\nsource_url: https://docs.duendesoftware.com/identityserver/dynamic-request-validation-and-customization/\nsource_type: llms-full-txt\ncontent_hash: sha256:a4fb71f4c8973a084977c185f508f2de7bcd71cfbd44ee8d32258c5c97ccc50d\ncategory: identityserver\ndoc_id: identityserver/dynamic-request-validation-and-customization\n---\n\n> A guide to implementing the ICustomTokenRequestValidator interface to extend the token request pipeline with additional validation logic, custom processing, response parameter additions, and on-the-fly parameter modifications.\n\nYou can hook into the token request pipeline by implementing the [ICustomTokenRequestValidator](/identityserver/reference/validators/custom-token-request-validator/) interface.\n\nThis allows you to\n\n* add additional token request validation logic\n\n* do custom per-client processing\n\n* add custom response parameters\n\n* return custom errors and error descriptions\n\n* modify parameters on-the-fly\n\n * access token lifetime and type\n * client claims\n * confirmation method\n\nThe following example emits additional claims and changes the token lifetime on-the-fly based on a granted scope.\n\n```csharp\npublic class TransactionScopeTokenRequestValidator : ICustomTokenRequestValidator\n{\n public Task ValidateAsync(CustomTokenRequestValidationContext context)\n {\n var transaction = context\n .Result\n .ValidatedRequest\n .ValidatedResources\n .ParsedScopes.FirstOrDefault(x => x.ParsedName == \"transaction\");\n\n\n // transaction scope has been requested\n if (transaction?.ParsedParameter != null)\n {\n // emit transaction id as a claim\n context.Result.ValidatedRequest.ClientClaims.Add(\n new Claim(transaction.ParsedName, transaction.ParsedParameter));\n\n\n // also shorten token lifetime\n context.Result.ValidatedRequest.AccessTokenLifetime = 10;\n }\n\n\n return Task.CompletedTask;\n }\n}\n```\n\nYou can register your implementation like this:\n\nProgram.cs\n\n```csharp\nidsvrBuilder.AddCustomTokenRequestValidator\u003cTransactionScopeTokenRequestValidator>();\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2210,"content_sha256":"78a061793a327c698e1a4572011b5c71b4d7c239357689164298b3ce9b5c9b34"},{"filename":"canonical/duendesoftware-com/identityserver/entity-framework-core-options.md","content":"---\ntitle: Entity Framework Core Options\nsource_url: https://docs.duendesoftware.com/identityserver/entity-framework-core-options/\nsource_type: llms-full-txt\ncontent_hash: sha256:a4399c275d1bb37fbd39e16f9d9e72f1056376f1a6aa771479771eb0eb7bcae3\nlast_fetched: '2025-12-16T19:17:33Z'\ncategory: identityserver\ndoc_id: identityserver/entity-framework-core-options\n---\n\n> Configuration options available when using Entity Framework Core as the storage implementation for IdentityServer.\n\nIf using the [Entity Framework Core store implementation](/identityserver/data/ef/), you might need to configure those specific options.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":619,"content_sha256":"a4c37e5bd0a424f1c24485c23dd29c55daee86930d959d73c0ce8c20f94d8b08"},{"filename":"canonical/duendesoftware-com/identityserver/error.md","content":"---\ntitle: Error\nsource_url: https://docs.duendesoftware.com/identityserver/ui/error/\nsource_type: llms-full-txt\ncontent_hash: sha256:12880b63a4194deb2a3e040c97d7f4acb38075d49d458816fadf9d668eaa94db\ncategory: identityserver\ndoc_id: identityserver/error\n---\n\n> Documentation for implementing the error page in IdentityServer, which displays information to users when errors occur during the authorization process.\n\nThe error page is used to display to the end user that an error has occurred during a request to the [authorize endpoint](/identityserver/reference/endpoints/authorize/).\n\nWhen an error occurs, IdentityServer will redirect the user to a configurable `ErrorUrl`.\n\nProgram.cs\n\n```csharp\nbuilder.Services.AddIdentityServer(opt => {\n opt.UserInteraction.ErrorUrl = \"/path/to/error\";\n})\n```\n\nThe default `ErrorUrl` is \"/home/error\". The quickstart UI includes a basic implementation of an error page at that route.\n\nErrors are commonly due to misconfiguration, and there's not much an end user can do about that. But this allows the user to understand that something went wrong and that they are not in the middle of a successful workflow.\n\n## Error Context\n\n[Section titled \"Error Context\"](#error-context)\n\nDetails of the error are provided to the error page via a query string parameter. That parameter's name is configurable using the `ErrorId` option.\n\nProgram.cs\n\n```csharp\nbuilder.Services.AddIdentityServer(opt => {\n opt.UserInteraction.ErrorId = \"ErrorQueryStringParamName\";\n})\n```\n\nBy default, the `ErrorId` is the string \"errorId\".\n\nThe [interaction service](/identityserver/reference/services/interaction-service/#iidentityserverinteractionservice-apis) provides a `GetErrorContextAsync` API that will load error details for an `ErrorId`. The returned [ErrorMessage](/identityserver/reference/services/interaction-service/#errormessage) object contains these details.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1895,"content_sha256":"3ee4f8c563599d06d59d392e9335021ce5cc8697520aaab2f956c5b75d060644"},{"filename":"canonical/duendesoftware-com/identityserver/extension-grant-validator.md","content":"---\ntitle: Extension Grant Validator\nsource_url: https://docs.duendesoftware.com/identityserver/reference/validators/extension-grant-validator/\nsource_type: llms-full-txt\ncontent_hash: sha256:9cb2faf27c1639a2d503e209886e883a1a4d4e65d16b6ee635d91bb43a6298ca\ncategory: identityserver\ndoc_id: identityserver/extension-grant-validator\n---\n\n> Documentation for the IExtensionGrantValidator interface which enables custom OAuth grant types by handling validation of extension grant requests.\n\n#### Duende.IdentityServer.Validation.IExtensionGrantValidator\n\n[Section titled \"Duende.IdentityServer.Validation.IExtensionGrantValidator\"](#duendeidentityservervalidationiextensiongrantvalidator)\n\nUse an implementation of this interface to handle [extension grants](/identityserver/tokens/extension-grants/).\n\n```csharp\npublic interface IExtensionGrantValidator\n{\n /// \u003csummary>\n /// Handles the custom grant request.\n /// \u003c/summary>\n /// \u003cparam name=\"request\">The validation context.\u003c/param>\n Task ValidateAsync(ExtensionGrantValidationContext context);\n\n\n /// \u003csummary>\n /// Returns the grant type this validator can deal with\n /// \u003c/summary>\n /// \u003cvalue>\n /// The type of the grant.\n /// \u003c/value>\n string GrantType { get; }\n}\n```\n\n* **`GrantType`**\n\n Specifies the name of the extension grant that the implementation wants to register for.\n\n* **`ValidateAsync`**\n\n This method gets called at runtime, when a request comes in that is using the registered extension grant. The job of this method is to validate the request and to populate `ExtensionGrantValidationContext.Result` with a [grant validation result](/identityserver/reference/models/grant-validation-result/)\n\nThe instance of the extension grant validator gets registered with:\n\nProgram.cs\n\n```csharp\nbuilder.AddExtensionGrantValidator\u003cMyValidator>();\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1847,"content_sha256":"a07c99fec0875f13ff6d3672aca299057280fc162eb3e76cfd2e2b8ddbc062ce"},{"filename":"canonical/duendesoftware-com/identityserver/external-logout.md","content":"---\ntitle: External Logout\nsource_url: https://docs.duendesoftware.com/identityserver/external-logout/\nsource_type: llms-full-txt\ncontent_hash: sha256:d5c7f472c460fdfde53ea8d2088a57741143de20f5457ab6c88e73eb4f4da951\ncategory: identityserver\ndoc_id: identityserver/external-logout\n---\n\n> Guide to implementing logout from external identity providers in IdentityServer, including detecting provider usage, redirecting users for sign-out, and maintaining state across the redirect flow.\n\nWhen a user is [logging out](/identityserver/ui/logout), and they have used an external identity provider to sign-in then it is likely that they should be redirected to also sign-out of the external provider. Not all external providers support sign-out, as it depends on the protocol and features they support.\n\nDon't forget that your logout page still needs to complete all the other steps to properly sign the user out. This is complicated if the logout page must redirect to an external provider to sign out. To achieve both, it is necessary to have the external provider to redirect the user back to your IdentityServer after signing out of the external provider. Across this redirect exchange, there will be state that must be maintained so the complete sign-out workflow can complete successfully.\n\n## Determining The Identity Provider\n\n[Section titled \"Determining The Identity Provider\"](#determining-the-identity-provider)\n\nTo detect that a user must be redirected to an external identity provider for sign-out is typically done by using an `idp` claim issued into the cookie at IdentityServer. The value is either `local` for a local sign-in or the scheme of the corresponding authentication handler used for an external provider. At sign-out time this claim should be consulted to determine if an external sign-out is required.\n\nNote\n\nThe constant `IdentityServerConstants.LocalIdentityProvider` can be used instead of hard coding the value `local` for the local login provider identifier.\n\n## Redirecting To The External Provider\n\n[Section titled \"Redirecting To The External Provider\"](#redirecting-to-the-external-provider)\n\nTo trigger logout at an external provider, use the `SignOutAsync` extension method on the `HttpContext` (or the `SignOutResult` action result in MVC or Razor Pages). You must pass the scheme of the provider as configured in your startup (which should also match the `idp` claim mentioned above).\n\n```csharp\npublic IActionResult Logout(string logoutId)\n{\n // other code elided\n\n\n var idp = User.FindFirst(\"idp\").Value;\n if (idp != IdentityServerConstants.LocalIdentityProvider)\n {\n return SignOut(idp);\n }\n\n\n // other code elided\n}\n```\n\n## Redirecting Back From The External Provider And State Management\n\n[Section titled \"Redirecting Back From The External Provider And State Management\"](#redirecting-back-from-the-external-provider-and-state-management)\n\nTo redirect back to your IdentityServer after the external provider sign-out, the `RedirectUri` should be used on the `AuthenticationProperties` when using ASP.NET Core's `SignOutAsync` API.\n\nRecall that after we return, we must perform the other steps to complete the logout workflow. These steps require the context passed as the `logoutId` parameter, so this state needs to be round-tripped to the external provider. We can do so by incorporating the `logoutId` value into the `RedirectUri`.\n\nIf there is no `logoutId` parameter on the original logout page request, we still might have context that needs to be round tripped. We can obtain a `logoutId` to use by calling `CreateLogoutContextAsync` API on the [interaction service](/identityserver/reference/services/interaction-service/).\n\nFor example:\n\n```csharp\npublic async Task\u003cIActionResult> Logout(string logoutId)\n{\n // other code elided\n\n\n var idp = User.FindFirst(\"idp\").Value;\n if (idp != IdentityServerConstants.LocalIdentityProvider)\n {\n logoutId = logoutId ?? await _interaction.CreateLogoutContextAsync();\n string url = Url.Action(\"Logout\", new { logoutId = logoutId });\n\n\n return SignOut(new AuthenticationProperties { RedirectUri = url }, idp);\n }\n\n\n // other code elided\n}\n```\n\nOnce the user is signed out of the external provider and then redirected back, the normal sign-out processing at your IdentityServer should execute which involves processing the `logoutId` and doing all necessary cleanup.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4415,"content_sha256":"a1621c3f08a6b7b7b22aa3f074ee24e6db69ffd7a13198878c6616e445d999b7"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/claims.md","content":"---\ntitle: Claims\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/claims/\nsource_type: llms-full-txt\ncontent_hash: sha256:c404ac3672f904d5d19cbc0f4dd8dd1809a2d26158b82bb8ba05149dcd971d97\ndoc_id: identityserver/fundamentals/claims\n---\n\n> Learn about how IdentityServer emits and manages claims for users and clients, including claim emission strategies and serialization\n\nIdentityServer emits claims about users and clients into tokens. You are in full control of which claims you want to emit, in which situations you want to emit those claims, and where to retrieve those claims from.\n\n## User Claims\n\n[Section titled \"User Claims\"](#user-claims)\n\nUser claims can be emitted in both identity and access tokens and in the [userinfo endpoint](/identityserver/reference/endpoints/userinfo/). The central extensibility point to implement to emit claims is called the [profile service](/identityserver/reference/services/profile-service/). The profile service is responsible for both gathering claim data and deciding which claims should be emitted.\n\nWhenever IdentityServer needs the claims for a user, it invokes the registered profile service with a [context](/identityserver/reference/services/profile-service/#duendeidentityservermodelsprofiledatarequestcontext) that presents detailed information about the current request, including\n\n* the client that is making the request\n* the identity of the user\n* the type of the request (access token, id token, or userinfo)\n* the requested claim types, which are the claims types associated with requested scopes and resources\n\n### Strategies For Emitting Claims\n\n[Section titled \"Strategies For Emitting Claims\"](#strategies-for-emitting-claims)\n\nYou can use different strategies to determine which claims to emit based on the information in the profile context.\n\n* emit claims based on the requested claim types\n* emit claims based on user or client identity\n* always emit certain claims\n\n#### Emit Claims Based On The Client's Request\n\n[Section titled \"Emit Claims Based On The Client's Request\"](#emit-claims-based-on-the-clients-request)\n\nYou can filter the claims you emit to only include the claim types requested by the client. If your client requires consent, this will also give end users the opportunity to approve or deny sharing those claims with the client.\n\nClients can request claims in several ways:\n\n* Requesting an [IdentityResource](/identityserver/fundamentals/resources/identity/) by including the scope parameter for the `IdentityResource` requests the claims associated with the `IdentityResource` in its `UserClaims` collection.\n* Requesting an [ApiScope](/identityserver/fundamentals/resources/api-scopes/) by including the scope parameter for the `ApiScope` requests the claims associated with the `ApiScope` in its `UserClaims` collection.\n* Requesting an [ApiResource](/identityserver/fundamentals/resources/api-resources/) by including the resource indicator parameter for the `ApiResource` requests the claims associated with the `ApiResource` in its `UserClaims` collection.\n\nThe `RequestedClaimTypes` property of the `ProfileDataRequestContext` contains the collection of claims requested by the client.\n\nIf your profile service extends the `DefaultProfileService`, you can use its `AddRequestedClaims` method to add only requested and approved claims. The intent is that your profile service can retrieve claim data and then filter that claim data based on what was requested by the client. For example:\n\n```csharp\npublic class SampleProfileService : DefaultProfileService\n{\n public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)\n {\n var claims = await GetClaimsAsync(context);\n\n\n context.AddRequestedClaims(claims);\n }\n\n\n\n\n private async Task\u003cList\u003cClaim>> GetClaimsAsync(ProfileDataRequestContext context)\n {\n // Your implementation that retrieves claims goes here\n }\n}\n```\n\n#### Always Emit Claims\n\n[Section titled \"Always Emit Claims\"](#always-emit-claims)\n\nWe generally recommend emitting claims based on the requested claim types, as that respects the scopes and resources requested by the client and gives the end user an opportunity to consent to this sharing of information. However, if you have claims that don't need to follow such rules, such as claims that are an integral part of the user's identity and that are needed in most scenarios, they can be added by directly updating the `context.IssuedClaims` collection. For example:\n\n```csharp\npublic class SampleProfileService : DefaultProfileService\n{\n public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)\n {\n var claims = await GetClaimsAsync(context);\n context.IssuedClaims.AddRange(claims);\n }\n\n\n\n\n private async Task\u003cClaim> GetClaimsAsync(ProfileDataRequestContext context)\n {\n // Your implementation that retrieves claims goes here\n }\n}\n```\n\n#### Emit Claims Based On The User Or Client Identity\n\n[Section titled \"Emit Claims Based On The User Or Client Identity\"](#emit-claims-based-on-the-user-or-client-identity)\n\nFinally, you might have claims that are only appropriate for certain users or clients. Your `ProfileService` can add whatever filtering or logic that you like.\n\n### The Subject Of The ProfileDataRequestContext\n\n[Section titled \"The Subject Of The ProfileDataRequestContext\"](#the-subject-of-the-profiledatarequestcontext)\n\nWhen the profile service is invoked to add claims to tokens, the `Subject` property on the `ProfileDataRequestContext` contains the principal that was issued during user sign-in. Typically, the profile service will source some claims from the `Subject` and others from databases or other data sources.\n\nWhen the profile service is called for requests to the [userinfo endpoint](/identityserver/reference/endpoints/userinfo/), the `Subject` property will not contain the principal issued during user sign-in, since userinfo calls don't happen as part of a session. Instead, the `Subject` property will contain a claims principal populated with the claims in the access token used to authorize the userinfo call. You can check the caller of the profile service by querying the `Caller` property on the context.\n\n## Client Claims\n\n[Section titled \"Client Claims\"](#client-claims)\n\nClient claims are a set of pre-defined claims that are emitted in access tokens. They are defined on a per-client basis, meaning that each client can have its own unique set of client claims. The following shows an example of a client that is associated with a certain customer in your system:\n\n```csharp\nvar client = new Client\n{\n ClientId = \"client\",\n\n\n // rest omitted\n\n\n Claims =\n {\n new ClientClaim(\"customer_id\", \"123\")\n }\n};\n```\n\nTo avoid accidental collision with user claims, client claims are prefixed with `client_`. For example, the above `ClientClaim` would be emitted as the `client_customer_id` claim type in access tokens. You can change or remove this prefix by setting the `ClientClaimsPrefix` on the [client definition](/identityserver/reference/models/client/#token).\n\nNote\n\nBy default, client claims are only sent in the client credentials flow. If you want to enable them for other flows, you need to set the `AlwaysSendClientClaims` property on the client definition.\n\n### Setting Client Claims Dynamically\n\n[Section titled \"Setting Client Claims Dynamically\"](#setting-client-claims-dynamically)\n\nIf you want to set client claims dynamically, you could either do that at client load time (via a client [store](/identityserver/data) implementation), or using a [custom token request validator](/identityserver/tokens/dynamic-validation/).\n\n## Claim Serialization\n\n[Section titled \"Claim Serialization\"](#claim-serialization)\n\nClaim values are serialized based on the `ClaimValueType` of the claim. Claims that don't specify a `ClaimValueType` are serialized as strings. Claims that specify a `ClaimValueType` of `System.Security.Claims.ClaimValueTypes.Integer`, `System.Security.Claims.ClaimValueTypes.Integer32`, `System.Security.Claims.ClaimValueTypes.Integer64`, `System.Security.Claims.ClaimValueTypes.Double`, or `System.Security.Claims.ClaimValueTypes.Boolean` are parsed as the corresponding type, while those that specify `IdentityServerConstants.ClaimValueTypes.Json` are serialized to JSON using `System.Text.Json`.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8391,"content_sha256":"c555d1c7d18e9f8d5ff120cd64217f172509bad04e66ef228b9b83d4cf14f929"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/clients.md","content":"---\ntitle: Clients\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/clients/\nsource_type: llms-full-txt\ncontent_hash: sha256:396231a36b538a69fb88fea65d894a09cec2c9e0a9f50c81c614a003b59928c8\ndoc_id: identityserver/fundamentals/clients\n---\n\n> A collection of client technology samples demonstrating how to connect different platforms like .NET 4.8 WebForms, MVC, and .NET MAUI to IdentityServer.\n\nThis section contains a collection of samples demonstrating various client technologies connecting to Duende IdentityServer.\n\n### Model Context Protocol (MCP) Client\n\n[Section titled \"Model Context Protocol (MCP) Client\"](#model-context-protocol-mcp-client)\n\nThis sample shows how to secure a Model Context Protocol (MCP) client using OpenID Connect and OAuth 2.0.\n\n[Model Context Protocol (MCP) Client Sample ](https://github.com/DuendeSoftware/samples/tree/main/IdentityServer/v7/McpDemo)GitHub Repository for the Model Context Protocol (MCP) Client Sample\n\n### .NET 4.8 Clients\n\n[Section titled \".NET 4.8 Clients\"](#net-48-clients)\n\nThis sample shows how to add OpenID Connect code flow with PKCE to a .NET 4.8 WebForms client and a .NET 4.8 MVC Client. Each client can log in, logout, make API requests to a .NET 4.8 WebApi using OAuth, and refresh access tokens.\n\n[.NET 4.8 Clients Sample ](https://github.com/DuendeSoftware/Samples/tree/main/various/clients/Owin)GitHub Repository for the .NET 4.8 Clients Sample\n\n### .NET MAUI Client\n\n[Section titled \".NET MAUI Client\"](#net-maui-client)\n\nThis sample shows how to use the [IdentityModel.OidcClient](https://github.com/IdentityModel/IdentityModel.OidcClient) open source library to connect a .NET MAUI app to IdentityServer\n\n[.NET MAUI Client Sample ](https://github.com/DuendeSoftware/Samples/tree/main/various/clients/Maui)GitHub Repository for the .NET MAUI Client Sample\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1850,"content_sha256":"c370ec766b0854dfc57506a4a5d168887d7478711629bfeb3173cde42721a661"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/hosting.md","content":"---\ntitle: Hosting\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/hosting/\nsource_type: llms-full-txt\ncontent_hash: sha256:3d6fcb66b945e6fa9294ed896d3473c653140918c274e89989fc3c56c10dedf0\ndoc_id: identityserver/fundamentals/hosting\n---\n\n> Learn how to host and configure Duende IdentityServer in ASP.NET Core applications by adding services and middleware to the pipeline\n\nYou add the Duende IdentityServer engine to any ASP.NET Core application by adding the relevant services to the dependency injection (DI) system and adding the middleware to the processing pipeline.\n\nNote\n\nWhile technically you could share the ASP.NET Core host between Duende IdentityServer, clients or APIs, we recommend putting your IdentityServer into a separate application.\n\n## Dependency Injection System\n\n[Section titled \"Dependency Injection System\"](#dependency-injection-system)\n\nYou add the necessary services to the ASP.NET Core service provider by calling `AddIdentityServer` at application startup:\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n // ...\n});\n```\n\nMany of the fundamental configuration settings can be set on the options. See the [`IdentityServerOptions`](/identityserver/reference/options/) reference for more details.\n\nThe builder object has a number of extension methods to add additional services to the ASP.NET Core service provider. You can see the full list in the [reference](/identityserver/reference/di/) section, but very commonly you start by adding the configuration stores for clients and resources, e.g.:\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer()\n .AddInMemoryClients(Config.Clients)\n .AddInMemoryIdentityResources(Config.IdentityResources)\n .AddInMemoryApiScopes(Config.ApiScopes)\n```\n\nThe above is using the in-memory stores, but we also support EntityFramework-based implementations and custom stores. See [here](/identityserver/data) for more information.\n\nNote\n\nThe `AddIdentityServer` extensions method also adds the required authentication services (it calls `AddAuthentication` internally). If you want to configure the authentication options, or be explicit about which services are registered, you can use the `AddAuthentication` (and `AddAuthorization`) extension method directly:\n\nProgram.cs\n\n```csharp\nbuilder.Services.AddAuthentication();\nbuilder.Services.AddAuthorization();\n```\n\n## Request Pipeline\n\n[Section titled \"Request Pipeline\"](#request-pipeline)\n\nYou need to add the Duende IdentityServer middleware to the pipeline by calling `UseIdentityServer`.\n\nSince ordering is important in the pipeline, you typically want to put the IdentityServer middleware after the static files, but before the UI framework like MVC.\n\nThis would be a very typical minimal pipeline:\n\nProgram.cs\n\n```csharp\nvar app = builder.Build();\napp.UseStaticFiles();\n\n\napp.UseRouting();\napp.UseIdentityServer();\napp.UseAuthorization();\n\n\napp.MapDefaultControllerRoute();\n```\n\nNote\n\n`UseIdentityServer` includes a call to `UseAuthentication`, so it's not necessary to have both.\n\nHowever, IdentityServer does not include a call to `UseAuthorization`. You will need to add `UseAuthorization` (after `UseIdentityServer`/`UseAuthentication`) to include the authorization middleware into your pipeline. This will enable you to use various authorization features in your application.\n\nIf you use the Duende UI template and its various pages, the use of `UseAuthorization` is required.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3504,"content_sha256":"28512d304881410adea89e517867f51f5911a16b2f8a5e78359bd5ece7adfe31"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/key-management.md","content":"---\ntitle: Key Management\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/key-management/\nsource_type: llms-full-txt\ncontent_hash: sha256:0550f3d58b4d6d69eb3600b62b5a2686c578b5d10ec9e9a7b272f36699ace959\ndoc_id: identityserver/fundamentals/key-management\n---\n\n> Learn how to manage cryptographic keys for token signing in IdentityServer using automatic or static key management\n\nDuende IdentityServer issues several types of tokens that are cryptographically signed, including identity tokens, JWT access tokens, and logout tokens. To create those signatures, IdentityServer needs key material. That key material can be configured automatically, by using the Automatic Key Management feature, or manually, by loading the keys from a secured location with static configuration.\n\nIdentityServer supports [signing](https://tools.ietf.org/html/rfc7515) tokens using the `RS`, `PS` and `ES` family of cryptographic signing algorithms.\n\n## Automatic Key Management\n\n[Section titled \"Automatic Key Management\"](#automatic-key-management)\n\nDuende IdentityServer can manage signing keys for you using the Automatic Key Management feature.\n\nAutomatic Key Management follows best practices for handling signing key material, including\n\n* automatic rotation of keys\n* secure storage of keys at rest using data protection\n* announcement of upcoming new keys\n* maintenance of retired keys\n\nNote\n\nThis feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).\n\n### Configuration\n\n[Section titled \"Configuration\"](#configuration)\n\nAutomatic Key Management is configured by the options in the `KeyManagement` property on the [`IdentityServerOptions`](/identityserver/reference/options/#key-management).\n\n### Managed Key Lifecycle\n\n[Section titled \"Managed Key Lifecycle\"](#managed-key-lifecycle)\n\nKeys created by Automatic Key Management move through several phases. First, new keys are announced, that is, they are added to the list of keys in discovery, but not yet used for signing. After a configurable amount of `PropagationTime`, keys are promoted to be signing credentials, and will be used by IdentityServer to sign tokens. Eventually, enough time will pass that the key is older than the configurable `RotationTime`, at which point the key is retired, but kept in discovery for a configurable `RetentionDuration`. After the `RetentionDuration` has passed, keys are removed from discovery, and optionally deleted.\n\nThe default is to rotate keys every 90 days, announce new keys with 14 days of propagation time, retain old keys for a duration of 14 days, and to delete keys when they are retired.\n\nAll of these options are configurable in the `KeyManagement` options. For example:\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n // new key every 30 days\n options.KeyManagement.RotationInterval = TimeSpan.FromDays(30);\n\n\n // announce new key 2 days in advance in discovery\n options.KeyManagement.PropagationTime = TimeSpan.FromDays(2);\n\n\n // keep old key for 7 days in discovery for validation of tokens\n options.KeyManagement.RetentionDuration = TimeSpan.FromDays(7);\n\n\n // don't delete keys after their retention period is over\n options.KeyManagement.DeleteRetiredKeys = false;\n});\n```\n\n### Key Storage\n\n[Section titled \"Key Storage\"](#key-storage)\n\nAutomatic Key Management stores keys through the abstraction of the [ISigningKeyStore](/identityserver/data/operational/#keys). You can implement this extensibility point to customize the storage of your keys (perhaps using a key vault of some kind), or use one of the two implementations of the `ISigningKeyStore` that we provide:\n\n* the default `FileSystemKeyStore`, which writes keys to the file system.\n* the [EntityFramework operational store](/identityserver/data/ef/#operational-store) which writes keys to a database using EntityFramework.\n\nThe default `FileSystemKeyStore` writes keys to the `KeyPath` directory configured in your IdentityServer host, which defaults to the directory `~/keys`. This directory should be excluded from source control.\n\nIf you are deploying in a load balanced environment and wish to use the `FileSystemKeyStore`, all instances of IdentityServer will need read/write access to the `KeyPath`.\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n // set path to store keys\n options.KeyManagement.KeyPath = \"/home/shared/keys\";\n});\n```\n\n### Encryption Of Keys at Rest\n\n[Section titled \"Encryption Of Keys at Rest\"](#encryption-of-keys-at-rest)\n\nThe keys created by Automatic Key Management are sensitive cryptographic secrets that should be encrypted at rest. By default, keys managed by Automatic Key Management are protected at rest using ASP.NET Core Data Protection. This is controlled with the `DataProtectKeys` flag, which is on by default. We recommend leaving this flag on unless you are using a custom `ISigningKeyStore` to store your keys in a secure location that will ensure keys are encrypted at rest. For example, if you implement the `ISigningKeyStore` to store your keys in Azure Key Vault, you could safely disabled `DataProtectKeys`, relying on Azure Key Vault to encrypt your signing keys at rest.\n\nSee the [deployment](/identityserver/deployment/) section for more information about setting up data protection.\n\n### Manage Multiple Keys\n\n[Section titled \"Manage Multiple Keys\"](#manage-multiple-keys)\n\nBy default, Automatic Key Management will maintain a signing credential and validation keys for a single cryptographic algorithm (`RS256`). You can specify multiple keys, algorithms, and if those keys should additionally get wrapped in an X.509 certificate. Automatic key management will create and rotate keys for each signing algorithm you specify.\n\nNote\n\n*X.509 certificates* have an expiration date, but IdentityServer does not use this data to validate the certificate and throw an exception. If a certificate has expired then you must decide whether to continue using it or replace it with a new certificate.\n\n```csharp\noptions.KeyManagement.SigningAlgorithms = new[]\n{\n // RS256 for older clients (with additional X.509 wrapping)\n new SigningAlgorithmOptions(SecurityAlgorithms.RsaSha256) { UseX509Certificate = true },\n\n\n // PS256\n new SigningAlgorithmOptions(SecurityAlgorithms.RsaSsaPssSha256),\n\n\n // ES256\n new SigningAlgorithmOptions(SecurityAlgorithms.EcdsaSha256)\n};\n```\n\nNote\n\nWhen you register multiple signing algorithms, the first in the list will be the default used for signing tokens. Client and API resource definitions both have an `AllowedTokenSigningAlgorithm` property to override the default on a per resource and client basis.\n\n## Static Key Management\n\n[Section titled \"Static Key Management\"](#static-key-management)\n\nInstead of using [Automatic Key Management](#automatic-key-management), IdentityServer's signing keys can be set manually. Automatic Key Management is generally recommended, but if you want to explicitly control your keys statically, or you have a license that does not include the feature, you will need to manually manage your keys. With static configuration you are responsible for secure storage, loading and rotation of keys.\n\n## Disabling Key Management\n\n[Section titled \"Disabling Key Management\"](#disabling-key-management)\n\nThe automatic key management feature can be disabled by setting the `Enabled` flag to `false` on the `KeyManagement` property of [`IdentityServerOptions`](/identityserver/reference/options/#key-management):\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = false;\n});\n```\n\n## Key Creation\n\n[Section titled \"Key Creation\"](#key-creation)\n\nWithout automatic key management, you are responsible for creating your own cryptographic keys. Such keys can be created with many tools. Some options include:\n\n* Use the PowerShell commandlet [New-SelfSignedCertificate](https://learn.microsoft.com/en-us/powershell/module/pki/new-selfsignedcertificate?view=windowsserver2022-ps) to self-sign your own certificate\n* Create certificates using [Azure KeyVault](https://learn.microsoft.com/en-us/azure/key-vault/certificates/certificate-scenarios)\n* Create certificates using your Public Key Infrastructure.\n* Create certificates using C# (see below)\n\n```csharp\nvar name = \"MySelfSignedCertificate\";\n\n\n// Generate a new key pair\nusing var rsa = RSA.Create(keySizeInBits: 2048);\n\n\n// Create a certificate request\nvar request = new CertificateRequest(\n subjectName: $\"CN={name}\",\n rsa,\n HashAlgorithmName.SHA256,\n RSASignaturePadding.Pkcs1\n);\n\n\n// Self-sign the certificate\nvar certificate = request.CreateSelfSigned(\n DateTimeOffset.Now,\n DateTimeOffset.Now.AddYears(1)\n);\n\n\n// Export the certificate to a PFX file\nvar pfxBytes = certificate.Export(\n // TODO: pick a format\n X509ContentType.Pfx,\n // TODO: change the password\n password: \"password\"\n);\nFile.WriteAllBytes($\"{name}.pfx\", pfxBytes);\nConsole.Write(certificate);\nConsole.WriteLine(\"Self-signed certificate created successfully.\");\nConsole.WriteLine($\"Certificate saved to {name}.pfx\");\n```\n\n## Adding Keys\n\n[Section titled \"Adding Keys\"](#adding-keys)\n\nSigning keys are added with the [`AddSigningCredential`](/identityserver/reference/di/#signing-keys) configuration method:\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer();\nvar key = LoadKeyFromVault(); // (Your code here)\nidsvrBuilder.AddSigningCredential(key, SecurityAlgorithms.RsaSha256);\n```\n\nYou can call `AddSigningCredential` multiple times if you want to register more than one signing key. When you register multiple signing algorithms, the first one added will be the default used for signing tokens. Client and API resource definitions both have an `AllowedTokenSigningAlgorithm` property to override the default on a per resource and client basis.\n\nAnother configuration method called `AddValidationKey` can be called to register public keys that should be accepted for token validation.\n\n## Key Storage\n\n[Section titled \"Key Storage\"](#key-storage-1)\n\nWith automatic key management disabled, secure storage of the key material is left to you. This key material should be treated as highly sensitive. Key material should be encrypted at rest, and access to it should be restricted.\n\nLoading a key from disk into memory can be done using the `X509CertificateLoader` found in .NET assuming your hosting environment has proper security practices in place.\n\n```csharp\n// load certificate from disk\nvar bytes = File.ReadAllBytes(\"mycertificate.pfx\");\nvar importedCertificate = X509CertificateLoader.LoadPkcs12(bytes, \"password\");\n```\n\nYou may also choose to load a certificate from the current environment's key store using the `X509Store` class.\n\n```csharp\n// Pick the appropriate StoreName and StoreLocation\nvar store = new X509Store(StoreName.My, StoreLocation.CurrentUser);\nstore.Open(OpenFlags.ReadWrite);\n\n\nvar certificate = store\n .Certificates\n .First(c => c.Thumbprint == \"\u003cthumbprint>\");\n```\n\nIf you're generating self-signed certificates using C#, you can use the `X509Store` to store the certificate into the current hosting environment as well.\n\n```csharp\n// Pick the appropriate StoreName and StoreLocation\nvar store = new X509Store(StoreName.My, StoreLocation.CurrentUser);\nstore.Open(OpenFlags.ReadWrite);\n\n\n// push certificate into store\nvar certificate = CreateCertificate();\nstore.Add(certificate);\n```\n\n## Manual Key Rotation\n\n[Section titled \"Manual Key Rotation\"](#manual-key-rotation)\n\nWith automatic key management disabled, you will need to rotate your keys manually. The rotation process must be done carefully for two reasons:\n\n1. Client applications and APIs cache key material. If you begin using a new key too quickly, new tokens will be signed with a key that is not yet in their caches. This will cause clients to not be able to validate the signatures of new id tokens which will prevent users from logging in, and APIs will not be able to validate signatures of access tokens, which will prevent authorization of calls to those APIs.\n2. Tokens signed with the old key material probably exist. If you tell APIs to stop using the old key too quickly, APIs will reject the signatures of old tokens, again causing authorization failures at your APIs.\n\nThere are two solutions to these problems. Which one is right for you depends on the level of control you have over client applications, the amount of downtime that is acceptable, and the degree to which invalidating old tokens matters to you.\n\n### Solution 1: Invalidate All Caches When Keys Are Rotated\n\n[Section titled \"Solution 1: Invalidate All Caches When Keys Are Rotated\"](#solution-1-invalidate-all-caches-when-keys-are-rotated)\n\nOne solution to these problems is to invalidate the caches in all the client applications and APIs immediately after the key is rotated. In ASP.NET, the simplest way to do so is to restart the hosting process, which clears the cached signing keys of the authentication middleware.\n\nThis is only appropriate if all the following are true:\n\n* You have control over the deployment of all the client applications.\n* You can tolerate a maintenance window in which your services are all restarted.\n* You don't mind that users will need to log in again after the key is rotated.\n\n### Solution 2: Phased Rotation\n\n[Section titled \"Solution 2: Phased Rotation\"](#solution-2-phased-rotation)\n\nA more robust solution is to gradually transition from the old to the new key. This requires three phases.\n\n#### Phase 1: Announce The New Key\n\n[Section titled \"Phase 1: Announce The New Key\"](#phase-1-announce-the-new-key)\n\nFirst, announce a new key that will be used for signing in the future. During this phase, continue to sign tokens with the old key. The idea is to allow for all the applications and APIs to update their caches without any interruption in service. Configure IdentityServer for phase 1 by registering the new key as a validation key.\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = false;\n});\n\n\nvar oldKey = LoadOldKeyFromVault();\nvar newKey = LoadNewKeyFromVault();\nidsvrBuilder.AddSigningCredential(oldKey, SecurityAlgorithms.RsaSha256);\nidsvrBuilder.AddValidationKey(newKey, SecurityAlgorithms.RsaSha256)\n```\n\nOnce IdentityServer is updated with the new key as a validation key, wait to proceed to phase 2 until all the applications and services have updated their signing key caches. The default cache duration in .NET is 24 hours, but this is customizable. You may also need to support clients or APIs built with other platforms or that were customized to use a different value. Ultimately you have to decide how long to wait to proceed to phase 2 in order to ensure that all clients and APIs have updated their caches.\n\n#### Phase 2: Start Signing With The New Key\n\n[Section titled \"Phase 2: Start Signing With The New Key\"](#phase-2-start-signing-with-the-new-key)\n\nNext, start signing tokens with the new key, but continue to publish the public key of the old key so that tokens that were signed with that key can continue to be validated. The IdentityServer configuration change needed is to swap the signing credential and validation key.\n\nProgram.cs\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = false;\n});\n\n\nvar oldKey = LoadOldKeyFromVault();\nvar newKey = LoadNewKeyFromVault();\nidsvrBuilder.AddSigningCredential(newKey, SecurityAlgorithms.RsaSha256);\nidsvrBuilder.AddValidationKey(oldKey, SecurityAlgorithms.RsaSha256)\n```\n\nAgain, you need to wait to proceed to phase 3. The delay here is typically shorter, because the reason for the delay is to ensure that tokens signed with the old key remain valid until they expire. IdentityServer's token lifetime defaults to 1 hour, though it is configurable.\n\n#### Phase 3: Remove The Old Key\n\n[Section titled \"Phase 3: Remove The Old Key\"](#phase-3-remove-the-old-key)\n\nOnce enough time has passed that there are no unexpired tokens signed with the old key, it is safe to completely remove the old key.\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = false;\n});\n\n\nvar newKey = LoadNewKeyFromVault();\nidsvrBuilder.AddSigningCredential(newKey, SecurityAlgorithms.RsaSha256);\n```\n\n## Migrating From Static Keys To Automatic Key Management\n\n[Section titled \"Migrating From Static Keys To Automatic Key Management\"](#migrating-from-static-keys-to-automatic-key-management)\n\nTo migrate from static to automatic key management, you can set keys manually and enable automatic key management at the same time. This allows the automatic key management feature to begin creating keys and announce them in discovery, while you continue to use the old statically configured key. Eventually you can transition from the statically configured key to the automatically managed keys.\n\nA signing key registered with `AddSigningCredential` will take precedence over any keys created by the automatic key management feature. IdentityServer will sign tokens with the credential specified in `AddSigningCredential`, but also automatically create and manage validation keys.\n\nValidation keys registered manually with `AddValidationKey` are added to the collection of validation keys along with the keys produced by automatic key management. When automatic key management is enabled and there are keys statically specified with `AddValidationkey`, the set of validation keys will include:\n\n* new keys created by automatic key management that are not yet used for signing\n* old keys created by automatic key management that are retired\n* the keys added explicitly with calls to `AddValidationKey`.\n\nThe migration path from manual to automatic keys is a three-phase process, similar to the phased approach to [manual key rotation](#manual-key-rotation). The difference here is that you are phasing out the old key and allowing the automatically generated keys to phase in.\n\n### Phase 1: Announce New (Automatic) Key\n\n[Section titled \"Phase 1: Announce New (Automatic) Key\"](#phase-1-announce-new-automatic-key)\n\nFirst, enable automatic key management while continuing to register your old key as the signing credential. In this phase, the new automatically managed key will be announced so that as client apps and APIs update their caches, they get the new key. IdentityServer will continue to sign keys with your old static key.\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = true;\n});\n\n\nvar oldKey = LoadOldKeyFromVault();\nidsvrBuilder.AddSigningCredential(oldKey, SecurityAlgorithms.RsaSha256);\n```\n\nWait until all APIs and applications have updated their signing key caches, and then proceed to phase 2.\n\n### Phase 2: Start Signing With The New (Automatic) Key\n\n[Section titled \"Phase 2: Start Signing With The New (Automatic) Key\"](#phase-2-start-signing-with-the-new-automatic-key)\n\nNext, switch to using the new automatically managed keys for signing, but still keep the old key for validation purposes.\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = true;\n});\n\n\nvar oldKey = LoadOldKeyFromVault();\nidsvrBuilder.AddValidationKey(oldKey, SecurityAlgorithms.RsaSha256);\n```\n\nKeep the old key as a validation key until all tokens signed with that key are expired, and then proceed to phase 3.\n\n### Phase 3: Drop the old key\n\n[Section titled \"Phase 3: Drop the old key\"](#phase-3-drop-the-old-key)\n\nNow the static key configuration can be removed entirely.\n\n```csharp\nvar idsvrBuilder = builder.Services.AddIdentityServer(options =>\n{\n options.KeyManagement.Enabled = true;\n});\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":19947,"content_sha256":"c2b03760e8eb45e3919f42eabdfb32493065162061ccea0bf43a00092d0b2f68"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/resources/api-resources.md","content":"---\ntitle: API Resources\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/resources/api-resources/\nsource_type: llms-full-txt\ncontent_hash: sha256:4f76207dd76a21c1355120d6a0942e59b9d05055857d3c1e5c46d7e677c2ed57\ndoc_id: identityserver/fundamentals/resources/api-resources\n---\n\n> Learn how API Resources in Duende IdentityServer help organize and group scopes, manage token claims, and control access token properties\n\nWhen the API/resource surface gets larger, a flat list of scopes might become hard to manage.\n\nIn Duende IdentityServer, the `ApiResource` class allows for some additional organization and grouping and isolation of scopes and providing some common settings.\n\nLet's use the following scope definition as an example:\n\n```csharp\npublic static IEnumerable\u003cApiScope> GetApiScopes()\n{\n return new List\u003cApiScope>\n {\n // invoice API specific scopes\n new ApiScope(name: \"invoice.read\", displayName: \"Reads your invoices.\"),\n new ApiScope(name: \"invoice.pay\", displayName: \"Pays your invoices.\"),\n\n\n // customer API specific scopes\n new ApiScope(name: \"customer.read\", displayName: \"Reads you customers information.\"),\n new ApiScope(name: \"customer.contact\", displayName: \"Allows contacting one of your customers.\"),\n\n\n // shared scopes\n new ApiScope(name: \"manage\", displayName: \"Provides administrative access.\"),\n new ApiScope(name: \"enumerate\", displayName: \"Allows enumerating data.\")\n };\n}\n```\n\nWith `ApiResource` you can now create two logical APIs and their corresponding scopes:\n\n```csharp\npublic static readonly IEnumerable\u003cApiResource> GetApiResources()\n{\n return new List\u003cApiResource>\n {\n new ApiResource(\"invoice\", \"Invoice API\")\n {\n Scopes = { \"invoice.read\", \"invoice.pay\", \"manage\", \"enumerate\" }\n },\n\n\n new ApiResource(\"customer\", \"Customer API\")\n {\n Scopes = { \"customer.read\", \"customer.contact\", \"manage\", \"enumerate\" }\n }\n };\n}\n```\n\nUsing the API resource grouping gives you the following additional features\n\n* support for the JWT `aud` claim. The value(s) of the audience claim will be the name of the API resource(s)\n* support for adding common user claims across all contained scopes\n* support for introspection by assigning an API secret to the resource\n* support for configuring the access token signing algorithm for the resource\n\nLet's have a look at some example access tokens for the above resource configuration.\n\nClient requests: *`invoice.read`* and *`invoice.pay`*:\n\n```json\n {\n \"typ\": \"at+jwt\"\n }.\n {\n \"client_id\": \"client\",\n \"sub\": \"123\",\n\n\n \"aud\": \"invoice\",\n \"scope\": \"invoice.read invoice.pay\"\n }\n```\n\nClient requests: *`invoice.read`* and *`customer.read`*:\n\n```json\n {\n \"typ\": \"at+jwt\"\n }.\n {\n \"client_id\": \"client\",\n \"sub\": \"123\",\n\n\n \"aud\": [ \"invoice\", \"customer\" ],\n \"scope\": \"invoice.read customer.read\"\n }\n```\n\nClient requests: *`manage`*:\n\n```json\n {\n \"typ\": \"at+jwt\"\n }.\n {\n \"client_id\": \"client\",\n \"sub\": \"123\",\n\n\n \"aud\": [ \"invoice\", \"customer\" ],\n \"scope\": \"manage\"\n }\n```\n\n### Adding User Claims\n\n[Section titled \"Adding User Claims\"](#adding-user-claims)\n\nYou can specify that an access token for an API resource (regardless of which scope is requested) should contain additional user claims.\n\n```csharp\nvar customerResource = new ApiResource(\"customer\", \"Customer API\")\n {\n Scopes = { \"customer.read\", \"customer.contact\", \"manage\", \"enumerate\" },\n\n\n // additional claims to put into access token\n UserClaims =\n {\n \"department_id\",\n \"sales_region\"\n }\n }\n```\n\nIf a client now requested a scope belonging to the `customer` resource, the access token would contain the additional claims (if provided by your [profile service](/identityserver/reference/services/profile-service/)).\n\n```json\n {\n \"typ\": \"at+jwt\"\n }.\n {\n \"client_id\": \"client\",\n \"sub\": \"123\",\n\n\n \"aud\": [ \"invoice\", \"customer\" ],\n \"scope\": \"invoice.read customer.read\",\n\n\n \"department_id\": 5,\n \"sales_region\": \"south\"\n }\n```\n\n### Setting A Signing Algorithm\n\n[Section titled \"Setting A Signing Algorithm\"](#setting-a-signing-algorithm)\n\nYour APIs might have certain requirements for the cryptographic algorithm used to sign the access tokens for that resource. An example could be regulatory requirements, or that you are starting to migrate your system to higher security algorithms.\n\nThe following sample sets `PS256` as the required signing algorithm for the `invoices` API:\n\n```csharp\nvar invoiceApi = new ApiResource(\"invoice\", \"Invoice API\")\n {\n Scopes = { \"invoice.read\", \"invoice.pay\", \"manage\", \"enumerate\" },\n\n\n AllowedAccessTokenSigningAlgorithms = { SecurityAlgorithms.RsaSsaPssSha256 }\n }\n```\n\nNote\n\nMake sure that you have configured your IdentityServer for the required signing algorithm. See [here](/identityserver/fundamentals/key-management/) for more details.\n\n### Resource Isolation\n\n[Section titled \"Resource Isolation\"](#resource-isolation)\n\nSee [Resource Isolation](/identityserver/fundamentals/resources/isolation/) for more details on how to use the `resource` parameter to request a token with scopes for a specific resource.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5438,"content_sha256":"7ba082dd5cc5ffdb84a98594f74a0143140058dc815dc7da64826958e3b71440"},{"filename":"canonical/duendesoftware-com/identityserver/fundamentals/resources/api-scopes.md","content":"---\ntitle: API Scopes\nsource_url: https://docs.duendesoftware.com/identityserver/fundamentals/resources/api-scopes/\nsource_type: llms-full-txt\ncontent_hash: sha256:18b1df57cedced559553dc9268dba7f8d83ee38a40f78d4387b070489c215f67\ndoc_id: identityserver/fundamentals/resources/api-scopes\n---\n\n> Learn about API scopes in IdentityServer, how to define and use them for access control, and how they work with OAuth 2.0\n\nDesigning your API surface can be a complicated task. Duende IdentityServer provides a couple of primitives to help you with that.\n\nThe original OAuth 2.0 specification has the concept of scopes, which is just defined as *the scope of access* that the client requests. Technically speaking, the `scope` parameter is a list of space delimited values - you need to provide the structure and semantics of it.\n\nIn more complex systems, often the notion of a `resource` is introduced. This might be e.g. a physical or logical API. In turn each API can potentially have scopes as well. Some scopes might be exclusive to that resource, and some scopes might be shared.\n\nLet's start with simple scopes first, and then we'll have a look how resources can help structure scopes.\n\n### Scopes\n\n[Section titled \"Scopes\"](#scopes)\n\nLet's model something very simple - a system that has three logical operations `read`, `write`, and `delete`.\n\nYou can define them using the `ApiScope` class:\n\n```csharp\npublic static IEnumerable\u003cApiScope> GetApiScopes()\n{\n return new List\u003cApiScope>\n {\n new ApiScope(name: \"read\", displayName: \"Read your data.\"),\n new ApiScope(name: \"write\", displayName: \"Write your data.\"),\n new ApiScope(name: \"delete\", displayName: \"Delete your data.\")\n };\n}\n```\n\nYou can then assign the scopes to various clients, e.g.:\n\n```csharp\nvar webViewer = new Client\n{\n ClientId = \"web_viewer\",\n\n\n AllowedScopes = { \"openid\", \"profile\", \"read\" }\n};\n\n\nvar mobileApp = new Client\n{\n ClientId = \"mobile_app\",\n\n\n AllowedScopes = { \"openid\", \"profile\", \"read\", \"write\", \"delete\" }\n}\n```\n\n### Authorization Based On Scopes\n\n[Section titled \"Authorization Based On Scopes\"](#authorization-based-on-scopes)\n\nWhen a client asks for a scope (and that scope is allowed via configuration and not denied via consent), the value of that scope will be included in the resulting access token as a claim of type `scope` (for both JWTs and introspection), e.g.:\n\n```json\n{\n \"typ\": \"at+jwt\"\n}.\n{\n \"client_id\": \"mobile_app\",\n \"sub\": \"123\",\n \"scope\": \"read write delete\"\n}\n```\n\nNote\n\nThe format of the `scope` parameter can be controlled by the `EmitScopesAsSpaceDelimitedStringInJwt` setting on the options. Historically IdentityServer emitted scopes as an array, but you can switch to a space delimited string instead.\n\nThe consumer of the access token can use that data to make sure that the client is actually allowed to invoke the corresponding functionality. See the [APIs](/identityserver/apis) section for more information on protecting APIs with access tokens.\n\nCaution\n\nBe aware, that scopes are purely for authorizing clients, not users. In other words, the `write` scope allows the client to invoke the functionality associated with the scope and is unrelated to the user's permission to do so. This additional user-centric authorization is application logic and not covered by OAuth, yet still possibly important to implement in your API.\n\n### Adding User Claims\n\n[Section titled \"Adding User Claims\"](#adding-user-claims)\n\nYou can add more identity information about the user to the access token. The additional claims added are based on the scope requested. The following scope definition tells the configuration system that when a `write` scope gets granted the `user_level` claim should be added to the access token:\n\n```csharp\nvar writeScope = new ApiScope(\n name: \"write\",\n displayName: \"Write your data.\",\n userClaims: new[] { \"user_level\" });\n```\n\nThis will pass the `user_level` claim as a requested claim type to the profile service, so that the consumer of the access token can use this data as input for authorization decisions or business logic.\n\nNote\n\nWhen using the scope-only model, no aud (audience) claim will be added to the token since this concept does not apply. If you need an aud claim, you can enable the `EmitStaticAudienceClaim` setting on the options. This will emit an aud claim in the `issuer_name/resources` format. If you need more control of the aud claim, use API resources.\n\n### Parameterized Scopes\n\n[Section titled \"Parameterized Scopes\"](#parameterized-scopes)\n\nSometimes scopes have a certain structure, e.g. a scope name with an additional parameter: `transaction:id` or `read_patient:patientid`.\n\nIn this case you would create a scope without the parameter part and assign that name to a client, but in addition provide some logic to parse the structure of the scope at runtime using the `IScopeParser` interface or by deriving from our default implementation, e.g.:\n\n```csharp\npublic class ParameterizedScopeParser : DefaultScopeParser\n{\n public ParameterizedScopeParser(ILogger\u003cDefaultScopeParser> logger) : base(logger)\n { }\n\n\n public override void ParseScopeValue(ParseScopeContext scopeContext)\n {\n const string transactionScopeName = \"transaction\";\n const string separator = \":\";\n const string transactionScopePrefix = transactionScopeName + separator;\n\n\n var scopeValue = scopeContext.RawValue;\n\n\n if (scopeValue.StartsWith(transactionScopePrefix))\n {\n // we get in here with a scope like \"transaction:something\"\n var parts = scopeValue.Split(separator, StringSplitOptions.RemoveEmptyEntries);\n if (parts.Length == 2)\n {\n scopeContext.SetParsedValues(transactionScopeName, parts[1]);\n }\n else\n {\n scopeContext.SetError(\"transaction scope missing transaction parameter value\");\n }\n }\n else if (scopeValue != transactionScopeName)\n {\n // we get in here with a scope not like \"transaction\"\n base.ParseScopeValue(scopeContext);\n }\n else\n {\n // we get in here with a scope exactly \"transaction\", which is to say we're ignoring it\n // and not including it in the results\n scopeContext.SetIgnore();\n }\n }\n}\n```\n\nYou then have access to the parsed value throughout the pipeline, e.g. in the profile service:\n\n```csharp\npublic class HostProfileService : IProfileService\n{\n public override async Task GetProfileDataAsync(ProfileDataRequestContext context)\n {\n var transaction = context.RequestedResources.ParsedScopes.FirstOrDefault(x => x.ParsedName == \"transaction\");\n if (transaction?.ParsedParameter != null)\n {\n context.IssuedClaims.Add(new Claim(\"transaction_id\", transaction.ParsedParameter));\n }\n }\n}\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6942,"content_sha256":"03dd759d6adac1c34179025a89f2e9f5a73341315f44c107853c98dcab6ef17b"},{"filename":"canonical/duendesoftware-com/identityserver/getting-started-templates.md","content":"---\ntitle: Getting Started - Templates\nsource_url: https://docs.duendesoftware.com/identityserver/getting-started-templates/\nsource_type: llms-full-txt\ncontent_hash: sha256:327129dcca7eb75b083a64a658fd3e8e7d94b985c5649d136525e818edf265f1\ncategory: identityserver\ndoc_id: identityserver/getting-started-templates\n---\n\n> A guide on how to install the BFF project templates.\n\nProject templates for Duende BFF are shipped as part of the Duende .NET project templates. Refer the [templates documentation](/identityserver/overview/packaging/#templates) for more information on how to install the templates.\n\n## Available templates\n\n[Section titled \"Available templates\"](#available-templates)\n\n### BFF Remote API\n\n[Section titled \"BFF Remote API\"](#bff-remote-api)\n\n```shell\ndotnet new duende-bff-remoteapi\n```\n\nCreates a basic JavaScript-based BFF host that configures and invokes a [remote API via the BFF proxy](/bff/fundamentals/apis/remote/).\n\n### BFF Local API\n\n[Section titled \"BFF Local API\"](#bff-local-api)\n\n```shell\ndotnet new duende-bff-localapi\n```\n\nCreates a basic JavaScript-based BFF host that invokes a [local API](/bff/fundamentals/apis/local/) co-hosted with the BFF.\n\n### BFF Blazor\n\n[Section titled \"BFF Blazor\"](#bff-blazor)\n\n```shell\ndotnet new duende-bff-blazor\n```\n\nCreates a Blazor application that [uses the interactive auto render mode](/bff/fundamentals/blazor/), and secures the application across all render modes consistently using Duende.BFF.Blazor.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1477,"content_sha256":"ebabe43ea1dcb4095a6e036b9c21fb4a7068fe933c92ffb418d389badacfb74a"},{"filename":"canonical/duendesoftware-com/identityserver/grant-validation-result.md","content":"---\ntitle: Grant Validation Result\nsource_url: https://docs.duendesoftware.com/identityserver/reference/models/grant-validation-result/\nsource_type: llms-full-txt\ncontent_hash: sha256:21de8b249c55794d17d948e5675e38a67969c777682ffee7a000b45543b1fc5f\ncategory: identityserver\ndoc_id: identityserver/grant-validation-result\n---\n\n> Reference documentation for the GrantValidationResult class which models the outcome of grant validation for extension grants and resource owner password grants in Duende IdentityServer.\n\n## Duende.IdentityServer.Validation.GrantValidationResult\n\n[Section titled \"Duende.IdentityServer.Validation.GrantValidationResult\"](#duendeidentityservervalidationgrantvalidationresult)\n\nThe `GrantValidationResult` class models the outcome of grant validation for [extensions grants](/identityserver/tokens/extension-grants/) and [resource owner password grants](/identityserver/tokens/password-grant/).\n\nIt models either a successful validation result with claims (e.g. subject ID) or an invalid result with an error code and message, e.g.:\n\n```csharp\npublic class ExtensionGrantValidator : IExtensionGrantValidator\n{\n public Task ValidateAsync(ExtensionGrantValidationContext context)\n {\n // some validation steps\n\n\n if (success)\n {\n context.Result = new GrantValidationResult(\n subject: \"818727\",\n authenticationMethod: \"custom\",\n claims: extraClaims);\n }\n else\n {\n // custom error message\n context.Result = new GrantValidationResult(\n TokenRequestErrors.InvalidGrant,\n \"invalid custom credential\");\n }\n\n\n return Task.CompletedTask;\n }\n}\n```\n\nIt also allows passing additional custom values that will be included in the token response, e.g.:\n\n```csharp\ncontext.Result = new GrantValidationResult(\n subject: \"818727\",\n authenticationMethod: \"custom\",\n customResponse: new Dictionary\u003cstring, object>\n {\n { \"some_data\", \"some_value\" }\n });\n```\n\nThis will result in the following token response:\n\n```json\n{\n \"access_token\": \"...\",\n \"token_type\": \"Bearer\",\n \"expires_in\": 360,\n \"some_data\": \"some_value\"\n}\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2224,"content_sha256":"d324b223dcbb39ad7df9a76694e999f04dd444376081983cee81271bdcd83cbf"},{"filename":"canonical/duendesoftware-com/identityserver/identity-provider-store.md","content":"---\ntitle: Identity Provider Store\nsource_url: https://docs.duendesoftware.com/identityserver/identity-provider-store/\nsource_type: llms-full-txt\ncontent_hash: sha256:ea6f1e6c1e9c8902694b08ea5fe2b131fe7a76325373039b52c913782986462d\ncategory: identityserver\ndoc_id: identityserver/identity-provider-store\n---\n\n> Documentation for the IIdentityProviderStore interface which dynamically loads identity provider configurations for external authentication.\n\n#### Duende.IdentityServer.Stores.IIdentityProviderStore\n\n[Section titled \"Duende.IdentityServer.Stores.IIdentityProviderStore\"](#duendeidentityserverstoresiidentityproviderstore)\n\nUsed to dynamically load [identity provider configuration](/identityserver/reference/models/idp/).\n\n```csharp\n/// \u003csummary>\n/// Interface to model storage of identity providers.\n/// \u003c/summary>\npublic interface IIdentityProviderStore\n{\n /// \u003csummary>\n /// Gets all identity providers name.\n /// \u003c/summary>\n Task\u003cIEnumerable\u003cIdentityProviderName>> GetAllSchemeNamesAsync(CancellationToken ct);\n\n\n /// \u003csummary>\n /// Gets the identity provider by scheme name.\n /// \u003c/summary>\n /// \u003cparam name=\"scheme\">\u003c/param>\n /// \u003cparam name=\"ct\">The cancellation token.\u003c/param>\n /// \u003creturns>\u003c/returns>\n Task\u003cIdentityProvider?> GetBySchemeAsync(string scheme, CancellationToken ct);\n}\n```\n\nThe `IdentityProvider` is intended to be a base class to model arbitrary identity providers. The default implementation included in *Duende IdentityServer* will return a derived class for OpenID Connect providers, via the `OidcProvider` class.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1585,"content_sha256":"c8a9bcb2a1f0db5374a317fe34fa91bfb885590ee0e4b22a1b14b6e5f3045fa7"},{"filename":"canonical/duendesoftware-com/identityserver/identity-provider.md","content":"---\ntitle: Identity Provider\nsource_url: https://docs.duendesoftware.com/identityserver/identity-provider/\nsource_type: llms-full-txt\ncontent_hash: sha256:82c10316dc779e36d740513c6b004ed05ff3e4a15ae82432d6fb027e5c288896\ncategory: identityserver\ndoc_id: identityserver/identity-provider\n---\n\n> Reference documentation for identity provider models in Duende IdentityServer, including OidcProvider for external OpenID Connect providers, IdentityProviderName, and the base IdentityProvider class.\n\n## Duende.IdentityServer.Models.OidcProvider\n\n[Section titled \"Duende.IdentityServer.Models.OidcProvider\"](#duendeidentityservermodelsoidcprovider)\n\nThe `OidcProvider` models an external OpenID Connect provider for use in the [dynamic providers](/identityserver/ui/login/dynamicproviders/) feature. Its properties map to the Open ID Connect options class from ASP.NET Core, and those properties include:\n\n* **`Enabled`**\n\n Specifies if provider is enabled. Defaults to `true`.\n\n* **`Scheme`**\n\n Scheme name for the provider.\n\n* **`DisplayName`**\n\n Display name for the provider.\n\n* **`Type`**\n\n Protocol type of the provider. Defaults to `\"oidc\"` for the `OidcProvider`.\n\n* **`Authority`**\n\n The base address of the OIDC provider.\n\n* **`ResponseType`**\n\n The response type. Defaults to `\"id_token\"`.\n\n* **`ClientId`**\n\n The client id.\n\n* **`ClientSecret`**\n\n The client secret. By default, this is the plaintext client secret and great consideration should be taken if this value is to be stored as plaintext in the store. It is possible to store this in a protected way and then unprotect when loading from the store either by implementing a custom `IIdentityProviderStore` or registering a custom `IConfigureNamedOptions\u003cOpenIdConnectOptions>`.\n\n* **`Scope`**\n\n Space separated list of scope values.\n\n* **`GetClaimsFromUserInfoEndpoint`**\n\n Indicates if userinfo endpoint is to be contacted. Defaults to true.\n\n* **`UsePkce`**\n\n Indicates if PKCE should be used. Defaults to true.\n\n#### Duende.IdentityServer.Models.IdentityProviderName\n\n[Section titled \"Duende.IdentityServer.Models.IdentityProviderName\"](#duendeidentityservermodelsidentityprovidername)\n\nThe `IdentityProviderName` models the display name of an identity provider.\n\n* **`Enabled`**\n\n Specifies if provider is enabled. Defaults to `true`.\n\n* **`Scheme`**\n\n Scheme name for the provider.\n\n* **`DisplayName`**\n\n Display name for the provider.\n\n#### Duende.IdentityServer.Models.IdentityProvider\n\n[Section titled \"Duende.IdentityServer.Models.IdentityProvider\"](#duendeidentityservermodelsidentityprovider)\n\nThe `IdentityProvider` is a base class to model arbitrary identity providers, which `OidcProvider` derives from. This leaves open the possibility for extensions to the dynamic provider feature to support other protocol types (as distinguished by the `Type` property).\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2850,"content_sha256":"702cf4c9e4bbf2718918cd719fc9e0123cfba4fb70eed2e792bd88716bf5658b"},{"filename":"canonical/duendesoftware-com/identityserver/identityserver-admin-ui.md","content":"---\ntitle: IdentityServer Admin UI\nsource_url: https://docs.duendesoftware.com/identityserver/identityserver-admin-ui/\nsource_type: llms-full-txt\ncontent_hash: sha256:fdce550237963fcd8ef8d478d980b18bef1764872e6ad92e01d08f653962b26f\ncategory: identityserver\ndoc_id: identityserver/identityserver-admin-ui\n---\n\n> Documentation for implementing an administrative UI for IdentityServer.\n\nDuende IdentityServer is an OAuth 2.0 and OpenID Connect protocol engine and framework, and does not include any UI beyond what is available in the [project templates](/identityserver/overview/packaging/#templates). These contain UI for the login and consent pages, among others, but do not currently include an administrative UI as part of the product.\n\nIn this section, we will cover a couple of approaches to configure and administer Duende IdentityServer.\n\n## In-Memory vs. Database Configuration\n\n[Section titled \"In-Memory vs. Database Configuration\"](#in-memory-vs-database-configuration)\n\n[Configuration data](/identityserver/data/configuration/) in Duende IdentityServer is stored in a configuration store.\n\nIdentityServer supports in-memory configuration, where clients, resources, scopes, and other configuration options are stored in memory. This approach is valuable, as configuration can be maintained and linked from a specific commit in source control, and deployed as a single unit with IdentityServer.\n\nThe downside of this approach is that to change configuration, the application will have to be restarted or redeployed. To allow for dynamic configuration changes, you can [store configuration in a database](/identityserver/data/ef/).\n\n## Build Your Own Admin UI\n\n[Section titled \"Build Your Own Admin UI\"](#build-your-own-admin-ui)\n\nWhen using a database-backed configuration store, you can use one of several [general-purpose solutions](#third-party-identityserver-admin-ui). It is worth considering building your own solution, though.\n\nA configuration and administration UI allows you to configure your production system manually. You may want to consider reducing the number of available options in this UI, to prevent accidental configuration errors. For example, you may want to limit the options to only those that are relevant to your production environment, and not support editing all the various protocol, client, and resource options. A limited subset of the available options may be enough.\n\nDuende IdentityServer AdminUI Templates\n\nCreating custom, specialized admin UI functionality is demonstrated in the [Duende IdentityServer (`duende-is`) template](/identityserver/overview/packaging/#duende-identityserver).\n\nThe template is built on the Entity Framework Core template and includes an administrative UI for managing clients, scopes, and claims. There's also a diagnostics dashboard showing system information about your IdentityServer deployment.\n\nYou can use its UI as a starting point for creating your own admin UI.\n\n## Third-Party IdentityServer Admin UI\n\n[Section titled \"Third-Party IdentityServer Admin UI\"](#third-party-identityserver-admin-ui)\n\nA number of third-party projects and products have created IdentityServer Admin UIs. These are general-purpose and offer access to the Duende IdentityServer configuration data in a forms-over-data style.\n\n| Project | Description |\n| --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [Skoruba.Duende.IdentityServer.Admin](https://github.com/skoruba/Duende.IdentityServer.Admin) | ASP.NET Core Admin UI for Duende IdentityServer by Jan Škoruba |\n| [Aguafrommars TheIdServer](https://github.com/Aguafrommars/TheIdServer) | OpenID/Connect, OAuth2, WS-Federation and SAML 2.0 server based on Duende IdentityServer and ITFoxtec Identity SAML 2.0 with its admin UI by Olivier Lefebvre |\n| [RockSolidKnowledge AdminUI](https://www.identityserver.com/products/adminui) | UI and APIs for managing your Duende IdentityServer |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4575,"content_sha256":"cd9c085e2deab7db42430004aa2ddcac3ca2555e282b485c2d700d9919acfd57"},{"filename":"canonical/duendesoftware-com/identityserver/identityserver-interaction-service.md","content":"---\ntitle: IdentityServer Interaction Service\nsource_url: https://docs.duendesoftware.com/identityserver/identityserver-interaction-service/\nsource_type: llms-full-txt\ncontent_hash: sha256:f25537c542fb9e15c04578166bfe383c3ce38fbe5011d185925379df82765714\ncategory: identityserver\ndoc_id: identityserver/identityserver-interaction-service\n---\n\n> Documentation for the IIdentityServerInteractionService interface which provides services for user interfaces to communicate with IdentityServer for authorization, consent, logout, and other user interactions.\n\n#### Duende.IdentityServer.Services.IIdentityServerInteractionService\n\n[Section titled \"Duende.IdentityServer.Services.IIdentityServerInteractionService\"](#duendeidentityserverservicesiidentityserverinteractionservice)\n\nThe `IIdentityServerInteractionService` interface is intended to provide services to be used by the user interface to communicate with IdentityServer, mainly pertaining to user interaction. It is available from the dependency injection system and would normally be injected as a constructor parameter into your MVC controllers for the user interface of IdentityServer.\n\n## IIdentityServerInteractionService APIs\n\n[Section titled \"IIdentityServerInteractionService APIs\"](#iidentityserverinteractionservice-apis)\n\n* **`GetAuthorizationContextAsync`**\n\n Returns the `AuthorizationRequest` based on the `returnUrl` passed to the login or consent pages.\n\n* **`IsValidReturnUrl`**\n\n Indicates if the `returnUrl` is a valid URL for redirect after login or consent.\n\n* **`GetErrorContextAsync`**\n\n Returns the `ErrorMessage` based on the `errorId` passed to the error page.\n\n* **`GetLogoutContextAsync`**\n\n Returns the `LogoutRequest` based on the `logoutId` passed to the logout page.\n\n* **`CreateLogoutContextAsync`**\n\n Used to create a `logoutId` if there is not one presently. This creates a cookie capturing all the current state needed for signout and the `logoutId` identifies that cookie. This is typically used when there is no current `logoutId` and the logout page must capture the current user's state needed for sign-out prior to redirecting to an external identity provider for signout. The newly created `logoutId` would need to be roundtripped to the external identity provider at signout time, and then used on the signout callback page in the same way it would be on the normal logout page.\n\n* **`GrantConsentAsync`**\n\n Accepts a `ConsentResponse` to inform IdentityServer of the user's consent to a particular `AuthorizationRequest`.\n\n* **`DenyAuthorizationAsync`**\n\n Accepts a `AuthorizationError` to inform IdentityServer of the error to return to the client for a particular `AuthorizationRequest`.\n\n* **`GetAllUserGrantsAsync`**\n\n Returns a collection of `Grant` for the user. These represent a user's consent or a clients access to a user's resource.\n\n* **`RevokeUserConsentAsync`**\n\n Revokes all of a user's consents and grants for a client.\n\n* **`RevokeTokensForCurrentSessionAsync`**\n\n Revokes all of a user's consents and grants for clients the user has signed in to during their current session.\n\n## Returned models\n\n[Section titled \"Returned models\"](#returned-models)\n\nThe above methods return various models.\n\n### AuthorizationRequest\n\n[Section titled \"AuthorizationRequest\"](#authorizationrequest)\n\n* **`Client`**\n\n The client that initiated the request.\n\n* **`RedirectUri`**\n\n The URI to redirect the user to after successful authorization.\n\n* **`DisplayMode`**\n\n The display mode passed from the authorization request.\n\n* **`UiLocales`**\n\n The UI locales passed from the authorization request.\n\n* **`IdP`** The external identity provider requested. This is used to bypass home realm discovery (HRD). This is provided via the \"idp:\" prefix to the `acr_values` parameter on the authorize request.\n\n* **`Tenant`**\n\n The tenant requested. This is provided via the \"tenant:\" prefix to the `acr_values` parameter on the authorize request.\n\n* **`LoginHint`**\n\n The expected username the user will use to login. This is requested from the client via the `login_hint` parameter on the authorize request.\n\n* **`PromptMode`**\n\n The prompt mode requested from the authorization request.\n\n* **`AcrValues`**\n\n The acr values passed from the authorization request.\n\n* **`ValidatedResources`**\n\n The `ResourceValidationResult` which represents the validated resources from the authorization request.\n\n* **`Parameters`**\n\n The entire parameter collection passed to the authorization request.\n\n* **`RequestObjectValues`**\n\n The validated contents of the request object (if present).\n\n### ResourceValidationResult\n\n[Section titled \"ResourceValidationResult\"](#resourcevalidationresult)\n\n* **`Resources`**\n\n The resources of the result.\n\n* **`ParsedScopes`**\n\n The parsed scopes represented by the result.\n\n* **`RawScopeValues`**\n\n The original (raw) scope values represented by the validated result.\n\n### ErrorMessage\n\n[Section titled \"ErrorMessage\"](#errormessage)\n\n* **`Error`**\n\n The error code.\n\n* **`ErrorDescription`**\n\n The error description.\n\n* **`DisplayMode`**\n\n The display mode passed from the authorization request.\n\n* **`UiLocales`**\n\n The UI locales passed from the authorization request.\n\n* **`RequestId`**\n\n The per-request identifier. This can be used to display to the end user and can be used in diagnostics.\n\n* **`ClientId`**\n\n The client id making the request (if available).\n\n* **`RedirectUri`**\n\n The redirect URI back to the client (if available).\n\n### LogoutRequest\n\n[Section titled \"LogoutRequest\"](#logoutrequest)\n\n* **`ClientId`**\n\n The client identifier that initiated the request.\n\n* **`PostLogoutRedirectUri`**\n\n The URL to redirect the user to after they have logged out.\n\n* **`SessionId`**\n\n The user's current session id.\n\n* **`SignOutIFrameUrl`**\n\n The URL to render in an `\u003ciframe>` on the logged out page to enable single sign-out.\n\n* **`Parameters`**\n\n The entire parameter collection passed to the end session endpoint.\n\n* **`ShowSignoutPrompt`**\n\n Indicates if the user should be prompted to signout based upon the parameters passed to the end session endpoint.\n\n### ConsentResponse\n\n[Section titled \"ConsentResponse\"](#consentresponse)\n\n* **`ScopesValuesConsented`**\n\n The collection of scopes the user consented to.\n\n* **`RememberConsent`**\n\n Flag indicating if the user's consent is to be persisted.\n\n* **`Description`**\n\n Optional description the user can set for the grant (e.g. the name of the device being used when consent is given). This can be presented back to the user from the [persisted grant service](/identityserver/reference/services/persisted-grant-service/).\n\n* **`Error`**\n\n Error, if any, for the consent response. This will be returned to the client in the authorization response.\n\n* **`ErrorDescription`**\n\n Error description. This will be returned to the client in the authorization response.\n\n### Grant\n\n[Section titled \"Grant\"](#grant)\n\n* **`SubjectId`**\n\n The subject id that allowed the grant.\n\n* **`ClientId`**\n\n The client identifier for the grant.\n\n* **`Description`**\n\n The description the user assigned to the client or device being authorized.\n\n* **`Scopes`**\n\n The collection of scopes granted.\n\n* **`CreationTime`**\n\n The date and time when the grant was granted.\n\n* **`Expiration`**\n\n The date and time when the grant will expire.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":7341,"content_sha256":"764ae12bab651b90c4a7c901df61ed59bbf31c9be2d77a1ccc0cfea963b8d3d7"},{"filename":"canonical/duendesoftware-com/identityserver/identityserver-quickstarts.md","content":"---\ntitle: IdentityServer Quickstarts\nsource_url: https://docs.duendesoftware.com/identityserver/identityserver-quickstarts/\nsource_type: llms-full-txt\ncontent_hash: sha256:fc5ca8a3c836bd69e1c15275848d45c0c3855af7055a2552becec09425647ca9\ncategory: identityserver\ndoc_id: identityserver/identityserver-quickstarts\n---\n\n> Step-by-step tutorials for implementing common Duende IdentityServer scenarios, from basic setup to advanced features.\n\nThe quickstarts provide step-by-step instructions for various common Duende IdentityServer scenarios. They start with the absolute basics and become more complex - it is recommended you do them in order.\n\n* adding Duende IdentityServer to an ASP.NET Core application\n* configuring Duende IdentityServer\n* issuing tokens for various clients\n* securing web applications and APIs\n* adding support for EntityFramework based configuration\n* adding support for ASP.NET Identity\n\nEvery quickstart has a reference solution - you can find the code in the [samples](https://github.com/DuendeSoftware/Samples/tree/main/IdentityServer/v7/Quickstarts) folder.\n\n## Preparation\n\n[Section titled \"Preparation\"](#preparation)\n\nThe first thing you should do is install our templates:\n\nTerminal\n\n```bash\ndotnet new install Duende.Templates\n```\n\nThey will be used as a starting point for the various tutorials.\n\nNote\n\nYou may have a previous version of Duende templates (`Duende.Templates`) installed on your machine. To uninstall the previous template package, and install the latest version, use the following command:\n\nTerminal\n\n```bash\ndotnet new uninstall Duende.Templates\ndotnet new install Duende.Templates\n```\n\n[YouTube video player](https://www.youtube.com/embed/cxYmODQHErM)\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1705,"content_sha256":"692c11442593e8d0063e85d3cae748c8f823564650b952026eb62a588f34dfc4"},{"filename":"canonical/duendesoftware-com/identityserver/identityserver4-to-duende-identityserver-migration-analysis-tool.md","content":"---\ntitle: IdentityServer4 to Duende IdentityServer - Migration Analysis Tool\nsource_url: https://docs.duendesoftware.com/identityserver/identityserver4-to-duende-identityserver-migration-analysis-tool/\nsource_type: llms-full-txt\ncontent_hash: sha256:501acd2e736233ade9204f762f76575de8a0f0c47908f666e387213c763463ea\ncategory: identityserver\ndoc_id: identityserver/identityserver4-to-duende-identityserver-migration-analysis-tool\n---\n\nTo help assist in planning the [migration of an IdentityServer4 implementation to Duende IdentityServer](/identityserver/upgrades/identityserver4-to-duende-identityserver-v7/), we provide a utility that [analyzes the current configuration of your current IdentityServer4](https://raw.githubusercontent.com/DuendeSoftware/docs.duendesoftware.com/refs/heads/main/astro/src/content/docs/identityserver/upgrades/code/MigrationAnalysisController.cs). It inspects the running instance to provide specific recommendations and highlights potential compatibility issues during the upgrade and migration process.\n\nNote that the data provided is informative and should not be considered a complete migration plan.\n\nNote\n\nWe also offer a [free IdentityServer4 upgrade assessment](https://duendesoftware.com/upgrade-identityserver4) to walk you through your upgrade path.\n\n## Installation\n\n[Section titled \"Installation\"](#installation)\n\nThis Migration Analysis tool is provided as a single file, [`MigrationAnalysisController.cs`](https://raw.githubusercontent.com/DuendeSoftware/docs.duendesoftware.com/refs/heads/main/astro/src/content/docs/identityserver/upgrades/code/MigrationAnalysisController.cs), which can be [downloaded](https://raw.githubusercontent.com/DuendeSoftware/docs.duendesoftware.com/refs/heads/main/astro/src/content/docs/identityserver/upgrades/code/MigrationAnalysisController.cs) and added directly to any existing IdentityServer4 project. It does not require a separate library or complex installation process.\n\nThe tool's code was deliberately kept rudimentary and compatible with earlier C# versions to ensure maximum compatibility with older projects.\n\nThe controller is designed to inspect client configurations from:\n\n1. **In-Memory Clients**\n2. **Entity Framework Core** (standard `IdentityServer4.EntityFramework` stores)\n\nIf your implementation uses a custom store for client configuration, you will need to modify the controller code (specifically in the constructor) to manually wire up the retrieval of your client data so it can be included in the analysis.\n\nSecurity warning\n\nTo make use of the tool, you must update the authorization logic in the `Index()` method. Authorization is in place to ensure that only a user with the necessary claims can access the report for your environment. This is extremely important when deploying the migration analysis tool to your production environment.\n\nThe default implementation contains a placeholder check that verifies if your username is `\"scott\"`:\n\nMigrationAnalysisController.cs\n\n```csharp\n// Verify user is allowed to access this page\nif (User.Identity == null || User.Identity.Name != \"scott\")\n{\n return Unauthorized();\n}\n```\n\nYou must replace this with checks for specific user characteristics (e.g., role, claim, or username) to ensure that only authorized users can access this sensitive information.\n\n## Usage\n\n[Section titled \"Usage\"](#usage)\n\nTo use the tool:\n\n1. Ensure the IdentityServer4 host is running.\n2. Navigate to the `/MigrationAnalysis` endpoint of your IdentityServer4 host in your browser (e.g., `https://localhost:5001/MigrationAnalysis`).\n3. Ensure you are logged in with a user that meets the security criteria defined in the `Index()` method.\n\n## Analysis Report\n\n[Section titled \"Analysis Report\"](#analysis-report)\n\nThe Analysis page provides a table with the following data points and recommendations:\n\n* **.NET Version:** Checks the runtime version and recommends upgrading to the latest LTS if needed.\n\n* **IdentityServer4 Version:** Verifies the current version. Migration to Duende IdentityServer typically requires being on IdentityServer4 v4.x first.\n\n* **Clients:** Provides information about interactive and non-interactive clients. This information is important for [determining the appropriate license edition for Duende IdentityServer](https://duendesoftware.com/products/identityserver/).\n\n* **Issuer URI:** Reports the current issuer URI, if configured.\n\n* **Signing Credential Store:** Identifies the type of store used for signing credentials and checks for compatibility.\n\n* **Signing Key:** Displays the current Key ID and links to documentation on migrating signing keys.\n\n* **Data Protection:**\n\n * **Application Name:** Checks if the Application Discriminator is set, which is crucial for key isolation.\n * **Repository Type:** Verifies where keys are stored (e.g., XML repository) to ensure they are persisted correctly in production.\n\n* **Authentication Schemes:** Lists all registered authentication handlers and highlights those that might not be compatible with newer ASP.NET Core versions.\n\n![IdentityServer4 to Duende IdentityServer migration analysis](/_astro/migration-analysis.C1NNOK0S_Z2a28K5.webp)\n\nWith this information, you can [start your IdentityServer4 to Duende IdentityServer migration](/identityserver/upgrades/identityserver4-to-duende-identityserver-v7/) more informed.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5352,"content_sha256":"e5f670618e3fb15f1738709bafe0cd5090fde305b55e6102b458a3f929852bed"},{"filename":"config/__init__.py","content":"\"\"\"Configuration package for duende-docs skill.\"\"\"\n\nfrom .config_registry import (\n ConfigRegistry,\n get_registry,\n get_default,\n load_sources,\n load_filtering,\n load_tag_detection,\n load_defaults,\n reload_configs,\n)\n\n__all__ = [\n 'ConfigRegistry',\n 'get_registry',\n 'get_default',\n 'load_sources',\n 'load_filtering',\n 'load_tag_detection',\n 'load_defaults',\n 'reload_configs',\n]\n","content_type":"text/x-python; charset=utf-8","language":"python","size":428,"content_sha256":"6b8b58f4b0c21d05e20f5f7b3e05d9de31aec2e361d7ad918a5b78b044a4d73b"},{"filename":"scripts/__init__.py","content":"\"\"\"Scripts package for duende-docs skill.\"\"\"\n","content_type":"text/x-python; charset=utf-8","language":"python","size":45,"content_sha256":"f75f5bd3bb686537064f8bd5769382bbdba1386bb80fcd1ffb2a21100298395c"},{"filename":"scripts/maintenance/__init__.py","content":"# Maintenance scripts for duende-docs skill\n","content_type":"text/x-python; charset=utf-8","language":"python","size":44,"content_sha256":"c0ac43262315f516d742347eebdae7ecbaae7a964467900f47fcc5bd9be64885"},{"filename":"tests/__init__.py","content":"# Tests for duende-docs skill\n","content_type":"text/x-python; charset=utf-8","language":"python","size":30,"content_sha256":"aff313bfe81fcb3fea575ef6f6800c820b5b5037796a934f5aae0dd7aa85b6a4"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Duende Documentation Skill","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"CRITICAL: Path Doubling Prevention - MANDATORY","type":"text"}]},{"type":"paragraph","content":[{"text":"ABSOLUTE PROHIBITION: NEVER use ","type":"text","marks":[{"type":"strong"}]},{"text":"cd","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" with ","type":"text","marks":[{"type":"strong"}]},{"text":"&&","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in PowerShell when running scripts from this skill.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"The Problem:","type":"text","marks":[{"type":"strong"}]},{"text":" If your current working directory is already inside the skill directory, using relative paths causes PowerShell to resolve paths relative to the current directory instead of the repository root, resulting in path doubling.","type":"text"}]},{"type":"paragraph","content":[{"text":"REQUIRED Solutions (choose one):","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ALWAYS use absolute paths","type":"text","marks":[{"type":"strong"}]},{"text":" (recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use separate commands","type":"text","marks":[{"type":"strong"}]},{"text":" (never ","type":"text"},{"text":"cd","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"&&","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run from repository root","type":"text","marks":[{"type":"strong"}]},{"text":" with relative paths","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"NEVER DO THIS:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Chain ","type":"text"},{"text":"cd","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"&&","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"cd \u003crelative-path> && python \u003cscript>","type":"text","marks":[{"type":"code_inline"}]},{"text":" causes path doubling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Assume current directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use relative paths when current dir is inside skill directory","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"CRITICAL: Large File Handling - MANDATORY SCRIPT USAGE","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ABSOLUTE PROHIBITION: NEVER use read_file tool on the index.yaml file","type":"text"}]},{"type":"paragraph","content":[{"text":"The file exceeds context limits and will cause issues. You MUST use scripts.","type":"text"}]},{"type":"paragraph","content":[{"text":"REQUIRED: ALWAYS use manage_index.py scripts for ANY index.yaml access:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/management/manage_index.py count\npython scripts/management/manage_index.py list\npython scripts/management/manage_index.py get \u003cdoc_id>\npython scripts/management/manage_index.py verify","type":"text"}]},{"type":"paragraph","content":[{"text":"All scripts automatically handle large files via ","type":"text"},{"text":"index_manager.py","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Available Slash Commands","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the consolidated ","type":"text"},{"text":"docs-ops","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill for common workflows:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"/duende-ecosystem:docs-ops scrape","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Scrape Duende documentation from llms-full.txt","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"/duende-ecosystem:docs-ops refresh","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Refresh the local index and metadata without scraping","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"/duende-ecosystem:docs-ops validate","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Validate the index and references for consistency","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"/duende-ecosystem:docs-ops rebuild-index","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Force rebuild the search index","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"/duende-ecosystem:docs-ops clear-cache","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Clear the documentation search cache","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill provides automation tooling for Duende Software documentation management. It manages:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Canonical storage","type":"text","marks":[{"type":"strong"}]},{"text":" (encapsulated in skill) - Single source of truth for official docs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subsection extraction","type":"text","marks":[{"type":"strong"}]},{"text":" - Token-optimized extracts (60-90% savings)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Drift detection","type":"text","marks":[{"type":"strong"}]},{"text":" - Hash-based validation against upstream sources","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sync workflows","type":"text","marks":[{"type":"strong"}]},{"text":" - Maintenance automation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Documentation discovery","type":"text","marks":[{"type":"strong"}]},{"text":" - Keyword-based search and doc_id resolution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Index management","type":"text","marks":[{"type":"strong"}]},{"text":" - Metadata, keywords, tags, aliases for resilient references","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Core value:","type":"text","marks":[{"type":"strong"}]},{"text":" Prevents link rot, enables offline access, optimizes token costs, automates maintenance, and provides resilient doc_id-based references.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use This Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill should be used when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scraping documentation","type":"text","marks":[{"type":"strong"}]},{"text":" - Fetching docs from Duende llms-full.txt","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Finding documentation","type":"text","marks":[{"type":"strong"}]},{"text":" - Searching for docs by keywords, category, or natural language","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Resolving doc references","type":"text","marks":[{"type":"strong"}]},{"text":" - Converting doc_id to file paths","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Managing index metadata","type":"text","marks":[{"type":"strong"}]},{"text":" - Adding keywords, tags, aliases, updating metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rebuilding index","type":"text","marks":[{"type":"strong"}]},{"text":" - Regenerating index from filesystem (handles renames/moves)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow Execution Pattern","type":"text"}]},{"type":"paragraph","content":[{"text":"CRITICAL: This section defines HOW to execute operations in this skill.","type":"text","marks":[{"type":"strong"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Delegation Strategy","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Default approach: Delegate to Task agent","type":"text"}]},{"type":"paragraph","content":[{"text":"For ALL scraping, validation, and index operations, delegate execution to a general-purpose Task agent.","type":"text"}]},{"type":"paragraph","content":[{"text":"How to invoke:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Use the Task tool with:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"subagent_type","type":"text","marks":[{"type":"code_inline"}]},{"text":": \"general-purpose\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"description","type":"text","marks":[{"type":"code_inline"}]},{"text":": Short 3-5 word description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"prompt","type":"text","marks":[{"type":"code_inline"}]},{"text":": Full task description with execution instructions","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Execution Pattern","type":"text"}]},{"type":"paragraph","content":[{"text":"Scripts run in FOREGROUND by default. Do NOT background them.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"When Task agents execute scripts:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run directly","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"python plugins/duende-ecosystem/skills/duende-docs/scripts/core/scrape_docs.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Streaming logs","type":"text","marks":[{"type":"strong"}]},{"text":": Scripts emit progress naturally via stdout","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wait for completion","type":"text","marks":[{"type":"strong"}]},{"text":": Scripts exit when done with exit code","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER use ","type":"text","marks":[{"type":"strong"}]},{"text":"run_in_background=true","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":": Scripts are designed for foreground execution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER poll output","type":"text","marks":[{"type":"strong"}]},{"text":": Streaming logs appear automatically, no BashOutput polling needed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"NEVER use background jobs","type":"text","marks":[{"type":"strong"}]},{"text":": No ","type":"text"},{"text":"&","type":"text","marks":[{"type":"code_inline"}]},{"text":", no ","type":"text"},{"text":"nohup","type":"text","marks":[{"type":"code_inline"}]},{"text":", no background process management","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Error and Warning Reporting","type":"text"}]},{"type":"paragraph","content":[{"text":"CRITICAL: Report ALL errors, warnings, and issues - never suppress or ignore them.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"When executing scripts via Task agents:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report script errors","type":"text","marks":[{"type":"strong"}]},{"text":": Exit codes, exceptions, error messages","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report warnings","type":"text","marks":[{"type":"strong"}]},{"text":": Deprecation warnings, import issues, configuration problems","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report unexpected output","type":"text","marks":[{"type":"strong"}]},{"text":": 404s, timeouts, validation failures","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include context","type":"text","marks":[{"type":"strong"}]},{"text":": What was being executed when the error occurred","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Start","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Refresh Index End-to-End (No Scraping)","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this when you want to rebuild and validate the local index/metadata ","type":"text"},{"text":"without scraping","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python plugins/duende-ecosystem/skills/duende-docs/scripts/management/refresh_index.py","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scrape All Documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this when the user explicitly wants to ","type":"text"},{"text":"hit the network and scrape docs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Scrape from llms-full.txt (all products in one file)\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/scrape_docs.py\n\n# Refresh index after scraping\npython plugins/duende-ecosystem/skills/duende-docs/scripts/management/refresh_index.py","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Find Documentation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Resolve doc_id to file path\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/find_docs.py resolve \u003cdoc_id>\n\n# Search by keywords (default: 25 results)\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/find_docs.py search oauth dpop\n\n# Natural language search\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/find_docs.py query \"how to configure DPoP\"\n\n# List by category\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/find_docs.py category identityserver\n\n# List by tag\npython plugins/duende-ecosystem/skills/duende-docs/scripts/core/find_docs.py tag bff","type":"text"}]},{"type":"paragraph","content":[{"text":"Search Options:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Option","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--limit N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"25","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Maximum number of results to return","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--no-limit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Return all matching results (no limit)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--min-score N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Only return results with relevance score >= N","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--fast","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Index-only search (skip content grep)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output results as JSON","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--verbose","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Show relevance scores","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Configuration System","type":"text"}]},{"type":"paragraph","content":[{"text":"The duende-docs skill uses a unified configuration system.","type":"text"}]},{"type":"paragraph","content":[{"text":"Configuration Files:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"config/defaults.yaml","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Central configuration file with all default values","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"config/filtering.yaml","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Content filtering rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"config/tag_detection.yaml","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Tag detection patterns","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Environment Variable Overrides:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"All configuration values can be overridden using environment variables: ","type":"text"},{"text":"DUENDE_DOCS_\u003cSECTION>_\u003cKEY>","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Dependencies","type":"text"}]},{"type":"paragraph","content":[{"text":"Required:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"pyyaml","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"requests","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"filelock","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"Optional (recommended):","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"yake","type":"text","marks":[{"type":"code_inline"}]},{"text":" (for keyword extraction)","type":"text"}]},{"type":"paragraph","content":[{"text":"Python Version:","type":"text","marks":[{"type":"strong"}]},{"text":" Python 3.11+ recommended","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Core Capabilities","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Scraping Documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"Fetch documentation from Duende llms-full.txt (pre-rendered markdown for all products).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Extracting Subsections","type":"text"}]},{"type":"paragraph","content":[{"text":"Extract specific markdown sections for token-optimized responses.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Change Detection","type":"text"}]},{"type":"paragraph","content":[{"text":"Detect documentation drift via 404 checking and hash comparison.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Finding and Resolving Documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"Discover and resolve documentation references using doc_id, keywords, or natural language queries.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. Index Management and Maintenance","type":"text"}]},{"type":"paragraph","content":[{"text":"Maintain index metadata, keywords, tags, and rebuild index from filesystem.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Platform-Specific Requirements","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Windows Users","type":"text"}]},{"type":"paragraph","content":[{"text":"MUST use PowerShell (recommended) or prefix Git Bash commands with ","type":"text","marks":[{"type":"strong"}]},{"text":"MSYS_NO_PATHCONV=1","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Git Bash on Windows converts Unix paths to Windows paths, breaking filter patterns.","type":"text"}]},{"type":"paragraph","content":[{"text":"Example:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"MSYS_NO_PATHCONV=1 python scripts/core/scrape_docs.py --filter \"/identityserver/\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Troubleshooting","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Unicode Encoding Errors","type":"text"}]},{"type":"paragraph","content":[{"text":"Status:","type":"text","marks":[{"type":"strong"}]},{"text":" FIXED - Scripts auto-detect Windows and configure UTF-8 encoding.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"404 Errors During Scraping","type":"text"}]},{"type":"paragraph","content":[{"text":"Status:","type":"text","marks":[{"type":"strong"}]},{"text":" EXPECTED - Some entries may reference docs that don't exist yet. Scripts handle gracefully and continue.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Public API","type":"text"}]},{"type":"paragraph","content":[{"text":"The duende-docs skill provides a clean public API for external tools:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from duende_docs_api import (\n find_document,\n resolve_doc_id,\n get_docs_by_tag,\n get_docs_by_category,\n search_by_keywords,\n get_document_section,\n refresh_index\n)\n\n# Natural language search\ndocs = find_document(\"DPoP token binding\")\n\n# Resolve doc_id to metadata\ndoc = resolve_doc_id(\"duende-identityserver-dpop\")\n\n# Get docs by tag\nbff_docs = get_docs_by_tag(\"bff\")\n\n# Extract specific section\nsection = get_document_section(\"duende-identityserver-overview\", \"Installation\")","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Development Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"When developing this plugin locally, you may want changes to go to your dev repo instead of the installed plugin location.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Enabling Dev Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"PowerShell:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"powershell"},"content":[{"text":"$env:DUENDE_DOCS_DEV_ROOT = \"D:\\repos\\gh\\melodic\\claude-code-plugins\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Bash/Zsh:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export DUENDE_DOCS_DEV_ROOT=\"/path/to/claude-code-plugins\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Verifying Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"When you run any major script (scrape, refresh, rebuild), a mode banner will display:","type":"text"}]},{"type":"paragraph","content":[{"text":"Dev mode:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"[DEV MODE] Using local plugin: D:\\repos\\gh\\melodic\\claude-code-plugins","type":"text"}]},{"type":"paragraph","content":[{"text":"Prod mode:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"[PROD MODE] Using installed skill directory","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Disabling Dev Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"PowerShell:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"powershell"},"content":[{"text":"Remove-Item Env:DUENDE_DOCS_DEV_ROOT","type":"text"}]},{"type":"paragraph","content":[{"text":"Bash/Zsh:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"unset DUENDE_DOCS_DEV_ROOT","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Directory Structure","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"duende-docs/\n SKILL.md # This file (public)\n duende_docs_api.py # Public API\n canonical/ # Documentation storage (private)\n index.yaml # Metadata index\n duendesoftware-com/ # Domain-based storage\n identityserver/ # IdentityServer docs\n bff/ # BFF docs\n accesstokenmanagement/ # Access Token Management docs\n identitymodel/ # IdentityModel docs\n identitymodel-oidcclient/ # OidcClient docs\n general/ # General information docs\n scripts/ # Implementation (private)\n core/ # Scraping, discovery\n management/ # Index management\n maintenance/ # Cleanup, drift detection\n utils/ # Shared utilities\n config/ # Configuration\n defaults.yaml # Default settings\n filtering.yaml # Content filtering\n tag_detection.yaml # Tag patterns\n references/ # Technical documentation (public)\n sources.json # Documentation sources\n .cache/ # Cache storage (inverted index)\n logs/ # Log files","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Source","type":"text"}]},{"type":"paragraph","content":[{"text":"Documentation is scraped from Duende's llms-full.txt at ","type":"text"},{"text":"https://docs.duendesoftware.com/llms-full.txt","type":"text","marks":[{"type":"link","attrs":{"href":"https://docs.duendesoftware.com/llms-full.txt","title":null}}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Documentation Categories","type":"text"}]},{"type":"paragraph","content":[{"text":"Duende documentation is organized into the following categories:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Category","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"identityserver","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"IdentityServer OAuth 2.0/OIDC framework documentation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bff","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Backend-for-Frontend security framework","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"accesstokenmanagement","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Access token lifecycle management library","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"identitymodel","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Protocol operations library","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"identitymodel-oidcclient","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Native OIDC client library","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"general","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Licensing, support, glossary, shared concepts","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tags","type":"text"}]},{"type":"paragraph","content":[{"text":"Common tags used for Duende documentation:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"oauth","type":"text","marks":[{"type":"code_inline"}]},{"text":" - OAuth 2.0 protocol","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"oidc","type":"text","marks":[{"type":"code_inline"}]},{"text":" - OpenID Connect protocol","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"openid-connect","type":"text","marks":[{"type":"code_inline"}]},{"text":" - OpenID Connect (alias)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"tokens","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Token handling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"access-token","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Access token management","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"refresh-token","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Refresh token handling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"bff","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Backend-for-Frontend pattern","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"spa","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Single-page application security","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"blazor","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Blazor integration","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"aspnetcore","type":"text","marks":[{"type":"code_inline"}]},{"text":" - ASP.NET Core integration","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"dotnet","type":"text","marks":[{"type":"code_inline"}]},{"text":" - .NET framework","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"authentication","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Authentication flows","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"authorization","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Authorization policies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"dpop","type":"text","marks":[{"type":"code_inline"}]},{"text":" - DPoP token binding","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"mtls","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Mutual TLS authentication","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"client-credentials","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Client credentials flow","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"quickstart","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Getting started guides","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sample-code","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Code samples and examples","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Test Scenarios","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scenario 1: Keyword Search","type":"text"}]},{"type":"paragraph","content":[{"text":"Query","type":"text","marks":[{"type":"strong"}]},{"text":": \"Search for DPoP documentation\" ","type":"text"},{"text":"Expected Behavior","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skill activates on keyword \"DPoP\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Returns relevant docs from index ","type":"text"},{"text":"Success Criteria","type":"text","marks":[{"type":"strong"}]},{"text":": User receives matching documentation entries","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scenario 2: Natural Language Query","type":"text"}]},{"type":"paragraph","content":[{"text":"Query","type":"text","marks":[{"type":"strong"}]},{"text":": \"How do I configure IdentityServer for Blazor?\" ","type":"text"},{"text":"Expected Behavior","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skill activates on \"IdentityServer\" and \"Blazor\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Uses find_docs.py query command ","type":"text"},{"text":"Success Criteria","type":"text","marks":[{"type":"strong"}]},{"text":": Returns relevant documentation with configuration steps","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scenario 3: Doc ID Resolution","type":"text"}]},{"type":"paragraph","content":[{"text":"Query","type":"text","marks":[{"type":"strong"}]},{"text":": \"Resolve duende-identityserver-quickstart\" ","type":"text"},{"text":"Expected Behavior","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Resolves doc_id to file path","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Returns document metadata ","type":"text"},{"text":"Success Criteria","type":"text","marks":[{"type":"strong"}]},{"text":": User receives full path and document content","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Version History","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"v1.0.0 (2025-12-16): Initial release - full skill structure","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Last Updated","type":"text"}]},{"type":"paragraph","content":[{"text":"Date:","type":"text","marks":[{"type":"strong"}]},{"text":" 2025-12-16 ","type":"text"},{"text":"Model:","type":"text","marks":[{"type":"strong"}]},{"text":" claude-opus-4-5-20251101","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Status:","type":"text","marks":[{"type":"strong"}]},{"text":" Initial release - ready for scraping from ","type":"text"},{"text":"https://docs.duendesoftware.com/llms-full.txt","type":"text","marks":[{"type":"link","attrs":{"href":"https://docs.duendesoftware.com/llms-full.txt","title":null}}]},{"text":".","type":"text"}]}]},"metadata":{"date":"2026-06-05","name":"duende-docs","author":"@skillopedia","source":{"stars":76,"repo_name":"claude-code-plugins","origin_url":"https://github.com/melodic-software/claude-code-plugins/blob/HEAD/plugins/duende-ecosystem/skills/duende-docs/SKILL.md","repo_owner":"melodic-software","body_sha256":"f8de63c80e4005eee07e220bd6e8bd659923b83105f7e260a73ea7ec8561f4cd","cluster_key":"2deaa9badd43d8a882736353bb98c9c57fffbbcef37edce8e2b332ee132c4edb","clean_bundle":{"format":"clean-skill-bundle-v1","source":"melodic-software/claude-code-plugins/plugins/duende-ecosystem/skills/duende-docs/SKILL.md","attachments":[{"id":"25ef79e7-c6bf-5775-8f8c-a9d7dc769b38","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/25ef79e7-c6bf-5775-8f8c-a9d7dc769b38/attachment.md","path":"canonical/duendesoftware-com/accepting-local-credentials.md","size":3357,"sha256":"d0d82627709c1257a6f2dd3aae730d7fc73899b7bcf592168afc3399c9d16a47","contentType":"text/markdown; charset=utf-8"},{"id":"94305ef8-760b-5da8-aa80-0eeb7c971064","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/94305ef8-760b-5da8-aa80-0eeb7c971064/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/access-token-management.md","size":2497,"sha256":"b14fbfb11a3af3cc60ef24a4cad530dcdc95a8156e4242e65d002413b4a0a138","contentType":"text/markdown; charset=utf-8"},{"id":"beba907c-d326-5f6b-9982-09ddc153f73d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/beba907c-d326-5f6b-9982-09ddc153f73d/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/advanced/client-assertions.md","size":5316,"sha256":"c1e2af206aac48c963941ee0d43e2ae44bee07ec4bb291f8509ee8a96f8d642b","contentType":"text/markdown; charset=utf-8"},{"id":"02310365-37b7-5d5f-b216-f7b13615ef25","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/02310365-37b7-5d5f-b216-f7b13615ef25/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/advanced/extensibility.md","size":8987,"sha256":"b8b5d181f1a791cc1eab8176520b1c906c6a1e4ef48cf5495ca2782f7a3f11b9","contentType":"text/markdown; charset=utf-8"},{"id":"3357638e-ab43-52fe-aefc-b397b035007e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3357638e-ab43-52fe-aefc-b397b035007e/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/advanced/logging.md","size":1525,"sha256":"d6e369b1324cebdd0b030aab359e24705d7088abc40d891e949102bd457e56d0","contentType":"text/markdown; charset=utf-8"},{"id":"6691500b-fd0a-5d72-b0dc-bef15af9715c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6691500b-fd0a-5d72-b0dc-bef15af9715c/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/blazor-server-access-token-management.md","size":4933,"sha256":"3e849ad3efc323e2105a5a25e2f1d6307eded2c2f3e101482d3f875cff163e9c","contentType":"text/markdown; charset=utf-8"},{"id":"dbce13e5-235c-5d65-a1ab-3219c9509aab","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dbce13e5-235c-5d65-a1ab-3219c9509aab/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/customizing-client-credentials-token-management.md","size":12609,"sha256":"1ca407e5082fa2b978c99ffe23a8aaa7572e8369f8fdff0f7be0d19503b3490a","contentType":"text/markdown; charset=utf-8"},{"id":"ff5676c1-781a-5e90-b281-36d5441f2ce9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ff5676c1-781a-5e90-b281-36d5441f2ce9/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/customizing-user-token-management.md","size":4462,"sha256":"1d3ab22cc768fd52ef6dd8768c860ca7e2761462ffac5e454e7df1387b357227","contentType":"text/markdown; charset=utf-8"},{"id":"2463899f-64ae-5e05-a263-ac7c00bf71eb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2463899f-64ae-5e05-a263-ac7c00bf71eb/attachment.md","path":"canonical/duendesoftware-com/accesstokenmanagement/service-workers-and-background-tasks.md","size":11094,"sha256":"7cff5bd82d128eb8274ebee635889ac48285f829b7686e11977da89aebc99a32","contentType":"text/markdown; charset=utf-8"},{"id":"746f7dd7-ca1f-5685-b0c0-325ad6703712","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/746f7dd7-ca1f-5685-b0c0-325ad6703712/attachment.md","path":"canonical/duendesoftware-com/api-resource.md","size":2832,"sha256":"d5f60ba986f8695ec8dc59dce68d81dd06187e5ef3c952e5b0d8475aaf4b97f2","contentType":"text/markdown; charset=utf-8"},{"id":"e5736286-98c7-585c-81cf-5b952e129877","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e5736286-98c7-585c-81cf-5b952e129877/attachment.md","path":"canonical/duendesoftware-com/api-resources.md","size":5400,"sha256":"0bda23c314b42e861d9124606d3f59800cb7d87a1af70ef62258cd5cb4b17a67","contentType":"text/markdown; charset=utf-8"},{"id":"db230095-1a7e-5763-aa5a-091e58fbb8d9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/db230095-1a7e-5763-aa5a-091e58fbb8d9/attachment.md","path":"canonical/duendesoftware-com/api-scope.md","size":2018,"sha256":"2037291093ce6a4b7444f9038cfeca7bfa3a4d1dfa77e14a0209392c1da98adf","contentType":"text/markdown; charset=utf-8"},{"id":"969d0364-f511-5248-9087-17faf25a8fff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/969d0364-f511-5248-9087-17faf25a8fff/attachment.md","path":"canonical/duendesoftware-com/api-scopes.md","size":6904,"sha256":"5fc4f9fc81bcc4d791300e78763552e63e752548510b7bf3553c5ea8c4e209b8","contentType":"text/markdown; charset=utf-8"},{"id":"cf71f7cb-3d72-5c1f-a7a7-6f3626a179a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cf71f7cb-3d72-5c1f-a7a7-6f3626a179a4/attachment.md","path":"canonical/duendesoftware-com/architecture.md","size":6593,"sha256":"0b2c9ccff6057d48350a6e6e70794ee97527a76bf57759ae0d1cb5c218d61211","contentType":"text/markdown; charset=utf-8"},{"id":"421f9a78-e7b7-5d0c-b013-f169a900a36b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/421f9a78-e7b7-5d0c-b013-f169a900a36b/attachment.md","path":"canonical/duendesoftware-com/aspnet-core-authentication-system.md","size":9415,"sha256":"776c0fdbe2bc825e2eaa0317c3c0140d8e5c5d6c6241e2d21c3e94cef398e2d1","contentType":"text/markdown; charset=utf-8"},{"id":"ea903cbc-72e2-5779-a85c-074e47e8826c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ea903cbc-72e2-5779-a85c-074e47e8826c/attachment.md","path":"canonical/duendesoftware-com/aspnet-core-openid-connect-handler-events.md","size":10743,"sha256":"8e8d3883b87957353be0857eda882f9424e11c74662b9a3fdee6b00a67f61646","contentType":"text/markdown; charset=utf-8"},{"id":"137bb82d-bb21-57c2-8a9f-eb3ae29c0288","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/137bb82d-bb21-57c2-8a9f-eb3ae29c0288/attachment.md","path":"canonical/duendesoftware-com/aspnet-identity-integration.md","size":3804,"sha256":"bd4b198c2bd7f211f21b9aa42e76372441a0af73702a7480ca567a0f66833c19","contentType":"text/markdown; charset=utf-8"},{"id":"7294f331-d960-5af4-9c66-89aa9deb102c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7294f331-d960-5af4-9c66-89aa9deb102c/attachment.md","path":"canonical/duendesoftware-com/authentication-schemes-and-cookies.md","size":5173,"sha256":"38a866be3bedebb559d324e383ba89a88b0ba6ca13d17b451b87cd9b3bbe6491","contentType":"text/markdown; charset=utf-8"},{"id":"1d63ebc7-abe8-5f6c-9b5d-504b69803a38","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1d63ebc7-abe8-5f6c-9b5d-504b69803a38/attachment.md","path":"canonical/duendesoftware-com/authentication-session-management.md","size":757,"sha256":"f4adf127f72b6d28e6d0fbb8513e6b88ba0e90a254b6acdcf87c4e2737dd4c9a","contentType":"text/markdown; charset=utf-8"},{"id":"fdd796f1-d784-531a-b568-41aef156d52d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fdd796f1-d784-531a-b568-41aef156d52d/attachment.md","path":"canonical/duendesoftware-com/authentication-session.md","size":6623,"sha256":"371d53578f233b6e415342e9ee7711b8be9f97082d4420e4362b914c9a2c49e5","contentType":"text/markdown; charset=utf-8"},{"id":"8611b4e8-7631-5433-974b-ddfe6e145369","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8611b4e8-7631-5433-974b-ddfe6e145369/attachment.md","path":"canonical/duendesoftware-com/authorization-based-on-scopes-and-claims.md","size":4461,"sha256":"0a86bfb8141354ed1c5e453e750c9a5406194c66380604bba455f6a344afb415","contentType":"text/markdown; charset=utf-8"},{"id":"541a0916-02c3-59dc-a92e-4ccabdefdbff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/541a0916-02c3-59dc-a92e-4ccabdefdbff/attachment.md","path":"canonical/duendesoftware-com/authorize-endpoint.md","size":4112,"sha256":"7231cf6c5f5e061fddaab1b3aa29e894dc5ad031a73117c725d614f83c0a673d","contentType":"text/markdown; charset=utf-8"},{"id":"f3ccb7d5-d3a4-53f3-92b2-96dba41b8d9d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f3ccb7d5-d3a4-53f3-92b2-96dba41b8d9d/attachment.md","path":"canonical/duendesoftware-com/authorize-interaction-response-generator.md","size":2327,"sha256":"9970e8a7652c59f2e66e9cdc47db7d1d60a251f90bee2d4f89842ec81fd9295a","contentType":"text/markdown; charset=utf-8"},{"id":"c5322c47-ba8d-5d1e-bc58-6fe04197f875","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c5322c47-ba8d-5d1e-bc58-6fe04197f875/attachment.md","path":"canonical/duendesoftware-com/backchannel-authentication-interaction-service.md","size":2881,"sha256":"db0fd12f7bda328594fcad2ccca11ab12b221399385776d8783210ea6daccd17","contentType":"text/markdown; charset=utf-8"},{"id":"54df8412-94e4-5d3d-b2d3-18e8d43e5950","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/54df8412-94e4-5d3d-b2d3-18e8d43e5950/attachment.md","path":"canonical/duendesoftware-com/backchannel-authentication-user-notification-service.md","size":1408,"sha256":"4b192c658b342d0d84e774f7d6f0c39df73b44516969e9b1a25313744f72af3a","contentType":"text/markdown; charset=utf-8"},{"id":"50349a8e-f98e-5abb-bb67-aa56fbe36c65","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/50349a8e-f98e-5abb-bb67-aa56fbe36c65/attachment.md","path":"canonical/duendesoftware-com/backchannel-authentication-user-validator.md","size":2698,"sha256":"9e3e8a956afd0d65de2584288a7c175a7e1db7090c2298fb1775ddc1172d16a2","contentType":"text/markdown; charset=utf-8"},{"id":"ce0f1b9c-e280-584a-900b-bb49bc5a7994","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ce0f1b9c-e280-584a-900b-bb49bc5a7994/attachment.md","path":"canonical/duendesoftware-com/base64-url-encoding.md","size":2044,"sha256":"69cdacc2131f7d40c0d98f1d862cb897a9e6827f142c6bf13a68c472ab1ee87c","contentType":"text/markdown; charset=utf-8"},{"id":"61a93dba-2a54-586a-99d9-82fb91415762","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/61a93dba-2a54-586a-99d9-82fb91415762/attachment.md","path":"canonical/duendesoftware-com/basics.md","size":6962,"sha256":"80f45f8db2d03138afed556951269392e1719c977933486adcd20c7d2135fed0","contentType":"text/markdown; charset=utf-8"},{"id":"c3f11ab9-601c-5e51-a729-2aac9a92389c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c3f11ab9-601c-5e51-a729-2aac9a92389c/attachment.md","path":"canonical/duendesoftware-com/bff/architecture.md","size":6597,"sha256":"dc0f4c69c4044cb084df75ca53d5baf6edede1bf4c61cc2b31acbbddf26e6ac6","contentType":"text/markdown; charset=utf-8"},{"id":"d6dfdce1-d589-50ae-8e4c-1e8cc0b8f51f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d6dfdce1-d589-50ae-8e4c-1e8cc0b8f51f/attachment.md","path":"canonical/duendesoftware-com/bff/architecture/multi-frontend.md","size":10782,"sha256":"2ac2915f23283451bd6611ed06327d3866b5b81a45c0809fc8230ffe220417ec","contentType":"text/markdown; charset=utf-8"},{"id":"91908208-6507-5bfb-86f8-bee8273c959f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/91908208-6507-5bfb-86f8-bee8273c959f/attachment.md","path":"canonical/duendesoftware-com/bff/architecture/third-party-cookies.md","size":4550,"sha256":"9dd70e12a4c3d1195cc777e2aca9c051bf5f2ba5b90893b89131ea95b25f16b6","contentType":"text/markdown; charset=utf-8"},{"id":"af9c0452-81e0-5759-b59c-b57673edd08c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/af9c0452-81e0-5759-b59c-b57673edd08c/attachment.md","path":"canonical/duendesoftware-com/bff/architecture/ui-hosting.md","size":6155,"sha256":"45863d73cd0372fa6695b2488f9f219c737951d89b048e4b108ef7e479de1086","contentType":"text/markdown; charset=utf-8"},{"id":"a1d51016-a86e-5d1a-9d1c-07ba5e683b64","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a1d51016-a86e-5d1a-9d1c-07ba5e683b64/attachment.md","path":"canonical/duendesoftware-com/bff/backend-for-frontend-bff-samples.md","size":5686,"sha256":"d3f62baf760228279aaacf9e18228a0445802f60f5be30360907b3f660a2c72d","contentType":"text/markdown; charset=utf-8"},{"id":"5e3b7ed1-f040-5bad-869c-35554875af41","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5e3b7ed1-f040-5bad-869c-35554875af41/attachment.md","path":"canonical/duendesoftware-com/bff/backend-for-frontend-bff-security-framework.md","size":20881,"sha256":"914f89fb4085b6a31d6539cb4812dc88b723f94959fea632e0371f4d7fd50dd2","contentType":"text/markdown; charset=utf-8"},{"id":"cf1d30a7-0921-57db-98a3-d6f4ce2b221e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cf1d30a7-0921-57db-98a3-d6f4ce2b221e/attachment.md","path":"canonical/duendesoftware-com/bff/bff-back-channel-logout-endpoint-extensibility.md","size":2859,"sha256":"7aa25f547f64ac93122fc0f4db70bfcdcdd1c35308860b5ce8fcb738c556b99e","contentType":"text/markdown; charset=utf-8"},{"id":"342aaa39-c261-56d6-a312-d9f6078d6dae","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/342aaa39-c261-56d6-a312-d9f6078d6dae/attachment.md","path":"canonical/duendesoftware-com/bff/bff-back-channel-logout-endpoint.md","size":2642,"sha256":"362676ed33a757b8ef1c23a78ba9bab08a3cc8c09992c86314c25b68f6080342","contentType":"text/markdown; charset=utf-8"},{"id":"b6c78e0b-87a9-557d-a8e4-a50151250812","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b6c78e0b-87a9-557d-a8e4-a50151250812/attachment.md","path":"canonical/duendesoftware-com/bff/bff-diagnostics-endpoint-extensibility.md","size":2118,"sha256":"ae061bcb725756a4b687d70ae70c36993282a33e7f0a184dbb08aae3e008a076","contentType":"text/markdown; charset=utf-8"},{"id":"7151e356-8425-5afc-be99-ee98263307d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7151e356-8425-5afc-be99-ee98263307d8/attachment.md","path":"canonical/duendesoftware-com/bff/bff-diagnostics-endpoint.md","size":948,"sha256":"e227339690887c907acb8df60eb87eef3d2d762f2676a6585f0e3e5f5c27f595","contentType":"text/markdown; charset=utf-8"},{"id":"c41b276e-5a16-5bf9-a02b-71b37afe2167","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c41b276e-5a16-5bf9-a02b-71b37afe2167/attachment.md","path":"canonical/duendesoftware-com/bff/bff-extensibility.md","size":657,"sha256":"d28a54b8544aaab8b3dd8fb253da50c1b6acd0628b77f1ffc9a5ef05413dcf6c","contentType":"text/markdown; charset=utf-8"},{"id":"a8c52378-c5d4-5316-9c27-8a76cdaed5b8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a8c52378-c5d4-5316-9c27-8a76cdaed5b8/attachment.md","path":"canonical/duendesoftware-com/bff/bff-login-endpoint-extensibility.md","size":2635,"sha256":"d42ab64503704bdb925aae5984ccda3701ac8e621a13051bd7ab050f1ab1607d","contentType":"text/markdown; charset=utf-8"},{"id":"e35a411f-308e-5b17-94c2-1b4ef4c28bfc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e35a411f-308e-5b17-94c2-1b4ef4c28bfc/attachment.md","path":"canonical/duendesoftware-com/bff/bff-login-endpoint.md","size":1312,"sha256":"8f3fb9e2adf6db8577061fe8b6e7f1eee571a750299ae2a94709a1929392a551","contentType":"text/markdown; charset=utf-8"},{"id":"97d1071a-39db-56f7-9604-3509e9db56c1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/97d1071a-39db-56f7-9604-3509e9db56c1/attachment.md","path":"canonical/duendesoftware-com/bff/bff-logout-endpoint-extensibility.md","size":2664,"sha256":"de98579a6f6ad9c3c4e42f131a5db1fcbc3841f261f8273cca3f52ecc32cc7ca","contentType":"text/markdown; charset=utf-8"},{"id":"82c43ad3-8812-53ba-8bea-811d43fcc054","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/82c43ad3-8812-53ba-8bea-811d43fcc054/attachment.md","path":"canonical/duendesoftware-com/bff/bff-logout-endpoint.md","size":2343,"sha256":"3fa7e52ddd497542d2f025a208b89592299df9dcf9d525c74ed8baf0378b7228","contentType":"text/markdown; charset=utf-8"},{"id":"f9e030c0-87c8-5bab-92e4-c9a2988a92bd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f9e030c0-87c8-5bab-92e4-c9a2988a92bd/attachment.md","path":"canonical/duendesoftware-com/bff/bff-management-endpoints-extensibility.md","size":4067,"sha256":"32749dbfcbdf8ba7fb965461872b0e41307343982613c2755eddca62bc6e3a49","contentType":"text/markdown; charset=utf-8"},{"id":"2db7a2e7-46b9-58b0-afdc-9057876ef41b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2db7a2e7-46b9-58b0-afdc-9057876ef41b/attachment.md","path":"canonical/duendesoftware-com/bff/bff-multi-frontend-configuration.md","size":7433,"sha256":"b57f788763842f62b4f40a883220f5545fa8fc7559c0ee30ec11d3c0148631e1","contentType":"text/markdown; charset=utf-8"},{"id":"67c92f18-fc70-52e8-a1b7-443ae65ebd6b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/67c92f18-fc70-52e8-a1b7-443ae65ebd6b/attachment.md","path":"canonical/duendesoftware-com/bff/bff-security-framework-blazor-support.md","size":19944,"sha256":"4807d814ad47e9f5a61e1d75c4f2ff1610dd36bfbb192d738e835c3824cc77c9","contentType":"text/markdown; charset=utf-8"},{"id":"3bcb7da8-8b60-58ee-946d-d312efa3e00e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3bcb7da8-8b60-58ee-946d-d312efa3e00e/attachment.md","path":"canonical/duendesoftware-com/bff/bff-session-management-endpoints.md","size":2568,"sha256":"6e02af432363ab63e7245d0572758799e86e4aadf2e8054cfd0df78d9ffe01d2","contentType":"text/markdown; charset=utf-8"},{"id":"a6b1fa6f-aedd-59de-9e0d-bcbc4ffef8a8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a6b1fa6f-aedd-59de-9e0d-bcbc4ffef8a8/attachment.md","path":"canonical/duendesoftware-com/bff/bff-silent-login-callback-extensibility.md","size":2215,"sha256":"2e021862f983cf5437aa45d223d2e44b1f46fb63d218c72f0f268b6925820887","contentType":"text/markdown; charset=utf-8"},{"id":"da1dcfd6-2c58-5e13-900d-7d76ab14e308","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/da1dcfd6-2c58-5e13-900d-7d76ab14e308/attachment.md","path":"canonical/duendesoftware-com/bff/bff-silent-login-endpoint-extensibility.md","size":2343,"sha256":"a22e63adf5c52192c400054aa8f7650a48514ead841784f1326ffdca832bb18a","contentType":"text/markdown; charset=utf-8"},{"id":"523307d8-c513-5a07-9b88-16a284025107","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/523307d8-c513-5a07-9b88-16a284025107/attachment.md","path":"canonical/duendesoftware-com/bff/bff-silent-login-endpoint.md","size":2277,"sha256":"38165aeaaf18eed9ace160529aa27a026abecd25ce80b526098bed6f06b2e7d0","contentType":"text/markdown; charset=utf-8"},{"id":"d7fe4869-fa13-5a6f-bb4a-01ac08909062","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d7fe4869-fa13-5a6f-bb4a-01ac08909062/attachment.md","path":"canonical/duendesoftware-com/bff/bff-user-endpoint-extensibility.md","size":5246,"sha256":"9b8679371098d1f7ad64a0fc36d78f719014a3bbe3deb280ec173403de9de3fc","contentType":"text/markdown; charset=utf-8"},{"id":"a628139b-fcb5-5310-b34e-70f90516fb71","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a628139b-fcb5-5310-b34e-70f90516fb71/attachment.md","path":"canonical/duendesoftware-com/bff/bff-user-endpoint.md","size":5620,"sha256":"7c75110b45f2fa7f87a573c6af9472144dc84651fa11d8b21442b22830be8d5e","contentType":"text/markdown; charset=utf-8"},{"id":"9f746dc8-46a4-5534-8a9e-727edd91f528","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9f746dc8-46a4-5534-8a9e-727edd91f528/attachment.md","path":"canonical/duendesoftware-com/bff/blazor-applications.md","size":14930,"sha256":"7e59cbecc7bfcfbb5f4447a86e3b957c92bf20481667a2d5fb33fc07ae2f234f","contentType":"text/markdown; charset=utf-8"},{"id":"ff9f8842-341f-5617-be07-a2b0c8e4ebd6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ff9f8842-341f-5617-be07-a2b0c8e4ebd6/attachment.md","path":"canonical/duendesoftware-com/bff/browser-based-applications-with-a-bff.md","size":18599,"sha256":"6b3d8edd4939119aed89053bc7f534856036bba9cb145bf5e0220116023b739f","contentType":"text/markdown; charset=utf-8"},{"id":"b0304e84-66fd-53dc-90b9-1aaa6714c6c5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b0304e84-66fd-53dc-90b9-1aaa6714c6c5/attachment.md","path":"canonical/duendesoftware-com/bff/diagnostics.md","size":3982,"sha256":"8917747abf648561c9570628d5c967682f5496707f002027c7def3e3408f5308","contentType":"text/markdown; charset=utf-8"},{"id":"9607cec8-4538-5f3c-b509-e4509cd922a8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9607cec8-4538-5f3c-b509-e4509cd922a8/attachment.md","path":"canonical/duendesoftware-com/bff/duende-bff-security-framework-v2x-to-v30.md","size":8480,"sha256":"224d9df11a4b3b1f403a17f8f0ecb90d3666af7ac5325ac9e6584f844a50666f","contentType":"text/markdown; charset=utf-8"},{"id":"4cc62c72-b713-5bd3-a4a6-4cfb6cea82a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4cc62c72-b713-5bd3-a4a6-4cfb6cea82a4/attachment.md","path":"canonical/duendesoftware-com/bff/duende-bff-security-framework-v30-to-v40.md","size":12449,"sha256":"f4dd6f9503553f053cf574dedd536ec9be4dd29b2d4335a4a07ccea53d4deba1","contentType":"text/markdown; charset=utf-8"},{"id":"4838d2c9-a237-5a36-bfcc-46f289491b1f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4838d2c9-a237-5a36-bfcc-46f289491b1f/attachment.md","path":"canonical/duendesoftware-com/bff/extensibility/http-forwarder.md","size":5069,"sha256":"0e438cae4d94c85c0aae38a5ecd044bc343f8defe8d61e82acf99ba0bf0ac84e","contentType":"text/markdown; charset=utf-8"},{"id":"b888e9ca-2c51-5099-b25e-dcd959aade70","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b888e9ca-2c51-5099-b25e-dcd959aade70/attachment.md","path":"canonical/duendesoftware-com/bff/fundamentals/options.md","size":2184,"sha256":"cff36c90d836ae71645f9b504cd513e07b96f5f040bbca4560172fa7b5439c6b","contentType":"text/markdown; charset=utf-8"},{"id":"452dbded-d0e1-5870-852b-528769c58eba","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/452dbded-d0e1-5870-852b-528769c58eba/attachment.md","path":"canonical/duendesoftware-com/bff/fundamentals/session/server-side-sessions.md","size":7592,"sha256":"6292d05b3cfc9f304c656e224c13093e01b44ed8518f0dcd05fc6d97fd118e82","contentType":"text/markdown; charset=utf-8"},{"id":"8613a601-27d6-583c-8e1f-0edc80c1d115","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8613a601-27d6-583c-8e1f-0edc80c1d115/attachment.md","path":"canonical/duendesoftware-com/bff/getting-started.md","size":987,"sha256":"9aff8ea2a3ced198bef83b9f87f787a58f4c40c809bc8706433f5cdfc886f97d","contentType":"text/markdown; charset=utf-8"},{"id":"f19289ff-4050-5273-a46e-bb154060426a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f19289ff-4050-5273-a46e-bb154060426a/attachment.md","path":"canonical/duendesoftware-com/bff/upgrading-bff-security-framework.md","size":746,"sha256":"4200f2b847b7daaf97cfb23a9344342ca18789da3c3e6c5ed0e2fd92c40c7cbc","contentType":"text/markdown; charset=utf-8"},{"id":"533d1d78-eae7-5c38-a1c8-f1e0c6b36bbe","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/533d1d78-eae7-5c38-a1c8-f1e0c6b36bbe/attachment.md","path":"canonical/duendesoftware-com/building-blazor-wasm-client-applications.md","size":17240,"sha256":"2e3fa95ca8253dae904d2d7f7bb2e0d09e272277ff125d6e3e176297afe34588","contentType":"text/markdown; charset=utf-8"},{"id":"d7a950cd-8f15-5881-83f2-3078c768274c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d7a950cd-8f15-5881-83f2-3078c768274c/attachment.md","path":"canonical/duendesoftware-com/building-browser-based-client-applications.md","size":2011,"sha256":"669e3b107afc0a79ebe39c8e1efe56c85e06f73562cc94086386662670bec3ff","contentType":"text/markdown; charset=utf-8"},{"id":"4e37251b-e0ca-534d-8e7b-8bcd371d4867","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4e37251b-e0ca-534d-8e7b-8bcd371d4867/attachment.md","path":"canonical/duendesoftware-com/calling-endpoints-from-javascript.md","size":4799,"sha256":"181304e47ca84937c76859ef76d197ac6979ec952c81459bccaee9bd3fc3999d","contentType":"text/markdown; charset=utf-8"},{"id":"6e6ae1de-cc5d-5355-839f-b0f58383abb6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6e6ae1de-cc5d-5355-839f-b0f58383abb6/attachment.md","path":"canonical/duendesoftware-com/claims.md","size":8363,"sha256":"1c77b4d2b0bee34b87d4cc413265639c4191bd902361f25c3a8090ce94dcd231","contentType":"text/markdown; charset=utf-8"},{"id":"74109408-890c-5792-89a4-45c617ca08c5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/74109408-890c-5792-89a4-45c617ca08c5/attachment.md","path":"canonical/duendesoftware-com/client-application-portal.md","size":4549,"sha256":"da3b212bfc4a1233f26aa09b94f64f9ea4826479bd2b555d6384737162dcbc24","contentType":"text/markdown; charset=utf-8"},{"id":"bd30fc00-2d61-5597-9523-a71aa5f71e9d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bd30fc00-2d61-5597-9523-a71aa5f71e9d/attachment.md","path":"canonical/duendesoftware-com/client-assertions.md","size":5285,"sha256":"efacaed26d0ac93d309599cad5889e265755d1ebac13a19f386c7ad777469712","contentType":"text/markdown; charset=utf-8"},{"id":"352aa565-6a82-521e-b17e-b07ceff8a883","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/352aa565-6a82-521e-b17e-b07ceff8a883/attachment.md","path":"canonical/duendesoftware-com/client-authentication.md","size":20271,"sha256":"dc2094a73c8a12132793c9bee900433ba42216c4d152598ff6254f822b7c6a42","contentType":"text/markdown; charset=utf-8"},{"id":"853cac31-6c3a-58c0-b5e8-eefa989712b3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/853cac31-6c3a-58c0-b5e8-eefa989712b3/attachment.md","path":"canonical/duendesoftware-com/client-initiated-backchannel-authentication.md","size":5598,"sha256":"54af4a60d034dc825efb21e48ebbccd552954aa633a85b25b4ca55d29de1f7b9","contentType":"text/markdown; charset=utf-8"},{"id":"5e3addf3-659c-5e36-917f-7e8840fb19e6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5e3addf3-659c-5e36-917f-7e8840fb19e6/attachment.md","path":"canonical/duendesoftware-com/client-notifications.md","size":4721,"sha256":"a448bad252af1122072ce404154dd9b83a763e702c40f725cd40ec4854678fcf","contentType":"text/markdown; charset=utf-8"},{"id":"17907cfd-ac7e-59ba-b304-b05d7926ed57","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/17907cfd-ac7e-59ba-b304-b05d7926ed57/attachment.md","path":"canonical/duendesoftware-com/client-store.md","size":896,"sha256":"f57b4658a2a9e6f5fe82b5bbc47268cfe9d7b2a853cd60666e3e0dd9e63c375a","contentType":"text/markdown; charset=utf-8"},{"id":"e35e9e67-d75a-5568-a466-30773bfd96c1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e35e9e67-d75a-5568-a466-30773bfd96c1/attachment.md","path":"canonical/duendesoftware-com/client.md","size":12248,"sha256":"c9ed3eef98aa425781291cc63c81b938907c0c267faa1f0a557197198629f085","contentType":"text/markdown; charset=utf-8"},{"id":"f74f18bd-e37c-5250-89a0-9061414eef47","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f74f18bd-e37c-5250-89a0-9061414eef47/attachment.md","path":"canonical/duendesoftware-com/clients.md","size":1822,"sha256":"6131f1ff0bd1f743ed4a52e29926a941059fbea6be1556b06c319676700c814c","contentType":"text/markdown; charset=utf-8"},{"id":"f6fec1ef-8fc0-5287-83e0-5897675919d6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f6fec1ef-8fc0-5287-83e0-5897675919d6/attachment.md","path":"canonical/duendesoftware-com/configuration-api.md","size":1309,"sha256":"6c598a248846f5d78b8d6f6728bd86467475b8bcee356db5ebd629c0d3da515a","contentType":"text/markdown; charset=utf-8"},{"id":"de88e0ef-e5cd-58fb-91f0-8f87d365ac42","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/de88e0ef-e5cd-58fb-91f0-8f87d365ac42/attachment.md","path":"canonical/duendesoftware-com/configuration-options.md","size":9281,"sha256":"96b93ad1382fba5d559b6dd7bfbf5305c4e3728975080328166a7af98d4f7bb2","contentType":"text/markdown; charset=utf-8"},{"id":"607d8ea7-da7d-54d5-9fc6-057b91ec0e75","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/607d8ea7-da7d-54d5-9fc6-057b91ec0e75/attachment.md","path":"canonical/duendesoftware-com/cors-policy-service.md","size":1017,"sha256":"404334aaba6c389c072a5752dc1ef15f03a7468189740643358387fe77c2a167","contentType":"text/markdown; charset=utf-8"},{"id":"6098a4b0-7cad-50cb-aeae-ce41532417d7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6098a4b0-7cad-50cb-aeae-ce41532417d7/attachment.md","path":"canonical/duendesoftware-com/creating-authorize-and-endsession-urls.md","size":4350,"sha256":"db3e83d3ba8681df274e995ee6113341b4372df6573b7ef586eef056377252f6","contentType":"text/markdown; charset=utf-8"},{"id":"d6d73c45-3e2f-539f-90d2-86433a518da9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d6d73c45-3e2f-539f-90d2-86433a518da9/attachment.md","path":"canonical/duendesoftware-com/custom-authorize-request-validator.md","size":1524,"sha256":"e25d45c65a57420ded29179fd7cebd6dff1adb23ac35b0fb637ee2df866f9e15","contentType":"text/markdown; charset=utf-8"},{"id":"e86d28f1-1675-5de6-be09-6c7100077f74","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e86d28f1-1675-5de6-be09-6c7100077f74/attachment.md","path":"canonical/duendesoftware-com/custom-pages.md","size":4482,"sha256":"c909f1ae3d3fdf58d6fa1d7f655c0bc11ad3ce340373bf6cb08ded6c3d55cd95","contentType":"text/markdown; charset=utf-8"},{"id":"a6dd8402-9e5e-5165-a7ad-e116380f0788","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a6dd8402-9e5e-5165-a7ad-e116380f0788/attachment.md","path":"canonical/duendesoftware-com/custom-token-request-validator.md","size":1797,"sha256":"b564df34f8098700260a6765fa7523c87152e49219850415528e9830310b270c","contentType":"text/markdown; charset=utf-8"},{"id":"52480038-7a87-5824-92fb-2aa738fe7b03","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/52480038-7a87-5824-92fb-2aa738fe7b03/attachment.md","path":"canonical/duendesoftware-com/demonstrating-proof-of-possession.md","size":4818,"sha256":"4ea233ad93a3279e21b7be570030a50b5b55bfdae8b5b5c7616ab3066df5631f","contentType":"text/markdown; charset=utf-8"},{"id":"f72ed641-59f1-5fb1-8423-a337969c7a65","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f72ed641-59f1-5fb1-8423-a337969c7a65/attachment.md","path":"canonical/duendesoftware-com/dependency-injection-extension-methods.md","size":9763,"sha256":"3e24e0160621c8ab61685e6546d5611b47f24d398f10eacab2c8981c65269e4d","contentType":"text/markdown; charset=utf-8"},{"id":"d6f9801f-95ae-5a34-bf1e-2386511f520f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d6f9801f-95ae-5a34-bf1e-2386511f520f/attachment.md","path":"canonical/duendesoftware-com/device-authorization-endpoint.md","size":1434,"sha256":"de8fccfb89e8b0388fda11c44e32cf08cabdc3726bdd55131921283ca77e9cdd","contentType":"text/markdown; charset=utf-8"},{"id":"740d9013-38a5-5cad-87c7-284025a206ef","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/740d9013-38a5-5cad-87c7-284025a206ef/attachment.md","path":"canonical/duendesoftware-com/device-flow-interaction-service.md","size":1950,"sha256":"c26718b18906401a7482c61365865d9ee2c04f2b4cbb62f7aab5dd1caa0fc703","contentType":"text/markdown; charset=utf-8"},{"id":"ed95d07f-1257-50b6-a2cb-271a2d7e9d1a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ed95d07f-1257-50b6-a2cb-271a2d7e9d1a/attachment.md","path":"canonical/duendesoftware-com/device-flow-store.md","size":4296,"sha256":"cd4235e91b960687b0d6d05a876739856ce5c31bc67639f36f7aaf4be03c9838","contentType":"text/markdown; charset=utf-8"},{"id":"187d513c-a81c-524f-80a3-f31b1f066f93","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/187d513c-a81c-524f-80a3-f31b1f066f93/attachment.md","path":"canonical/duendesoftware-com/diagnostics.md","size":1978,"sha256":"1f43347d7208c16e291f2408ed36c6c8e6c521978b6cd006310b3bce5883e8fa","contentType":"text/markdown; charset=utf-8"},{"id":"3ae9cb8c-d4ef-5a29-8fdb-c9ebf83b0329","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3ae9cb8c-d4ef-5a29-8fdb-c9ebf83b0329/attachment.md","path":"canonical/duendesoftware-com/discovery-endpoint.md","size":14849,"sha256":"1c2af739ac365d58f551e03f843e846377111c00e2f2888862a5810f7879c43e","contentType":"text/markdown; charset=utf-8"},{"id":"7437c0ab-44ea-52de-8ac9-65e5999d5873","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7437c0ab-44ea-52de-8ac9-65e5999d5873/attachment.md","path":"canonical/duendesoftware-com/duende-accesstokenmanagement-v3x-to-v40.md","size":5276,"sha256":"62ac64fb5ee0b565f85eb86d5cbb583f4e9e92077de1f79e240088bb0b081275","contentType":"text/markdown; charset=utf-8"},{"id":"ee540d6a-e28a-5569-9793-f83b5ca30c91","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ee540d6a-e28a-5569-9793-f83b5ca30c91/attachment.md","path":"canonical/duendesoftware-com/dynamic-client-registration.md","size":1798,"sha256":"68db07258f63b292482d2c48d4d99a01908ac84ce7301fe7dd9a161a042796df","contentType":"text/markdown; charset=utf-8"},{"id":"ec606f59-fdfb-541c-adad-2edf07b1d8ea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ec606f59-fdfb-541c-adad-2edf07b1d8ea/attachment.md","path":"canonical/duendesoftware-com/dynamic-providers.md","size":21418,"sha256":"88e806e1420833371e592bd3f8e73792b6260ac0613bb981098d7a76b936b78a","contentType":"text/markdown; charset=utf-8"},{"id":"0aed7d9e-132f-5a85-a057-3082914dff3c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0aed7d9e-132f-5a85-a057-3082914dff3c/attachment.md","path":"canonical/duendesoftware-com/embedded-local-apis.md","size":9844,"sha256":"d32cc4cfac8581c79f81c92e7a360221b65e958c889e77bf60a6cdefd10ef388","contentType":"text/markdown; charset=utf-8"},{"id":"3aea1f16-3783-5058-ae50-f27452ea89a7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3aea1f16-3783-5058-ae50-f27452ea89a7/attachment.md","path":"canonical/duendesoftware-com/end-session-endpoint.md","size":2314,"sha256":"d4a6f32ee05762bd9f066338499f81f36f23822d238782bc7bf4146a79e7590c","contentType":"text/markdown; charset=utf-8"},{"id":"c0b72854-ef53-5341-81e2-10f6d8b55e54","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c0b72854-ef53-5341-81e2-10f6d8b55e54/attachment.md","path":"canonical/duendesoftware-com/entity-framework-core-configuration-operational-data.md","size":10860,"sha256":"37f581f8e5fc92501db762b0dd9fdf8295b294455debf961272e8d59886701fe","contentType":"text/markdown; charset=utf-8"},{"id":"d7dc50a5-bf1e-5d2b-a316-2f778e1a0308","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d7dc50a5-bf1e-5d2b-a316-2f778e1a0308/attachment.md","path":"canonical/duendesoftware-com/entity-framework-core-integration.md","size":8851,"sha256":"f4940ce3ae0bb34f35561dfb0aedf138833456134b32bd3b41dc0b27c1781ff9","contentType":"text/markdown; charset=utf-8"},{"id":"31181eb3-9107-53cf-af12-9ae302c5d8d5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/31181eb3-9107-53cf-af12-9ae302c5d8d5/attachment.md","path":"canonical/duendesoftware-com/epoch-time-conversion.md","size":911,"sha256":"aa58ae834848d95c37758d2cc82f712f8db2c4785ee0810f978a0dfb3cde76dc","contentType":"text/markdown; charset=utf-8"},{"id":"bf677786-1070-5979-936e-9c67663167cf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bf677786-1070-5979-936e-9c67663167cf/attachment.md","path":"canonical/duendesoftware-com/events.md","size":5307,"sha256":"92bf151dcbae3df4e950b5adf26ee81e0ff1e372f00fc2acaeeb62a376d30d04","contentType":"text/markdown; charset=utf-8"},{"id":"24602f02-5086-54a7-8e72-ce1fdf19402b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/24602f02-5086-54a7-8e72-ce1fdf19402b/attachment.md","path":"canonical/duendesoftware-com/export-har-files-for-analyzing-client-side-interactions.md","size":6454,"sha256":"2d7ef266a1ab6bddcbb372aab6270e25e4f241a39da60d76abdd5205e0446275","contentType":"text/markdown; charset=utf-8"},{"id":"fb1b151c-e0a3-5fcc-9f7b-ad1bfb1593a7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fb1b151c-e0a3-5fcc-9f7b-ad1bfb1593a7/attachment.md","path":"canonical/duendesoftware-com/extensibility.md","size":8956,"sha256":"6c0fd083029ba14cc3cf39c3c21ce74b5d553df3409491647dfa36861d0c2448","contentType":"text/markdown; charset=utf-8"},{"id":"8885a60d-3d23-5445-aa9f-1234700375ad","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8885a60d-3d23-5445-aa9f-1234700375ad/attachment.md","path":"canonical/duendesoftware-com/extension-grants.md","size":7738,"sha256":"e794ef423c7dfaab88b2db6182d2f6cbbccdcfbe40cd14ede22dfff3f07dfaeb","contentType":"text/markdown; charset=utf-8"},{"id":"82e79dc8-5c7a-5112-9537-9d28bd6ac697","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/82e79dc8-5c7a-5112-9537-9d28bd6ac697/attachment.md","path":"canonical/duendesoftware-com/external-logout-notification.md","size":2881,"sha256":"10cc5a390aeafa870c2045d7ff9474f121cd36cc1ac10717e277f5d566356182","contentType":"text/markdown; charset=utf-8"},{"id":"a8da5c94-73d3-5af6-84e0-04e46e83f5c7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a8da5c94-73d3-5af6-84e0-04e46e83f5c7/attachment.md","path":"canonical/duendesoftware-com/fapi-20.md","size":10998,"sha256":"86f04d379f81e3414b17c29f7d7c58be0c1783b6b560ab3388cba0db6184e649","contentType":"text/markdown; charset=utf-8"},{"id":"ac563ca9-5d59-55ed-87ba-d1dd85d02a02","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ac563ca9-5d59-55ed-87ba-d1dd85d02a02/attachment.md","path":"canonical/duendesoftware-com/federal-information-processing-standard-fips-compliance.md","size":2806,"sha256":"1c7bd6e39f7e8f012f093699e7682b36698ddabe4645dd2c7611a2b9baa59d45","contentType":"text/markdown; charset=utf-8"},{"id":"39128f66-d666-59e6-8315-0151cfa336e4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/39128f66-d666-59e6-8315-0151cfa336e4/attachment.md","path":"canonical/duendesoftware-com/federation-gateway.md","size":5764,"sha256":"368a10f32369fc3b7cf5f7351bf9747120a5bd138d25bc3cb6ca7197829ff323","contentType":"text/markdown; charset=utf-8"},{"id":"a26204ed-a52e-5aae-8f9e-54e3cae18c9d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a26204ed-a52e-5aae-8f9e-54e3cae18c9d/attachment.md","path":"canonical/duendesoftware-com/fluent-x509-certificate-store-api.md","size":2626,"sha256":"9b4592b06e45b96e74e68b17e00296677e78e6f3d2d8c783cc398e06d5993e58","contentType":"text/markdown; charset=utf-8"},{"id":"d60b609a-e475-5334-9019-458ca43ccc38","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d60b609a-e475-5334-9019-458ca43ccc38/attachment.md","path":"canonical/duendesoftware-com/general-usage.md","size":6678,"sha256":"05a473293d0f7cb90ece6fd93d2d7528de641c40a815eb49478d6fe7db431ae9","contentType":"text/markdown; charset=utf-8"},{"id":"55c560ad-6b41-5e0b-9975-6457188f55be","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/55c560ad-6b41-5e0b-9975-6457188f55be/attachment.md","path":"canonical/duendesoftware-com/general/dynamic-providers.md","size":21609,"sha256":"5adf208c588f681fde8f49990a4919007e832cddae33b81a94b6ab5bfccfea27","contentType":"text/markdown; charset=utf-8"},{"id":"ab3ae9dd-1606-5a91-8416-d717e25e7c5e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ab3ae9dd-1606-5a91-8416-d717e25e7c5e/attachment.md","path":"canonical/duendesoftware-com/general/glossary.md","size":7718,"sha256":"fb2107034e62fd59fa83ed5b40a5430140a1c7ce1275f6a2115660d1efef9503","contentType":"text/markdown; charset=utf-8"},{"id":"733e81f2-71f1-5fc7-ac69-ca126ad15348","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/733e81f2-71f1-5fc7-ac69-ca126ad15348/attachment.md","path":"canonical/duendesoftware-com/general/licensing.md","size":16730,"sha256":"25147c5b22f33ad2b0c4a22ae742c4fc37fd7a6bb5adebbadbc2307af7bf1792","contentType":"text/markdown; charset=utf-8"},{"id":"13d89890-94c2-51a4-aff6-ffbd1aafbb1f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/13d89890-94c2-51a4-aff6-ffbd1aafbb1f/attachment.md","path":"canonical/duendesoftware-com/general/logging.md","size":4764,"sha256":"dc57dbc490b0e586fbdbd35188cd9b6dedb0ee73d690e546ef1c214d711d3791","contentType":"text/markdown; charset=utf-8"},{"id":"8f3d3266-0889-59b2-820c-53ac11a65d71","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8f3d3266-0889-59b2-820c-53ac11a65d71/attachment.md","path":"canonical/duendesoftware-com/general/security-best-practices.md","size":8687,"sha256":"7d266a030afdbd0afe79ba4cb17070d6f2e4de1856f45bb3b1939f69257e4421","contentType":"text/markdown; charset=utf-8"},{"id":"8dd38659-4c4f-5fa5-8b13-7cf631cb7ef7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8dd38659-4c4f-5fa5-8b13-7cf631cb7ef7/attachment.md","path":"canonical/duendesoftware-com/getting-started-multiple-frontends.md","size":6117,"sha256":"aa4ce59d3c20a739d2ffa073cac42bbfd506940e9d05bf9213138fcd88fa1dd6","contentType":"text/markdown; charset=utf-8"},{"id":"cf716a4e-0e96-5580-b23c-fa40396ec8a2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cf716a4e-0e96-5580-b23c-fa40396ec8a2/attachment.md","path":"canonical/duendesoftware-com/getting-started-single-frontend.md","size":10315,"sha256":"91df367498461686789f862f64ba4368f82d60dad5125148fb9de30cc7f02f31","contentType":"text/markdown; charset=utf-8"},{"id":"43afdc2a-92ef-5e29-b58b-60093cdb166c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/43afdc2a-92ef-5e29-b58b-60093cdb166c/attachment.md","path":"canonical/duendesoftware-com/glossary.md","size":7710,"sha256":"c6ac7bf4e42bcee97cf0c14b3c4d021bf4aec663ab4b3779e27a9b90201c46d7","contentType":"text/markdown; charset=utf-8"},{"id":"422d7b60-1e5f-52e0-b4bb-0c648898a7c5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/422d7b60-1e5f-52e0-b4bb-0c648898a7c5/attachment.md","path":"canonical/duendesoftware-com/hosting.md","size":3476,"sha256":"201defc50c5b3eeded320c4408d9d22b298a52f4a2e4a0732bc1f8668ea16d81","contentType":"text/markdown; charset=utf-8"},{"id":"8360dee1-5f81-592a-9cad-02e0b81e2291","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8360dee1-5f81-592a-9cad-02e0b81e2291/attachment.md","path":"canonical/duendesoftware-com/http-forwarder.md","size":5051,"sha256":"42da2db6b44c0c8b2661e8807bbb6a8406a6540a0312345af53ba99916a92fda","contentType":"text/markdown; charset=utf-8"},{"id":"9eaa72ad-1337-5b45-84c8-593fbcaf97b3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9eaa72ad-1337-5b45-84c8-593fbcaf97b3/attachment.md","path":"canonical/duendesoftware-com/identity-resource.md","size":2172,"sha256":"d70aedaa3574896c998c027261be9106fbfbd6df449152a5802372b936c2f1d9","contentType":"text/markdown; charset=utf-8"},{"id":"0d08c2da-0afc-524d-95f9-550bab547deb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0d08c2da-0afc-524d-95f9-550bab547deb/attachment.md","path":"canonical/duendesoftware-com/identity-resources.md","size":2830,"sha256":"d3f4165b68bdf51d46d019a2079cd8f4c2936f5a7e0b00c5f68bfc8aefc1af6d","contentType":"text/markdown; charset=utf-8"},{"id":"ffd612e6-34b5-5c79-a0d7-2f490f38e2fc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ffd612e6-34b5-5c79-a0d7-2f490f38e2fc/attachment.md","path":"canonical/duendesoftware-com/identitymodel-oidcclient/duende-identitymodel-oidc-client-samples.md","size":3091,"sha256":"efd7ea279783beba7ed144619040f606e6c39dcd068c56e617c815b04a1b2486","contentType":"text/markdown; charset=utf-8"},{"id":"b9685afc-6862-5541-bdb9-324d77a634ef","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b9685afc-6862-5541-bdb9-324d77a634ef/attachment.md","path":"canonical/duendesoftware-com/identitymodel-oidcclient/duende-identitymodel-oidc-client.md","size":2243,"sha256":"22bfecf553459f0a6dd5e282a14247efee95065dbe831687d400d2e924cd547a","contentType":"text/markdown; charset=utf-8"},{"id":"91122a2b-bb49-526a-aa9c-b4552f7ecf13","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/91122a2b-bb49-526a-aa9c-b4552f7ecf13/attachment.md","path":"canonical/duendesoftware-com/identitymodel-oidcclient/oidc-client-automatic-mode.md","size":4359,"sha256":"bac3f5862831a661b2622c38f6a7e854afd8a53df8a27bfe69a9c4f610fec44d","contentType":"text/markdown; charset=utf-8"},{"id":"d3edebe0-8a02-5e62-b640-ff79a8e9f35d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d3edebe0-8a02-5e62-b640-ff79a8e9f35d/attachment.md","path":"canonical/duendesoftware-com/identitymodel-oidcclient/oidc-client-logging.md","size":2181,"sha256":"c84740290641967a2d249e3535a0eb439ec67dd5e8d421375addb942837dcba4","contentType":"text/markdown; charset=utf-8"},{"id":"c30f0afd-e1c6-5b36-b9fc-5530a2746c50","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c30f0afd-e1c6-5b36-b9fc-5530a2746c50/attachment.md","path":"canonical/duendesoftware-com/identitymodel-oidcclient/oidc-client-manual-mode.md","size":2174,"sha256":"dda3a538cdb60a1fad2ef6ea24e47f13ea78709c9b86c2f89e9c35278ab5fdf7","contentType":"text/markdown; charset=utf-8"},{"id":"531fe7d3-5daa-5f26-a05d-bb69de83f1d3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/531fe7d3-5daa-5f26-a05d-bb69de83f1d3/attachment.md","path":"canonical/duendesoftware-com/identitymodel/duende-identitymodel.md","size":1228,"sha256":"ee9f842d2d56c61882e855a5615499847247dfc916a6e3d74e7c1c42bfdcb2f6","contentType":"text/markdown; charset=utf-8"},{"id":"d397b88c-780b-52b1-a95a-cbd1052bb850","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d397b88c-780b-52b1-a95a-cbd1052bb850/attachment.md","path":"canonical/duendesoftware-com/identitymodel/endpoints/general-usage.md","size":6702,"sha256":"9bc843d0d18494ce09655ca99c6d06f11db412f83cc77252653775e2af320411","contentType":"text/markdown; charset=utf-8"},{"id":"2a1399cb-cbc1-5722-9b08-588ba4557e10","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2a1399cb-cbc1-5722-9b08-588ba4557e10/attachment.md","path":"canonical/duendesoftware-com/identityserver.md","size":2016,"sha256":"283c895faaf2c60420e1ba13c7cacbdc2e2927da2e3675c8d1627367ce266ee6","contentType":"text/markdown; charset=utf-8"},{"id":"d32d4efd-9487-5c0e-a99c-2422a323a89e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d32d4efd-9487-5c0e-a99c-2422a323a89e/attachment.md","path":"canonical/duendesoftware-com/identityserver/aspnet-core-and-api-access.md","size":6129,"sha256":"d0fd76c339d8f505053a894237b71652d421f30d73739b5823707780f6f3dc6e","contentType":"text/markdown; charset=utf-8"},{"id":"ac18f72e-f4ab-5acb-8454-91da15551fc0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ac18f72e-f4ab-5acb-8454-91da15551fc0/attachment.md","path":"canonical/duendesoftware-com/identityserver/aspnet-core-identity.md","size":16568,"sha256":"abaa248d03af746adb28f263f66b942817224824708f748a47503983763b7dad","contentType":"text/markdown; charset=utf-8"},{"id":"4703105b-8cb6-55d7-9083-2da4b387c0a5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4703105b-8cb6-55d7-9083-2da4b387c0a5/attachment.md","path":"canonical/duendesoftware-com/identityserver/aspnet-identity-integration.md","size":4814,"sha256":"01c73729a54231e8270a0d73725c04ad7951d3d4ead20149eea8859a184f367a","contentType":"text/markdown; charset=utf-8"},{"id":"faebd592-2e08-5fe8-b1ec-2f106e68973c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/faebd592-2e08-5fe8-b1ec-2f106e68973c/attachment.md","path":"canonical/duendesoftware-com/identityserver/backchannel-authentication-endpoint.md","size":5045,"sha256":"145beeb2e937519f7bd553e1573692681c717961e85c4b6e6fe58319d9cf42da","contentType":"text/markdown; charset=utf-8"},{"id":"0f1be9b2-79f0-5d4d-8a3f-d85cf8be76b7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0f1be9b2-79f0-5d4d-8a3f-d85cf8be76b7/attachment.md","path":"canonical/duendesoftware-com/identityserver/backchannel-authentication-request-store.md","size":4415,"sha256":"be5519de979f71e13ee7f83c89b1fceea97a7bbfc633cd884bcfabb84f594477","contentType":"text/markdown; charset=utf-8"},{"id":"cc3dd7f6-91ad-507d-889a-899c6dd8377c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cc3dd7f6-91ad-507d-889a-899c6dd8377c/attachment.md","path":"canonical/duendesoftware-com/identityserver/backchannel-user-login-request.md","size":1492,"sha256":"8221ea3a98d6bccb128cedee7a8e08ecab23a2400e60169301f3691dc3a7e67b","contentType":"text/markdown; charset=utf-8"},{"id":"67b232ef-e0f1-5790-b26b-424e1377662a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/67b232ef-e0f1-5790-b26b-424e1377662a/attachment.md","path":"canonical/duendesoftware-com/identityserver/building-blazor-wasm-client-applications.md","size":14919,"sha256":"993e3ae09352a10c346fa73629e12799435efd35f948f63bec44e15f645a9abf","contentType":"text/markdown; charset=utf-8"},{"id":"127e258e-7d94-5e2f-bf16-01c2c865d0aa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/127e258e-7d94-5e2f-bf16-01c2c865d0aa/attachment.md","path":"canonical/duendesoftware-com/identityserver/clients.md","size":3806,"sha256":"62df031bca980f383ed528545818f566057a633d5d91c9a770c40259b48d4d44","contentType":"text/markdown; charset=utf-8"},{"id":"a5501e13-2c7d-5eb9-ab82-b1621173bdb4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a5501e13-2c7d-5eb9-ab82-b1621173bdb4/attachment.md","path":"canonical/duendesoftware-com/identityserver/configuration-data.md","size":5170,"sha256":"5bf65e10c696ca53c5ca16d1f38580a4fc2d8f5e9cd15fee6fc8c48565f67da8","contentType":"text/markdown; charset=utf-8"},{"id":"8214fb07-313c-5eb0-bf9c-72b014c2cfe8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8214fb07-313c-5eb0-bf9c-72b014c2cfe8/attachment.md","path":"canonical/duendesoftware-com/identityserver/configuration-options.md","size":2356,"sha256":"e285095c8df0666ed8f252457405b7f2f71fec571a7295945e7ad315f02f2021","contentType":"text/markdown; charset=utf-8"},{"id":"a4aaab33-486a-5b69-8f36-a287fc7b61bd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a4aaab33-486a-5b69-8f36-a287fc7b61bd/attachment.md","path":"canonical/duendesoftware-com/identityserver/consent.md","size":4299,"sha256":"d88a9d242425f8e475be00757d88a31341b8817289823d1d979fd72d14aede5e","contentType":"text/markdown; charset=utf-8"},{"id":"fdbd1d69-ab12-5039-ada2-9ff833f95e5b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fdbd1d69-ab12-5039-ada2-9ff833f95e5b/attachment.md","path":"canonical/duendesoftware-com/identityserver/data-stores-and-persistence.md","size":1511,"sha256":"724825cf1e13676a65227bd24fb4cb8bec243b09f3e75a68c54c435fd006b768","contentType":"text/markdown; charset=utf-8"},{"id":"ca77ba5e-d0a6-5bd6-b341-afff28b1c625","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ca77ba5e-d0a6-5bd6-b341-afff28b1c625/attachment.md","path":"canonical/duendesoftware-com/identityserver/diagnostics-data.md","size":32212,"sha256":"e24ef3811b8d2f3f49f54768d8874e9e11b55d7fee2c19e0f969f183816c547d","contentType":"text/markdown; charset=utf-8"},{"id":"da7f4187-5dec-56b7-823b-79efece8718e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/da7f4187-5dec-56b7-823b-79efece8718e/attachment.md","path":"canonical/duendesoftware-com/identityserver/diagnostics/conformance-report.md","size":5794,"sha256":"81d24912d04dcaba96e0f53cfa0236ff58937db767fddd020eb2519b1aaeaa0a","contentType":"text/markdown; charset=utf-8"},{"id":"1bc9c9c9-9278-5bbf-adc4-9d2bb8c80453","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1bc9c9c9-9278-5bbf-adc4-9d2bb8c80453/attachment.md","path":"canonical/duendesoftware-com/identityserver/diagnostics/events.md","size":5334,"sha256":"459ff223d581ce73d15ceac77ecde938b002b18bf61ba7aee4dc161448fd9e9b","contentType":"text/markdown; charset=utf-8"},{"id":"5b4638cc-bb8e-5796-a67b-f9c90b0a411d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5b4638cc-bb8e-5796-a67b-f9c90b0a411d/attachment.md","path":"canonical/duendesoftware-com/identityserver/dpop-proof-validator.md","size":2399,"sha256":"6b44cc861e9e4febac8c0db0a2699e24c178e944736343858f0a44b04fc2b81e","contentType":"text/markdown; charset=utf-8"},{"id":"7f0243dc-075b-5180-b2f4-35421e255d48","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7f0243dc-075b-5180-b2f4-35421e255d48/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-samples.md","size":1712,"sha256":"1a4d6ded1fffa5a0d02125217cb919082eb8158bc2b4f424663cebac6c9ee849","contentType":"text/markdown; charset=utf-8"},{"id":"38e796ac-0513-530f-8d6f-3685eb50f697","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/38e796ac-0513-530f-8d6f-3685eb50f697/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-troubleshooting.md","size":29806,"sha256":"dac22d8edb00e765f193b2453d131fc32773b31c13f6f7f315f40fef5c4195ee","contentType":"text/markdown; charset=utf-8"},{"id":"1a256345-a3ce-5316-8e4d-f7a6ec4c2ddb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1a256345-a3ce-5316-8e4d-f7a6ec4c2ddb/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v50-to-v51.md","size":2550,"sha256":"e10cc38ee6bc6c203cd87c0072755d9bc8217374e05c4e696a8a2e092d93ebd9","contentType":"text/markdown; charset=utf-8"},{"id":"9871386a-03cc-5cc7-a67f-59505dfc433e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9871386a-03cc-5cc7-a67f-59505dfc433e/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v51-to-v52.md","size":4731,"sha256":"979bfa7a32b22d840ca171164c2560f98d506e0dda443f62d5c84b529ecb2108","contentType":"text/markdown; charset=utf-8"},{"id":"85a6bc8d-4a92-5d57-b245-9a5ae1eb02d3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/85a6bc8d-4a92-5d57-b245-9a5ae1eb02d3/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v52-to-v60.md","size":8143,"sha256":"b179b0da8e102cd286c0de83fa016af698a988aa2da8fbf856bd599dd5da2b56","contentType":"text/markdown; charset=utf-8"},{"id":"f3abdc93-f777-516c-b371-9db4f7a594f2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f3abdc93-f777-516c-b371-9db4f7a594f2/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v60-to-v61.md","size":4228,"sha256":"1a63965c16e540dceef356800c0b0c5a141f1d87e5eca352009c30d8c0e27c11","contentType":"text/markdown; charset=utf-8"},{"id":"181f1e6b-a851-552e-8049-09753b49324a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/181f1e6b-a851-552e-8049-09753b49324a/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v61-to-v62.md","size":2505,"sha256":"daa63b7ab35ce5752a6f2180a1ea99b44c3220558aca507277de41df1d170ac8","contentType":"text/markdown; charset=utf-8"},{"id":"17cabfa2-4d66-5b64-bd0f-d2b94f8db257","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/17cabfa2-4d66-5b64-bd0f-d2b94f8db257/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v62-to-v63.md","size":10481,"sha256":"09ad579d8c4896ee574e680b91564d64d8b9f0bee6c353271ccf37a34b19f979","contentType":"text/markdown; charset=utf-8"},{"id":"63bcd888-73e5-523c-8868-2c43832999ea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/63bcd888-73e5-523c-8868-2c43832999ea/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v63-to-v70.md","size":14666,"sha256":"5bebe3880d56da55e9e2e9acb0dbfce9f04a84faca0a14f3760a7a3be61a8303","contentType":"text/markdown; charset=utf-8"},{"id":"582246be-b8ab-5e30-bf08-7e796de14844","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/582246be-b8ab-5e30-bf08-7e796de14844/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v70-to-v71.md","size":3587,"sha256":"32541b34c3bc22b57784d1682be3dfdb548a14fccd176b4f66136b099d4aa1ea","contentType":"text/markdown; charset=utf-8"},{"id":"e502edaa-cca1-5819-a8e8-ba8bb26935c2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e502edaa-cca1-5819-a8e8-ba8bb26935c2/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v71-to-v72.md","size":1601,"sha256":"b1a3bbf785fdc44bbd6ab06019b1359bfe963d91171a75085fbb4853cf0c0e98","contentType":"text/markdown; charset=utf-8"},{"id":"5afe47c6-7e0a-5a07-9c7d-126519bfadb8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5afe47c6-7e0a-5a07-9c7d-126519bfadb8/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v72-to-v73.md","size":6285,"sha256":"800ab383c852a745c3787b2b00fbc2c915d254d2285b0af427ee156a55a9bf8a","contentType":"text/markdown; charset=utf-8"},{"id":"a57a79bf-507a-5ea9-ba98-3024adafaf53","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a57a79bf-507a-5ea9-ba98-3024adafaf53/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v73-to-v74.md","size":4478,"sha256":"d04bce6a6b72b5f840bc157e6fe577e5b74df37cfe9d6af3dd0ee163b4a4e7cd","contentType":"text/markdown; charset=utf-8"},{"id":"046ee938-ebfb-5bf0-bc6f-fa80834e2de0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/046ee938-ebfb-5bf0-bc6f-fa80834e2de0/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver-v74-to-v80.md","size":12409,"sha256":"ecaf8633442e68d0f759b5f6f4e0b4132087ae8d6e6432fcb9d3271287a3c4a2","contentType":"text/markdown; charset=utf-8"},{"id":"9240795c-d7a6-528a-bf62-4fa0fd007b32","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9240795c-d7a6-528a-bf62-4fa0fd007b32/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-identityserver.md","size":3537,"sha256":"4d50002a1b01766b886640cbba899074bb405615189c0cd159ae2a33d499c12c","contentType":"text/markdown; charset=utf-8"},{"id":"91fe4aa7-4b96-534c-9f36-a64618faf0a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/91fe4aa7-4b96-534c-9f36-a64618faf0a4/attachment.md","path":"canonical/duendesoftware-com/identityserver/duende-software-docs.md","size":2037,"sha256":"7bebf80312b9eef69d647f30e386ee9367bbcb4147ddcf9fe933b841949423cd","contentType":"text/markdown; charset=utf-8"},{"id":"5904e5b9-4981-5648-9658-47748abd1134","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5904e5b9-4981-5648-9658-47748abd1134/attachment.md","path":"canonical/duendesoftware-com/identityserver/dynamic-request-validation-and-customization.md","size":2210,"sha256":"78a061793a327c698e1a4572011b5c71b4d7c239357689164298b3ce9b5c9b34","contentType":"text/markdown; charset=utf-8"},{"id":"bb9a1924-3ec2-55af-8ebc-54a1a2d9a5fe","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bb9a1924-3ec2-55af-8ebc-54a1a2d9a5fe/attachment.md","path":"canonical/duendesoftware-com/identityserver/entity-framework-core-options.md","size":619,"sha256":"a4c37e5bd0a424f1c24485c23dd29c55daee86930d959d73c0ce8c20f94d8b08","contentType":"text/markdown; charset=utf-8"},{"id":"56c7ae25-87aa-5e08-bd2a-9e9afccabe9a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/56c7ae25-87aa-5e08-bd2a-9e9afccabe9a/attachment.md","path":"canonical/duendesoftware-com/identityserver/error.md","size":1895,"sha256":"3ee4f8c563599d06d59d392e9335021ce5cc8697520aaab2f956c5b75d060644","contentType":"text/markdown; charset=utf-8"},{"id":"dc064263-e47e-5165-be55-3d3f793d00e6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dc064263-e47e-5165-be55-3d3f793d00e6/attachment.md","path":"canonical/duendesoftware-com/identityserver/extension-grant-validator.md","size":1847,"sha256":"a07c99fec0875f13ff6d3672aca299057280fc162eb3e76cfd2e2b8ddbc062ce","contentType":"text/markdown; charset=utf-8"},{"id":"6374b8d8-565f-5877-8f3f-3ff8b25dc4a6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6374b8d8-565f-5877-8f3f-3ff8b25dc4a6/attachment.md","path":"canonical/duendesoftware-com/identityserver/external-logout.md","size":4415,"sha256":"a1621c3f08a6b7b7b22aa3f074ee24e6db69ffd7a13198878c6616e445d999b7","contentType":"text/markdown; charset=utf-8"},{"id":"32b4d577-3633-50fe-b9b2-be1716d3a8b1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/32b4d577-3633-50fe-b9b2-be1716d3a8b1/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/claims.md","size":8391,"sha256":"c555d1c7d18e9f8d5ff120cd64217f172509bad04e66ef228b9b83d4cf14f929","contentType":"text/markdown; charset=utf-8"},{"id":"dabf5496-9dea-5faf-8d2d-d895d6a08378","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dabf5496-9dea-5faf-8d2d-d895d6a08378/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/clients.md","size":1850,"sha256":"c370ec766b0854dfc57506a4a5d168887d7478711629bfeb3173cde42721a661","contentType":"text/markdown; charset=utf-8"},{"id":"7d7f0dda-b3be-59a4-8f88-7a6c9770fea0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7d7f0dda-b3be-59a4-8f88-7a6c9770fea0/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/hosting.md","size":3504,"sha256":"28512d304881410adea89e517867f51f5911a16b2f8a5e78359bd5ece7adfe31","contentType":"text/markdown; charset=utf-8"},{"id":"ee9adee2-3413-527b-aba5-d2b4981c9d5c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ee9adee2-3413-527b-aba5-d2b4981c9d5c/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/key-management.md","size":19947,"sha256":"c2b03760e8eb45e3919f42eabdfb32493065162061ccea0bf43a00092d0b2f68","contentType":"text/markdown; charset=utf-8"},{"id":"581be955-71f4-5b7b-a218-d31810fd6057","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/581be955-71f4-5b7b-a218-d31810fd6057/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/resources/api-resources.md","size":5438,"sha256":"7ba082dd5cc5ffdb84a98594f74a0143140058dc815dc7da64826958e3b71440","contentType":"text/markdown; charset=utf-8"},{"id":"a7292417-b6d0-57c5-ae3d-d550c86aed80","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a7292417-b6d0-57c5-ae3d-d550c86aed80/attachment.md","path":"canonical/duendesoftware-com/identityserver/fundamentals/resources/api-scopes.md","size":6942,"sha256":"03dd759d6adac1c34179025a89f2e9f5a73341315f44c107853c98dcab6ef17b","contentType":"text/markdown; charset=utf-8"},{"id":"ef105ef8-6a24-538c-9b02-bfab4a136bf0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ef105ef8-6a24-538c-9b02-bfab4a136bf0/attachment.md","path":"canonical/duendesoftware-com/identityserver/getting-started-templates.md","size":1477,"sha256":"ebabe43ea1dcb4095a6e036b9c21fb4a7068fe933c92ffb418d389badacfb74a","contentType":"text/markdown; charset=utf-8"},{"id":"68a831b2-1686-5c8b-9699-37bf05986e7a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/68a831b2-1686-5c8b-9699-37bf05986e7a/attachment.md","path":"canonical/duendesoftware-com/identityserver/grant-validation-result.md","size":2224,"sha256":"d324b223dcbb39ad7df9a76694e999f04dd444376081983cee81271bdcd83cbf","contentType":"text/markdown; charset=utf-8"},{"id":"96fbbb6f-266f-52fb-80be-9c060ea96dcc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/96fbbb6f-266f-52fb-80be-9c060ea96dcc/attachment.md","path":"canonical/duendesoftware-com/identityserver/identity-provider-store.md","size":1585,"sha256":"c8a9bcb2a1f0db5374a317fe34fa91bfb885590ee0e4b22a1b14b6e5f3045fa7","contentType":"text/markdown; charset=utf-8"},{"id":"331fe4cc-e56b-5512-ae1b-a31ff3e8d9bd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/331fe4cc-e56b-5512-ae1b-a31ff3e8d9bd/attachment.md","path":"canonical/duendesoftware-com/identityserver/identity-provider.md","size":2850,"sha256":"702cf4c9e4bbf2718918cd719fc9e0123cfba4fb70eed2e792bd88716bf5658b","contentType":"text/markdown; charset=utf-8"},{"id":"5e121db6-ddff-5160-8e52-6105b9b7a9c2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5e121db6-ddff-5160-8e52-6105b9b7a9c2/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver-admin-ui.md","size":4575,"sha256":"cd9c085e2deab7db42430004aa2ddcac3ca2555e282b485c2d700d9919acfd57","contentType":"text/markdown; charset=utf-8"},{"id":"c9de3041-275a-5613-bbec-eb1218548178","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c9de3041-275a-5613-bbec-eb1218548178/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver-deployment.md","size":22255,"sha256":"ed2cdba4cf30e96f806b670ad5d0bcd68605f6ef1c5455615666351cc2e8b2d4","contentType":"text/markdown; charset=utf-8"},{"id":"9853e145-dc8f-551a-83bb-c8e3bc3f7392","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9853e145-dc8f-551a-83bb-c8e3bc3f7392/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver-interaction-service.md","size":7341,"sha256":"764ae12bab651b90c4a7c901df61ed59bbf31c9be2d77a1ccc0cfea963b8d3d7","contentType":"text/markdown; charset=utf-8"},{"id":"fc4e71c7-d018-5418-b4e3-61b556607e82","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fc4e71c7-d018-5418-b4e3-61b556607e82/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver-options.md","size":37292,"sha256":"14e929522ed87f3c38972cf9dcc55357e719c939bdb94f75558cd5748e835067","contentType":"text/markdown; charset=utf-8"},{"id":"d9058f58-9f6b-5b10-a45c-71b2201debc2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d9058f58-9f6b-5b10-a45c-71b2201debc2/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver-quickstarts.md","size":1705,"sha256":"692c11442593e8d0063e85d3cae748c8f823564650b952026eb62a588f34dfc4","contentType":"text/markdown; charset=utf-8"},{"id":"bed47942-13bf-56ec-8cbc-54c686781566","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bed47942-13bf-56ec-8cbc-54c686781566/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver4-to-duende-identityserver-migration-analysis-tool.md","size":5352,"sha256":"e5f670618e3fb15f1738709bafe0cd5090fde305b55e6102b458a3f929852bed","contentType":"text/markdown; charset=utf-8"},{"id":"d23cc41c-a3e6-56c3-85a2-a92da5982a9b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d23cc41c-a3e6-56c3-85a2-a92da5982a9b/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver4-to-duende-identityserver-v74.md","size":30069,"sha256":"bb0dabde161749af4fac13b2706960c466d804de5a5a0396b2be268a786499e1","contentType":"text/markdown; charset=utf-8"},{"id":"f5e5970c-9315-5b85-878d-3c4688da7012","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f5e5970c-9315-5b85-878d-3c4688da7012/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver4-v31-to-identityserver4-v41.md","size":7450,"sha256":"224b2163471448de852c6f350d50234f1f97eed4ab331a865ab94ebac9e39149","contentType":"text/markdown; charset=utf-8"},{"id":"f62d60df-fe28-52d9-9106-ccde0434a8df","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f62d60df-fe28-52d9-9106-ccde0434a8df/attachment.md","path":"canonical/duendesoftware-com/identityserver/identityserver4-v41-to-duende-identityserver-v6.md","size":11374,"sha256":"1d1fc07121b7b09904185999d6f2e740de8273f8a939183de4ec11d4bec4c101","contentType":"text/markdown; charset=utf-8"},{"id":"ae4bfb7a-48f1-576c-986d-774ca2c4701b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ae4bfb7a-48f1-576c-986d-774ca2c4701b/attachment.md","path":"canonical/duendesoftware-com/identityserver/interactive-applications-with-aspnet-core.md","size":26710,"sha256":"00789beb083e9d6ee5d19f78f9e28a5e144649aea6db965628d8be32ccf3fe62","contentType":"text/markdown; charset=utf-8"},{"id":"c3469e79-ce98-5ba3-8263-fdee3607061b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c3469e79-ce98-5ba3-8263-fdee3607061b/attachment.md","path":"canonical/duendesoftware-com/identityserver/javascript-applications-without-a-backend.md","size":13857,"sha256":"67587cce20293418df6dafbfd83011091a03faa74a943a61099ccdd451d4dcdf","contentType":"text/markdown; charset=utf-8"},{"id":"09dcc6a7-ab3c-59df-8246-e054bc34c567","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/09dcc6a7-ab3c-59df-8246-e054bc34c567/attachment.md","path":"canonical/duendesoftware-com/identityserver/logout-context.md","size":1979,"sha256":"2c5c9c819d0e128f964f40aeb2cc9214993495dca438c19b4366d1433fda75fc","contentType":"text/markdown; charset=utf-8"},{"id":"f0126f5f-f355-5ebf-8564-1b23890f8ca4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f0126f5f-f355-5ebf-8564-1b23890f8ca4/attachment.md","path":"canonical/duendesoftware-com/identityserver/multi-factor-authentication.md","size":1887,"sha256":"222d7be6dfa4ab22bd0e4bf6ad798494c9e867374a77c75eeb5b2c766aedd0dd","contentType":"text/markdown; charset=utf-8"},{"id":"3f135d0d-ed66-552c-8ab3-b3a6252a2e99","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3f135d0d-ed66-552c-8ab3-b3a6252a2e99/attachment.md","path":"canonical/duendesoftware-com/identityserver/operational-options.md","size":3234,"sha256":"4f814f225880fb44e6b6f6ecce868647e02aa42992d7ebfa6c5f958419e34c41","contentType":"text/markdown; charset=utf-8"},{"id":"f468b5e2-80a4-58d7-9785-de83b1b85117","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f468b5e2-80a4-58d7-9785-de83b1b85117/attachment.md","path":"canonical/duendesoftware-com/identityserver/overview.md","size":6002,"sha256":"6ef08f1910e311ac57e3773c2d4be218818958a4f6d2ecaa71f62d73a02b0693","contentType":"text/markdown; charset=utf-8"},{"id":"22ac124e-7e54-510d-81f1-3b14aeffa92c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/22ac124e-7e54-510d-81f1-3b14aeffa92c/attachment.md","path":"canonical/duendesoftware-com/identityserver/overview/resources.md","size":3301,"sha256":"dfc6a8747a37034934088e89b964dbdc3aaa5cd3b2281b9dba254baf82e9d333","contentType":"text/markdown; charset=utf-8"},{"id":"659f345e-49e2-518c-9b7f-6bfe240db956","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/659f345e-49e2-518c-9b7f-6bfe240db956/attachment.md","path":"canonical/duendesoftware-com/identityserver/overview/terminology.md","size":4955,"sha256":"bf44cf936990139d095cf27d851f2b79e0a29c345ae3def2bd29380960291cfb","contentType":"text/markdown; charset=utf-8"},{"id":"03d57501-c8e9-5845-83a3-99818d945192","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/03d57501-c8e9-5845-83a3-99818d945192/attachment.md","path":"canonical/duendesoftware-com/identityserver/profile-service.md","size":4818,"sha256":"8afec5184e310effcb454a66e6b9cb9eb915b0ad2cae29d274c872dd51a48176","contentType":"text/markdown; charset=utf-8"},{"id":"3e31e253-6901-5d65-a6b2-b30c8b2a4693","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3e31e253-6901-5d65-a6b2-b30c8b2a4693/attachment.md","path":"canonical/duendesoftware-com/identityserver/protecting-an-api-with-client-credentials.md","size":20451,"sha256":"bd25d4a099677e886c407766a5771a61d04f9c476e571d67269daf1be44757b0","contentType":"text/markdown; charset=utf-8"},{"id":"5bece920-ff22-578b-a094-4b119168e116","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5bece920-ff22-578b-a094-4b119168e116/attachment.md","path":"canonical/duendesoftware-com/identityserver/protecting-apis.md","size":4832,"sha256":"b7187b8f93ec14967354c398c9fca43091fdcc57330b85e7f87c376a1cea4c3f","contentType":"text/markdown; charset=utf-8"},{"id":"ff6daee7-7da8-5eb6-8f83-d4de322b9061","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ff6daee7-7da8-5eb6-8f83-d4de322b9061/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference-tokens.md","size":3436,"sha256":"e3518de6624cdb1b7031aa9458a4782ae8b81b9587839cedf987204074271f32","contentType":"text/markdown; charset=utf-8"},{"id":"f8c7c205-03ed-5bbf-9fc6-e370c779b2d4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f8c7c205-03ed-5bbf-9fc6-e370c779b2d4/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/dcr/models.md","size":42393,"sha256":"095c412928620e1d3b5fb40a814fbcd8e2c7e1a82f6114a0a4b4c9ed2cdd0084","contentType":"text/markdown; charset=utf-8"},{"id":"9a5e0fdb-8426-5a99-ba83-be4e0350d8ff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9a5e0fdb-8426-5a99-ba83-be4e0350d8ff/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/dcr/store.md","size":1386,"sha256":"41238ba271178069f7ba5de979fce4819847008acad86c5ae344629134d5a230","contentType":"text/markdown; charset=utf-8"},{"id":"9dd45ab0-e0b1-5872-8cff-5e98673fba5d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9dd45ab0-e0b1-5872-8cff-5e98673fba5d/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/dcr/validation.md","size":8629,"sha256":"64561f166e3a4ca0a520ea9f909318b6cde5ce17dbe191668580dd9712e2da1f","contentType":"text/markdown; charset=utf-8"},{"id":"c08cb5a8-ba02-5637-939d-7125d044ef28","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c08cb5a8-ba02-5637-939d-7125d044ef28/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/api-resource.md","size":2864,"sha256":"97e2cc966fb86d92510a94f12b0d6d3dec683b31abfe8e6472f4555db23f48c0","contentType":"text/markdown; charset=utf-8"},{"id":"fe4bfc68-4bfe-56d6-b7a2-aba8dd06faa3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fe4bfc68-4bfe-56d6-b7a2-aba8dd06faa3/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/api-scope.md","size":2050,"sha256":"108b6b6759dedf8f19cfae3d8531a611d69384671f69077dba04add3ddfab892","contentType":"text/markdown; charset=utf-8"},{"id":"77f51cd0-1d45-5555-99d1-4a33b2599cc1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/77f51cd0-1d45-5555-99d1-4a33b2599cc1/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/client.md","size":12280,"sha256":"963bdf042830a9150d8cb43b6846a93e7d362f08344218235b41c79b63b5d5fe","contentType":"text/markdown; charset=utf-8"},{"id":"82abbd6d-d5bc-5e85-9a93-862514f5656c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/82abbd6d-d5bc-5e85-9a93-862514f5656c/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/grant-validation-result.md","size":2241,"sha256":"54a5c103f465415a3034d85fd964920114f8ebc844b0990b09cb059fba6f59c6","contentType":"text/markdown; charset=utf-8"},{"id":"92c7a1d8-8670-5c2c-8183-a8e55fc16c57","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/92c7a1d8-8670-5c2c-8183-a8e55fc16c57/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/identity-resource.md","size":2204,"sha256":"c55513ad989de8128cf0ef7fef2435e68c26764e4278c564d51ab6af37c8c265","contentType":"text/markdown; charset=utf-8"},{"id":"c48c12b2-299f-52da-aec1-ce30bc272605","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c48c12b2-299f-52da-aec1-ce30bc272605/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/models/secrets.md","size":3519,"sha256":"4e067817ff1479e59ac33e3698c4dfa4a127a2c88d2adaa44cedf3494ac72675","contentType":"text/markdown; charset=utf-8"},{"id":"9cd1d82d-c7bc-5884-b57e-edd9941f205a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9cd1d82d-c7bc-5884-b57e-edd9941f205a/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/response-handling/authorize-interaction-response-generator.md","size":2370,"sha256":"60a3f4bec6fc38a8faef2d46e99d3046f1cd4762dd030e6d17e528e8aea4ff9c","contentType":"text/markdown; charset=utf-8"},{"id":"d12457a7-94fa-59eb-86f3-a4907f317591","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d12457a7-94fa-59eb-86f3-a4907f317591/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/device-flow-interaction-service.md","size":1984,"sha256":"a8d39d738e0ebc517a2f736dda1c340a639dbb6311cc8179317f42f733215731","contentType":"text/markdown; charset=utf-8"},{"id":"db032320-472c-5a60-a8ec-8d0226f2a443","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/db032320-472c-5a60-a8ec-8d0226f2a443/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/persisted-grant-service.md","size":3092,"sha256":"9806672f808a125d77de8bb36fe4443b044b0c596a2074fd337957d59cd25cc7","contentType":"text/markdown; charset=utf-8"},{"id":"291c52ac-4b82-5e38-b159-e1da34288b1a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/291c52ac-4b82-5e38-b159-e1da34288b1a/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/profile-service.md","size":4837,"sha256":"bf899761f4c63aeb8c9f2ecfc0319b95fb5898c830a5b96f14fdabe6d679fdd0","contentType":"text/markdown; charset=utf-8"},{"id":"48e54e8f-4652-54bf-8990-a510e3cc7abd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/48e54e8f-4652-54bf-8990-a510e3cc7abd/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/refresh-token-service.md","size":3198,"sha256":"867e4a0023af206a3c9572cc8d2a9d912c727b91c24b42986b751c944b84d1d0","contentType":"text/markdown; charset=utf-8"},{"id":"ece688e2-54f4-555c-b7af-87e0b9188f63","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ece688e2-54f4-555c-b7af-87e0b9188f63/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/session-management-service.md","size":4283,"sha256":"4639ef81c7ab64b0d0fd5e70187fb81cb45b0fabce711a33c114c255790fc7d2","contentType":"text/markdown; charset=utf-8"},{"id":"d3ef95bd-169d-58de-b17b-d3ef2c49197f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d3ef95bd-169d-58de-b17b-d3ef2c49197f/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/token-creation-service.md","size":3397,"sha256":"ada4f7b78172864677acf9311d59f8686971bba4958c2ea46ab23ee6c1d5f654","contentType":"text/markdown; charset=utf-8"},{"id":"2b0dee45-a1af-501d-b652-9a30f377a20b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2b0dee45-a1af-501d-b652-9a30f377a20b/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/services/user-session-service.md","size":4305,"sha256":"1e6e784a899d68dccad4ce1a005441104f845d80b135008f83cca336bb3a393d","contentType":"text/markdown; charset=utf-8"},{"id":"f154c1ed-e979-547c-975f-27e0ed49869c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f154c1ed-e979-547c-975f-27e0ed49869c/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores.md","size":1219,"sha256":"5aaf54b85eec2fbcd0eba22dd85cf74ed58677ea2e8a3329bddf1e272759ea91","contentType":"text/markdown; charset=utf-8"},{"id":"dfa77c50-11b2-50f5-a7dd-d2fbcc04cd85","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dfa77c50-11b2-50f5-a7dd-d2fbcc04cd85/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/client-store.md","size":1737,"sha256":"acd946840c84bf7ee2aba26cf070a0ed6de0a18fd6a9a8228fff6ce7d77cc8f6","contentType":"text/markdown; charset=utf-8"},{"id":"1e6348a4-676b-54ef-917f-5db636cb22af","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1e6348a4-676b-54ef-917f-5db636cb22af/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/cors-policy-service.md","size":1128,"sha256":"b75dd86fc048e37f6b2ad0b0cab05d5bb0d81da5c8ad917460a4553870ecaa59","contentType":"text/markdown; charset=utf-8"},{"id":"c9520e90-ff5f-5695-881c-7c4bae36cf08","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c9520e90-ff5f-5695-881c-7c4bae36cf08/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/device-flow-store.md","size":4725,"sha256":"fb653c52c7b3a689fdcb213b8730ce57999547adc6d3854e39e5031349ea66be","contentType":"text/markdown; charset=utf-8"},{"id":"17e5c3d6-b140-5b84-9711-7ae24833d01e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/17e5c3d6-b140-5b84-9711-7ae24833d01e/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/persisted-grant-store.md","size":12174,"sha256":"da9b54fd51191e4e98fde3950c764fb515e603c73a412a4ec11a233441b6ac17","contentType":"text/markdown; charset=utf-8"},{"id":"881340fb-7dcb-553c-a2a6-40d2a44ea703","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/881340fb-7dcb-553c-a2a6-40d2a44ea703/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/pushed-authorization-request-store.md","size":4012,"sha256":"1d4cc9826dc4e4fc7b5054cb71789015fda5d0d7bb2ba62684919cff6af3d5ae","contentType":"text/markdown; charset=utf-8"},{"id":"26379880-3f80-521c-ada5-4ed560e94a05","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/26379880-3f80-521c-ada5-4ed560e94a05/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/resource-store.md","size":1707,"sha256":"854bc8aac82e71bff8ce9ba5246ede86e69d39625122196ad3772f269483d550","contentType":"text/markdown; charset=utf-8"},{"id":"33809a03-ebc7-5a88-84f4-e264664ae4ca","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/33809a03-ebc7-5a88-84f4-e264664ae4ca/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/saml-service-provider-store.md","size":2267,"sha256":"ba6c2d7a00e35cd31131623076ff30807deee94725dc6a55e13b0206c4a3f581","contentType":"text/markdown; charset=utf-8"},{"id":"7ab0f9bb-2c7f-5a89-bf3d-3f3408a4a0d6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7ab0f9bb-2c7f-5a89-bf3d-3f3408a4a0d6/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/stores/signing-key-store.md","size":2695,"sha256":"bf660c1133d607f5fa3137b1f2012dc9d9c2a4efcfdd56d58d2e3630859cbf9a","contentType":"text/markdown; charset=utf-8"},{"id":"4b551d26-821d-5bde-9e68-1253daf23844","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b551d26-821d-5bde-9e68-1253daf23844/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/validators/custom-authorize-request-validator.md","size":1560,"sha256":"e44854cb9a01595d6b7c9209f18f394348fd16df54271a9d8fb311f583207a38","contentType":"text/markdown; charset=utf-8"},{"id":"347433fb-9664-5030-8c64-eb38280b6a98","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/347433fb-9664-5030-8c64-eb38280b6a98/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/validators/custom-token-request-validator.md","size":1833,"sha256":"13999c258207a8f82937289848808f9e3c706c3d139a9ec468caeb7201525a1c","contentType":"text/markdown; charset=utf-8"},{"id":"707f0bf6-d099-5aca-9cea-0b9096178695","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/707f0bf6-d099-5aca-9cea-0b9096178695/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/validators/dpop-proof-validator.md","size":3404,"sha256":"c811791bd86dc8d7bfc413a8b5908a54bc62587a1a6b95f025b274006284b02b","contentType":"text/markdown; charset=utf-8"},{"id":"b5a766a4-6e0c-56c3-83ac-3231e8da0870","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b5a766a4-6e0c-56c3-83ac-3231e8da0870/attachment.md","path":"canonical/duendesoftware-com/identityserver/reference/validators/extension-grant-validator.md","size":1868,"sha256":"278af77a3306f947af7a4a6e85b893427ad0fa400169fc67fd264fbb4174cef9","contentType":"text/markdown; charset=utf-8"},{"id":"a3fc3b74-aeee-5bdb-a49a-432ccf4847b8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a3fc3b74-aeee-5bdb-a49a-432ccf4847b8/attachment.md","path":"canonical/duendesoftware-com/identityserver/requesting-a-token.md","size":8804,"sha256":"d493e95f73569c5e7ad19b859388042845c4bda5f351b382a48c42cb7c6ad6f5","contentType":"text/markdown; charset=utf-8"},{"id":"a76d8d66-8c35-50bb-97c2-88ef5d407f2c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a76d8d66-8c35-50bb-97c2-88ef5d407f2c/attachment.md","path":"canonical/duendesoftware-com/identityserver/requesting-tokens.md","size":5053,"sha256":"29bb85b93c187f0898650170c4864fe606151a0fa34dc1758cfc9de8162f6f56","contentType":"text/markdown; charset=utf-8"},{"id":"f76685fe-a0b4-5005-be5d-163a32aaa037","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f76685fe-a0b4-5005-be5d-163a32aaa037/attachment.md","path":"canonical/duendesoftware-com/identityserver/resources.md","size":3292,"sha256":"1b69977284f0daf9541962ed2f6a1a382b356e13840ea754689816a9fe5187a2","contentType":"text/markdown; charset=utf-8"},{"id":"53391cca-914c-5e68-a580-bab240401fe7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/53391cca-914c-5e68-a580-bab240401fe7/attachment.md","path":"canonical/duendesoftware-com/identityserver/returning-to-the-client.md","size":1475,"sha256":"dab4755fbb354f5a4d0506d85c5f463cd314d9304cbac79626f0f1dbded0f5e4","contentType":"text/markdown; charset=utf-8"},{"id":"5e61d98f-c1a8-55cd-be31-b881a4cf85cf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5e61d98f-c1a8-55cd-be31-b881a4cf85cf/attachment.md","path":"canonical/duendesoftware-com/identityserver/samples/basics.md","size":6985,"sha256":"6f0110fd6db162d6a8d7bb2d663c7113c4dbec395051d2e79f9fa40988e1a8a0","contentType":"text/markdown; charset=utf-8"},{"id":"c72e45f4-f64d-5fe6-a337-8cd55d647105","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c72e45f4-f64d-5fe6-a337-8cd55d647105/attachment.md","path":"canonical/duendesoftware-com/identityserver/samples/clients.md","size":3814,"sha256":"c4fd501520c6744bbc0e8c8553b534910cca7e5d5956bc2b0f3e3d3eda79542d","contentType":"text/markdown; charset=utf-8"},{"id":"cdc056cb-0267-546e-b7cb-c2aca9ed80d1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cdc056cb-0267-546e-b7cb-c2aca9ed80d1/attachment.md","path":"canonical/duendesoftware-com/identityserver/server-side-session-store.md","size":6280,"sha256":"9ab40b62d9b47d2f3655b22041839013c01f733b6a5401ef898993b5e45b92a8","contentType":"text/markdown; charset=utf-8"},{"id":"68babc87-3c45-53ad-879c-de5b496d6453","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/68babc87-3c45-53ad-879c-de5b496d6453/attachment.md","path":"canonical/duendesoftware-com/identityserver/session-management-service.md","size":4264,"sha256":"427ffee97b3cf31989bf213c3933ab798f30aaf5de9a4af443d65c09f16ebd66","contentType":"text/markdown; charset=utf-8"},{"id":"523c8d30-c371-5cc6-9bf5-cb6c67fc23c5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/523c8d30-c371-5cc6-9bf5-cb6c67fc23c5/attachment.md","path":"canonical/duendesoftware-com/identityserver/token-management.md","size":5997,"sha256":"afcf0cd0953cfedd11f2d68e5beec5a8884b51c4405375d89521bf4c3c987719","contentType":"text/markdown; charset=utf-8"},{"id":"71826505-fff4-5d22-9b68-0501f05c5975","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/71826505-fff4-5d22-9b68-0501f05c5975/attachment.md","path":"canonical/duendesoftware-com/identityserver/tokens/client-authentication.md","size":20293,"sha256":"26f6d8fd44215cd9f674f4e8fa243a4189c2acce3cc803e43b36ae447659f120","contentType":"text/markdown; charset=utf-8"},{"id":"8bc288e6-9f3b-5652-a809-9edcf231241a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8bc288e6-9f3b-5652-a809-9edcf231241a/attachment.md","path":"canonical/duendesoftware-com/identityserver/tokens/extension-grants.md","size":7760,"sha256":"13ecdbadddc6d2032539121b0c914c361463aa23bb1ac5f622853d65c3a1e3b3","contentType":"text/markdown; charset=utf-8"},{"id":"43dca8d8-ae3b-5eed-8c67-68c656f638c6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/43dca8d8-ae3b-5eed-8c67-68c656f638c6/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/consent.md","size":4302,"sha256":"8fd7201ce549a23b4c735fcf4ffe250ccaa2a0d7f7f54ec555f6755c5d4f1ec0","contentType":"text/markdown; charset=utf-8"},{"id":"19f481d8-45a5-544b-a120-fb4b33004180","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/19f481d8-45a5-544b-a120-fb4b33004180/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/error.md","size":1898,"sha256":"5e15554431a00d904ad981d4c29eb1e7a73749d55886987ec9a1520dff8d281f","contentType":"text/markdown; charset=utf-8"},{"id":"0f1d21be-a480-5e71-9a25-3d9e7d132345","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0f1d21be-a480-5e71-9a25-3d9e7d132345/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/logout/logout-context.md","size":1989,"sha256":"79aee62421f12a6b53c752258dde26219c493a71f00254bce19688374952189b","contentType":"text/markdown; charset=utf-8"},{"id":"ec3eda96-9680-5a3e-97cd-c8da5350a4d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ec3eda96-9680-5a3e-97cd-c8da5350a4d8/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/server-side-sessions/inactivity-timeout.md","size":7542,"sha256":"82e233c934adeb5ff1f2b576e2c9beb0a11c64527185aa0fac23bbfb6ecf5900","contentType":"text/markdown; charset=utf-8"},{"id":"e34775bd-3ae8-56b7-a442-7186adb79283","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e34775bd-3ae8-56b7-a442-7186adb79283/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/server-side-sessions/session-expiration.md","size":3542,"sha256":"d68f8aec2ee26108d0cc1fa829dcceb8cfb6cae3666ef5eab757f6da5bfbbe55","contentType":"text/markdown; charset=utf-8"},{"id":"4fef9fec-e162-521d-bee8-f976c944eb84","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4fef9fec-e162-521d-bee8-f976c944eb84/attachment.md","path":"canonical/duendesoftware-com/identityserver/ui/server-side-sessions/session-management.md","size":7068,"sha256":"e1a160be7113ab44ba0f90eef6308d6e929be1a0f16f89a47dfb06309113db70","contentType":"text/markdown; charset=utf-8"},{"id":"8fd1bb4a-68f3-55bf-8c4f-2b71ad6d98a1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8fd1bb4a-68f3-55bf-8c4f-2b71ad6d98a1/attachment.md","path":"canonical/duendesoftware-com/identityserver/upgrading-identityserver.md","size":4751,"sha256":"7d6761b37b04a837d6a9ab7439e24d57b6d2c39db813f44f7a23c16c7d1fe3b4","contentType":"text/markdown; charset=utf-8"},{"id":"3dd0151a-f78e-5209-8c46-a14575ded227","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3dd0151a-f78e-5209-8c46-a14575ded227/attachment.md","path":"canonical/duendesoftware-com/identityserver/user-interaction.md","size":8578,"sha256":"bb0aec61d870bbeabe7362c76c6f7c720cca0fa4bfbd92cd15ce2460365efd3e","contentType":"text/markdown; charset=utf-8"},{"id":"78d31650-580a-5176-8a38-c1b7c8258e65","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/78d31650-580a-5176-8a38-c1b7c8258e65/attachment.md","path":"canonical/duendesoftware-com/identityserver/validating-proof-of-possession.md","size":7257,"sha256":"cdaeefd442ec0e1f3d2514f2269f622cb65e96bbc8e7bf7fde9404f87f6342a7","contentType":"text/markdown; charset=utf-8"},{"id":"4f8a1278-df9a-5c0d-b61c-e4bfb737e3c2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4f8a1278-df9a-5c0d-b61c-e4bfb737e3c2/attachment.md","path":"canonical/duendesoftware-com/ihttpresponsewriter.md","size":1922,"sha256":"04ffe97f6023dac3f3e6b47beb7351d058e8adf10b2460686d8bfe86fd4588aa","contentType":"text/markdown; charset=utf-8"},{"id":"afc21f8d-c34b-5b55-94e5-60efea448247","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/afc21f8d-c34b-5b55-94e5-60efea448247/attachment.md","path":"canonical/duendesoftware-com/inactivity-timeout.md","size":7503,"sha256":"770a6458f8b4bccdb680fb4381d4b0a2cd3e267163928004479f571794746525","contentType":"text/markdown; charset=utf-8"},{"id":"49bb33da-e117-54ff-9e90-69c37a69af58","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/49bb33da-e117-54ff-9e90-69c37a69af58/attachment.md","path":"canonical/duendesoftware-com/integrating-with-external-providers.md","size":17992,"sha256":"cd96fbbc9bab79cb82c4480b944a83b3a259960e4841789333ab4003746ee72a","contentType":"text/markdown; charset=utf-8"},{"id":"5989d2d0-c722-5f6f-94d7-0f3c2f86d414","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5989d2d0-c722-5f6f-94d7-0f3c2f86d414/attachment.md","path":"canonical/duendesoftware-com/introspection/configuring-oauth-20-token-introspection.md","size":6213,"sha256":"cd55d8194c58b17fd6121da345679997089b1f1c63a112b411b1b2d91389b9a2","contentType":"text/markdown; charset=utf-8"},{"id":"3a3126bd-4e92-5b31-9848-9aec5c64937e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3a3126bd-4e92-5b31-9848-9aec5c64937e/attachment.md","path":"canonical/duendesoftware-com/introspection/duende-introspection-authentication-handler.md","size":4414,"sha256":"d8b217551ee3324791981231d9f6e10a64535ba931834af79b7b546997ebbeed","contentType":"text/markdown; charset=utf-8"},{"id":"e1688948-b4b9-567e-83fd-82f513766ec5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e1688948-b4b9-567e-83fd-82f513766ec5/attachment.md","path":"canonical/duendesoftware-com/introspection/introspection-endpoint.md","size":4094,"sha256":"ee8938e694f747caa29827dbe796804ae04bd6bd7d940a3d83edeac61e487130","contentType":"text/markdown; charset=utf-8"},{"id":"9ef2b00f-c286-5702-bef6-529e7e67dc0b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9ef2b00f-c286-5702-bef6-529e7e67dc0b/attachment.md","path":"canonical/duendesoftware-com/introspection/token-introspection-endpoint.md","size":7377,"sha256":"8921a3953c53f26a19f3e6aa5fa656b6703efde600a11c151e7d8733d1529be9","contentType":"text/markdown; charset=utf-8"},{"id":"bb567aff-a2ce-5b5e-9d97-59ca2075b520","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bb567aff-a2ce-5b5e-9d97-59ca2075b520/attachment.md","path":"canonical/duendesoftware-com/issuing-internal-tokens.md","size":1237,"sha256":"af503b3209e2652d4e1c6f35839e78c2ed8b1761f84f1f2cd8badcb0c9ff0608","contentType":"text/markdown; charset=utf-8"},{"id":"61e5353a-94e4-5df7-aca4-2837f7acf628","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/61e5353a-94e4-5df7-aca4-2837f7acf628/attachment.md","path":"canonical/duendesoftware-com/issuing-tokens-based-on-user-passwords.md","size":3279,"sha256":"84e710547c931800f71012d9af9f2422c99b9345794f2f475e5893d8f578a6e4","contentType":"text/markdown; charset=utf-8"},{"id":"a685b117-8704-500c-99d0-dc16e285a253","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a685b117-8704-500c-99d0-dc16e285a253/attachment.md","path":"canonical/duendesoftware-com/key-management.md","size":19919,"sha256":"d6f03d52a143cb3fd5da1cbff72582923782291e8a1adfe4e6ce531be9afb676","contentType":"text/markdown; charset=utf-8"},{"id":"c0593510-63f0-5f62-8f15-91a3d85a9529","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c0593510-63f0-5f62-8f15-91a3d85a9529/attachment.md","path":"canonical/duendesoftware-com/licensing.md","size":16722,"sha256":"e3040cf6cfad831c28ed442534a13ec0a5121e660dcb34495f56683c79032e72","contentType":"text/markdown; charset=utf-8"},{"id":"a6e1587f-c28c-54f2-ab3e-d561d7ac78ac","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a6e1587f-c28c-54f2-ab3e-d561d7ac78ac/attachment.md","path":"canonical/duendesoftware-com/logging-fundamentals.md","size":5207,"sha256":"d12df5cef68a2f49c31fd9b49083fce5e0c0025ba3f7d108a8f0441f63bf1cb8","contentType":"text/markdown; charset=utf-8"},{"id":"72e68b11-bfa1-537b-b56c-efde8d81b8ac","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/72e68b11-bfa1-537b-b56c-efde8d81b8ac/attachment.md","path":"canonical/duendesoftware-com/logging.md","size":1494,"sha256":"0d7a9074f07c6ed3ed3c62ec0eea71802772edec7691ff33474b0516098990d2","contentType":"text/markdown; charset=utf-8"},{"id":"83e53301-0066-5685-aaa4-f43cecba980b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/83e53301-0066-5685-aaa4-f43cecba980b/attachment.md","path":"canonical/duendesoftware-com/login-context.md","size":1574,"sha256":"7f616a8356503625f99eab77a260480e183a678773f40298e90d9930d65bffd8","contentType":"text/markdown; charset=utf-8"},{"id":"8a32dc48-e8b0-522c-b823-a479eee80307","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8a32dc48-e8b0-522c-b823-a479eee80307/attachment.md","path":"canonical/duendesoftware-com/microsoft-spa-and-blazor-templates.md","size":10895,"sha256":"dd437a55d463b1e73c42462fea370d177ca4ea02e1d0cc94328ffcfeffbd9462","contentType":"text/markdown; charset=utf-8"},{"id":"f6fd55a9-aedf-5788-9820-a5b1500d2393","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f6fd55a9-aedf-5788-9820-a5b1500d2393/attachment.md","path":"canonical/duendesoftware-com/miscellaneous.md","size":4640,"sha256":"3a34f87bf140b6f86ebbddeb99141f5f209d7fdd5babc779897b077a1e31a941","contentType":"text/markdown; charset=utf-8"},{"id":"6c5332e6-9171-54dc-81fb-d609eb96637e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6c5332e6-9171-54dc-81fb-d609eb96637e/attachment.md","path":"canonical/duendesoftware-com/models.md","size":42364,"sha256":"412d9b66c4cdb31a44cdaabc1c24508eac9411ee477cb9a52fdce896f42f867a","contentType":"text/markdown; charset=utf-8"},{"id":"60d7426d-198a-59b1-8239-11b66701fcb1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/60d7426d-198a-59b1-8239-11b66701fcb1/attachment.md","path":"canonical/duendesoftware-com/more-reading-resources.md","size":1985,"sha256":"d15b3455743a1525e59016f83bb012f3a04438e74026df738d6cf03ea8b8c665","contentType":"text/markdown; charset=utf-8"},{"id":"3f2f9699-b012-5303-9e21-603fe526ba5f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3f2f9699-b012-5303-9e21-603fe526ba5f/attachment.md","path":"canonical/duendesoftware-com/multi-frontend-support.md","size":7723,"sha256":"2318202ae1eabe697f00a6483198d89935c6b4e671195c283f23ad47c187f7d0","contentType":"text/markdown; charset=utf-8"},{"id":"6f267f89-1257-5500-9cae-d2ff896aa7bf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6f267f89-1257-5500-9cae-d2ff896aa7bf/attachment.md","path":"canonical/duendesoftware-com/multi-frontend.md","size":10765,"sha256":"8b82e1e949920cffd56023188beb57d36bad281116bf08739e4a5f81a2f35b1e","contentType":"text/markdown; charset=utf-8"},{"id":"4eb803db-c985-569c-95ca-ee99ffcad091","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4eb803db-c985-569c-95ca-ee99ffcad091/attachment.md","path":"canonical/duendesoftware-com/oauth-metadata-endpoint.md","size":1286,"sha256":"531c5fbc1d40a9566253af74c6248b9679d2dafd52c492080dc5b2acf74f3f14","contentType":"text/markdown; charset=utf-8"},{"id":"71df303c-1c5c-5fe4-b4a5-8911af5370fa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/71df303c-1c5c-5fe4-b4a5-8911af5370fa/attachment.md","path":"canonical/duendesoftware-com/openid-connect-prompts.md","size":3726,"sha256":"2f1321ea39d27b8288d9d966aebffb0a02bb2a560b0e30d870a26b4f334aa877","contentType":"text/markdown; charset=utf-8"},{"id":"8589f937-cf99-5950-a0da-92a5255c24a9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8589f937-cf99-5950-a0da-92a5255c24a9/attachment.md","path":"canonical/duendesoftware-com/opentelemetry.md","size":22050,"sha256":"f6ded55ccedfb50ecd0f6658bd65052c74f15dd4a44d3e3a41e41185c3944f1d","contentType":"text/markdown; charset=utf-8"},{"id":"c303b9ad-1b92-5d6d-b1c9-5460d4b899d9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c303b9ad-1b92-5d6d-b1c9-5460d4b899d9/attachment.md","path":"canonical/duendesoftware-com/operational-data.md","size":8397,"sha256":"229a1ce22d4185833e0d63473716dd671e9056548b3f9c609f8726c359b5834f","contentType":"text/markdown; charset=utf-8"},{"id":"3a3bc39d-d0b0-59a5-8c81-07a60149684b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3a3bc39d-d0b0-59a5-8c81-07a60149684b/attachment.md","path":"canonical/duendesoftware-com/options.md","size":2167,"sha256":"52c5709f00d433f4563b515de52ecad764f2bcccf8e8060b6c1961121fc7ce41","contentType":"text/markdown; charset=utf-8"},{"id":"272edbbe-6585-56c2-ab94-b8e8dd98c0cf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/272edbbe-6585-56c2-ab94-b8e8dd98c0cf/attachment.md","path":"canonical/duendesoftware-com/packaging-and-builds.md","size":10860,"sha256":"41cb71d7b3bcfb82aa9201982813799824b1e25235d9b4b8dfb0d98487bcf59a","contentType":"text/markdown; charset=utf-8"},{"id":"5bf36f4e-d5c3-543f-80ae-6cd106a6d6e3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5bf36f4e-d5c3-543f-80ae-6cd106a6d6e3/attachment.md","path":"canonical/duendesoftware-com/persisted-grant-service.md","size":3058,"sha256":"ba2f45785f1150daf944c94f58c77e6e710b79598d7b9da6ac26a64049cf349c","contentType":"text/markdown; charset=utf-8"},{"id":"2f4d2e65-dde2-511e-b0f9-1576697e5d69","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2f4d2e65-dde2-511e-b0f9-1576697e5d69/attachment.md","path":"canonical/duendesoftware-com/persisted-grant-store.md","size":11988,"sha256":"0255530889b3481cd1ba4ca6f84539abdd57c24363541d80c9bbc7a9c469366f","contentType":"text/markdown; charset=utf-8"},{"id":"ec09459f-e163-58e5-8356-970b3632a7b5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ec09459f-e163-58e5-8356-970b3632a7b5/attachment.md","path":"canonical/duendesoftware-com/proof-of-possession-access-tokens.md","size":11050,"sha256":"6606738c0870f300aeae50f38469aec32242847bb38d61d7bd3dc86a69f5035e","contentType":"text/markdown; charset=utf-8"},{"id":"a125b7b5-7abf-5fae-92ac-58e86b43f01a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a125b7b5-7abf-5fae-92ac-58e86b43f01a/attachment.md","path":"canonical/duendesoftware-com/protocol-and-claim-type-constants.md","size":52884,"sha256":"2e80fb930a49bf74b8bf545df8b5390a66730da32247ab8dc98e5576cfc9fad3","contentType":"text/markdown; charset=utf-8"},{"id":"ba502a6b-1901-5860-8ec9-58bce214a82c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ba502a6b-1901-5860-8ec9-58bce214a82c/attachment.md","path":"canonical/duendesoftware-com/proxying-remote-apis.md","size":8566,"sha256":"c89f9c4be2d3f4a5865a9bd12af1f5575f1216702e36be781c5cfb0d4a6295de","contentType":"text/markdown; charset=utf-8"},{"id":"dd173038-4ee1-53f9-9336-fd0bcb838c69","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dd173038-4ee1-53f9-9336-fd0bcb838c69/attachment.md","path":"canonical/duendesoftware-com/pushed-authorization-request-store.md","size":3743,"sha256":"4806c0d06629059d79bcd5cecc4e334c2c683b65639c812447e7e266a70b3cfb","contentType":"text/markdown; charset=utf-8"},{"id":"fa795eee-a74d-59df-8802-7a4c3461034c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fa795eee-a74d-59df-8802-7a4c3461034c/attachment.md","path":"canonical/duendesoftware-com/pushed-authorization-requests.md","size":6831,"sha256":"a10b4433d6615656c27dd9edce05588ec7ef91be14a384ab43f31b26fb0be94c","contentType":"text/markdown; charset=utf-8"},{"id":"b2924b34-999f-575c-961e-b8b5bcde2679","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b2924b34-999f-575c-961e-b8b5bcde2679/attachment.md","path":"canonical/duendesoftware-com/quick-links.md","size":742,"sha256":"2b7d516b65e9059a256e439b64ba41c410116518d551c5fad70d5c6743fad2a3","contentType":"text/markdown; charset=utf-8"},{"id":"b62a4a5e-61b2-5c4a-9245-60d023a01c98","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b62a4a5e-61b2-5c4a-9245-60d023a01c98/attachment.md","path":"canonical/duendesoftware-com/redirecting-back-to-the-client.md","size":2075,"sha256":"1acb8de082e12d1693aa6f6241fbd4a479d3f6e9ece60cc95781d180aada500c","contentType":"text/markdown; charset=utf-8"},{"id":"8e9e435d-6bad-5236-ace1-3fa9a394b0de","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8e9e435d-6bad-5236-ace1-3fa9a394b0de/attachment.md","path":"canonical/duendesoftware-com/refresh-token-service.md","size":3164,"sha256":"dbebb718b63068f2159900ea19f40ab11450d4a24a67a005fa18b0195414d4e0","contentType":"text/markdown; charset=utf-8"},{"id":"32ce0d0a-5e7b-5491-a7a7-9a00449732c8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/32ce0d0a-5e7b-5491-a7a7-9a00449732c8/attachment.md","path":"canonical/duendesoftware-com/refreshing-a-token.md","size":10981,"sha256":"3941c2abd3682953eca43d0e4819a4323796cd71d6ea1d8c087f245d86f22a90","contentType":"text/markdown; charset=utf-8"},{"id":"5543aab4-1ea7-583e-9e78-3fca168677f7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5543aab4-1ea7-583e-9e78-3fca168677f7/attachment.md","path":"canonical/duendesoftware-com/request-processing.md","size":4579,"sha256":"198770deb509e236bbbc068476143da359b60bca9466465d896bf35cccec4cf9","contentType":"text/markdown; charset=utf-8"},{"id":"7dd355b8-ce7c-5079-b86f-9f73faab930c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7dd355b8-ce7c-5079-b86f-9f73faab930c/attachment.md","path":"canonical/duendesoftware-com/requesting-tokens.md","size":1889,"sha256":"312927719fda7d3152818766f98bb10688a3d7afb534623fb64a5ba83baed2c1","contentType":"text/markdown; charset=utf-8"},{"id":"452befa5-ca36-57b0-917e-fb08a9714f18","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/452befa5-ca36-57b0-917e-fb08a9714f18/attachment.md","path":"canonical/duendesoftware-com/resource-isolation.md","size":8836,"sha256":"8e1d4bb0511a9f6f1e43c5a49ebb960626454b072282488fdc0f3b8cb1eec794","contentType":"text/markdown; charset=utf-8"},{"id":"93dbebf9-1b92-58a5-b887-84fe8888b7c0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/93dbebf9-1b92-58a5-b887-84fe8888b7c0/attachment.md","path":"canonical/duendesoftware-com/resource-store.md","size":1567,"sha256":"633a920e2036465afbcc810cf06f852193a58c0d27ed08f81aacee863bdae47c","contentType":"text/markdown; charset=utf-8"},{"id":"b19bbc4f-f53f-58ba-9fa3-6cee502a3772","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b19bbc4f-f53f-58ba-9fa3-6cee502a3772/attachment.md","path":"canonical/duendesoftware-com/response-generation.md","size":2537,"sha256":"77146f333e5ec7c293db6908ff9e30fc42ac5fec07bc2715b571458f85f4cb11","contentType":"text/markdown; charset=utf-8"},{"id":"5a93836d-8c94-5f88-90e6-d37e309f68a0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5a93836d-8c94-5f88-90e6-d37e309f68a0/attachment.md","path":"canonical/duendesoftware-com/response-generators.md","size":1288,"sha256":"652eca4120faef7c1e7d4b88deaaef8a18abc087a6682f5316fc7de99e9a64f8","contentType":"text/markdown; charset=utf-8"},{"id":"e6265a61-0fe3-5100-9546-31380ebe0736","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e6265a61-0fe3-5100-9546-31380ebe0736/attachment.md","path":"canonical/duendesoftware-com/revocation-endpoint.md","size":1429,"sha256":"51cc2eb182c42385ebdcf351ae2608f6ecfd503a5aaa834e4ace172226d4dd97","contentType":"text/markdown; charset=utf-8"},{"id":"3f4856a2-6b1d-52cf-927f-5ce54b0d8f09","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3f4856a2-6b1d-52cf-927f-5ce54b0d8f09/attachment.md","path":"canonical/duendesoftware-com/saml-20-identity-provider.md","size":3338,"sha256":"0ebd66d935c606159e17abbcdd979f7122fce81191531ddb7e95b4f987558c07","contentType":"text/markdown; charset=utf-8"},{"id":"b5c048c5-1cf7-59aa-a64e-16b019fbc845","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b5c048c5-1cf7-59aa-a64e-16b019fbc845/attachment.md","path":"canonical/duendesoftware-com/saml-configuration.md","size":10287,"sha256":"a21eef24297cbfdfca4f6dfa73070b5bb3879b4b37947c029e6245aed8243445","contentType":"text/markdown; charset=utf-8"},{"id":"8f4362a0-fc00-5f19-b1ff-3b74cf56a486","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8f4362a0-fc00-5f19-b1ff-3b74cf56a486/attachment.md","path":"canonical/duendesoftware-com/saml-endpoints.md","size":5136,"sha256":"cfef1c8b52fd705a706753f1643ac1dce21c862eb163e834ec8b5bed75eaa2dc","contentType":"text/markdown; charset=utf-8"},{"id":"202870cb-0300-5f12-8b2d-d95a4ea5e855","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/202870cb-0300-5f12-8b2d-d95a4ea5e855/attachment.md","path":"canonical/duendesoftware-com/saml-extensibility.md","size":6054,"sha256":"6e30f3875648bac914b312e7981f765109ca8e6202d25302b3a481fd10bd0604","contentType":"text/markdown; charset=utf-8"},{"id":"ae1f4a09-87de-599b-ae30-0e09e2ec28e6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ae1f4a09-87de-599b-ae30-0e09e2ec28e6/attachment.md","path":"canonical/duendesoftware-com/secrets.md","size":3487,"sha256":"eda3064de533602850d72f615728512082526a70922ddbf157039243d8278678","contentType":"text/markdown; charset=utf-8"},{"id":"0deee5ff-594d-51ca-80e8-5059b81254b7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0deee5ff-594d-51ca-80e8-5059b81254b7/attachment.md","path":"canonical/duendesoftware-com/securing-and-accessing-api-endpoints.md","size":1230,"sha256":"53c270f2ec92fd5ece2f5cebbcaae82b0eb2a7d98b6d0278336768a8f535fcc5","contentType":"text/markdown; charset=utf-8"},{"id":"2dd44d26-edbf-5c90-b8d9-7c5be4987e5d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2dd44d26-edbf-5c90-b8d9-7c5be4987e5d/attachment.md","path":"canonical/duendesoftware-com/security-best-practices.md","size":8679,"sha256":"948f5bbf78b77499a56b51c65fff897752029ca6bbe8b8d0632b1714d6d20fa8","contentType":"text/markdown; charset=utf-8"},{"id":"68fdaa94-5d9f-5e5e-bf6e-ae9883b56612","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/68fdaa94-5d9f-5e5e-bf6e-ae9883b56612/attachment.md","path":"canonical/duendesoftware-com/server-side-sessions.md","size":7567,"sha256":"daf7a747631d6e7c76db24bc6c03634cf2a1c3ab89ce646f0f038d67bf6c340d","contentType":"text/markdown; charset=utf-8"},{"id":"3bfe25d6-b034-5dba-bea1-02afddf37b02","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3bfe25d6-b034-5dba-bea1-02afddf37b02/attachment.md","path":"canonical/duendesoftware-com/session-cleanup-and-logout.md","size":3124,"sha256":"3c8517b58eb6ef0dc8fd0f1d24ff3dbcdc080065a888ed36d0987cd1759580c4","contentType":"text/markdown; charset=utf-8"},{"id":"4cf64eca-4294-5fe0-9c71-a5dc580c47d2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4cf64eca-4294-5fe0-9c71-a5dc580c47d2/attachment.md","path":"canonical/duendesoftware-com/session-expiration.md","size":3503,"sha256":"d2ccf5a2fc4ac6c489cee9369cac914fca41295a459fd8cf7a06163be87277c5","contentType":"text/markdown; charset=utf-8"},{"id":"48f8915a-2148-5f7f-aa71-ac88f0432318","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/48f8915a-2148-5f7f-aa71-ac88f0432318/attachment.md","path":"canonical/duendesoftware-com/session-management.md","size":5079,"sha256":"9aceb1e3b4e398e5a8aa9a01a87552b2d4f18696650df50dec6dbde51ab10686","contentType":"text/markdown; charset=utf-8"},{"id":"c6cefff8-3f18-5c0a-924b-578bbff682ad","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c6cefff8-3f18-5c0a-924b-578bbff682ad/attachment.md","path":"canonical/duendesoftware-com/signed-authorize-requests.md","size":3457,"sha256":"338424bb080f104d9a3e8c243697127961cc340c5aec913a2a4cfc741b84c1bc","contentType":"text/markdown; charset=utf-8"},{"id":"b3af5238-dfe1-51fe-86dd-cf6f5f7c7c66","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b3af5238-dfe1-51fe-86dd-cf6f5f7c7c66/attachment.md","path":"canonical/duendesoftware-com/signing-key-store.md","size":2428,"sha256":"57ae9d900ffdbb678c27abbc51dba14985c885be058f9b33e60658263bdf13fa","contentType":"text/markdown; charset=utf-8"},{"id":"24137413-1fa4-546a-840c-97a90b39cf2a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/24137413-1fa4-546a-840c-97a90b39cf2a/attachment.md","path":"canonical/duendesoftware-com/store.md","size":1357,"sha256":"307599db2278468337b90f86cec0c364e6d2066444ca9ed29a4ceee2b7da130c","contentType":"text/markdown; charset=utf-8"},{"id":"3e2917f9-b8fd-5f64-a837-fc8db76d85d0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3e2917f9-b8fd-5f64-a837-fc8db76d85d0/attachment.md","path":"canonical/duendesoftware-com/stores.md","size":1206,"sha256":"7ac1b6fa6465596aab8416139e5bb59561f70418e3f2d930996085985eecc815","contentType":"text/markdown; charset=utf-8"},{"id":"d5a28e3f-b9db-588a-a19c-7e7d5bd4d488","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d5a28e3f-b9db-588a-a19c-7e7d5bd4d488/attachment.md","path":"canonical/duendesoftware-com/support-issues.md","size":8475,"sha256":"1686c4dea10fb2f9adfa6dc06a7922d29522bd6acb9fbfeee5a49964b401f14d","contentType":"text/markdown; charset=utf-8"},{"id":"45f23c74-e0b1-50dd-bd65-f5b37e67a7a6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/45f23c74-e0b1-50dd-bd65-f5b37e67a7a6/attachment.md","path":"canonical/duendesoftware-com/supported-specifications.md","size":4012,"sha256":"7982ca9471678e11263265d560c7dd5940065f2fa0bcd33e9701510cead78328","contentType":"text/markdown; charset=utf-8"},{"id":"f2e5da43-47ed-52a7-809b-086e05d2f3fe","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f2e5da43-47ed-52a7-809b-086e05d2f3fe/attachment.md","path":"canonical/duendesoftware-com/terminology.md","size":4931,"sha256":"905e8c548be0a959cd0798c368bcd4164c3d54828007b70dc995888ce54070e8","contentType":"text/markdown; charset=utf-8"},{"id":"9cc83988-6a2a-5dbe-880e-6efeafbd335a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9cc83988-6a2a-5dbe-880e-6efeafbd335a/attachment.md","path":"canonical/duendesoftware-com/the-big-picture.md","size":4709,"sha256":"ec0f1897cfae98ecde7cd8002cfec7df02b51e2972ce99c5b24a9c7c044bb796","contentType":"text/markdown; charset=utf-8"},{"id":"4b801bba-7796-5736-9dbc-a11232e5adcd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b801bba-7796-5736-9dbc-a11232e5adcd/attachment.md","path":"canonical/duendesoftware-com/third-party-cookies.md","size":4533,"sha256":"154e05be0b76a7836ec18df841de695e47aa82aadea1c0396c34424c4bde763e","contentType":"text/markdown; charset=utf-8"},{"id":"57501bfb-ebc8-560b-be7b-b9b5494be1b2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/57501bfb-ebc8-560b-be7b-b9b5494be1b2/attachment.md","path":"canonical/duendesoftware-com/time-constant-string-comparison.md","size":3033,"sha256":"ccdb5acb4f39cef6d7e8b3ce9ea92833f4ae5a64e121d21f5e3188fe38a0ab73","contentType":"text/markdown; charset=utf-8"},{"id":"1b43c681-35d5-562c-a599-97d9f6cf05a3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1b43c681-35d5-562c-a599-97d9f6cf05a3/attachment.md","path":"canonical/duendesoftware-com/token-creation-service.md","size":3264,"sha256":"deda99b96d4ac47fcf5c733aa3cf5012164ebf86911a6eeca7e787ff81b56a79","contentType":"text/markdown; charset=utf-8"},{"id":"4ae4f60e-7d79-5dda-9b1d-f71bacbd4e2e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4ae4f60e-7d79-5dda-9b1d-f71bacbd4e2e/attachment.md","path":"canonical/duendesoftware-com/token-endpoint.md","size":4877,"sha256":"ef4c49625830cc6c97fd9b465b43b59bdb391c506ff25fc00e6015ca8aace68c","contentType":"text/markdown; charset=utf-8"},{"id":"5818f584-56ef-566b-9cd6-1556a57c899f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5818f584-56ef-566b-9cd6-1556a57c899f/attachment.md","path":"canonical/duendesoftware-com/token-management.md","size":5726,"sha256":"9c056544f4993339c4c3c409b434df7d3b19d48b7a5ee5ba6f5a52b7c2d79843","contentType":"text/markdown; charset=utf-8"},{"id":"09b5e7e0-929a-5b2e-b720-00850a2a4490","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/09b5e7e0-929a-5b2e-b720-00850a2a4490/attachment.md","path":"canonical/duendesoftware-com/token-response-generator.md","size":4210,"sha256":"a73c33bd2c45999ef20aca7ca760c7ea64145aed481527ae929afa9d25c59f57","contentType":"text/markdown; charset=utf-8"},{"id":"a9d5d45d-a15b-56e3-a633-310fda85ac05","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a9d5d45d-a15b-56e3-a633-310fda85ac05/attachment.md","path":"canonical/duendesoftware-com/token-revocation-endpoint.md","size":1236,"sha256":"e5b1e9dec008e0e5535d8a1bad3f8820ffe03aec8975e5237b164863f96d834b","contentType":"text/markdown; charset=utf-8"},{"id":"f4c9729f-99da-5f28-a1b1-e2a7f0698e3c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f4c9729f-99da-5f28-a1b1-e2a7f0698e3c/attachment.md","path":"canonical/duendesoftware-com/ui-hosting.md","size":6138,"sha256":"11e045324bb31e61f213e51d944dc1c7f7b63c16e91a25fa926b2685dceebcae","contentType":"text/markdown; charset=utf-8"},{"id":"f16042f3-3302-518c-ac23-ab7812aeb028","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f16042f3-3302-518c-ac23-ab7812aeb028/attachment.md","path":"canonical/duendesoftware-com/user-interaction.md","size":3382,"sha256":"4c5e64c3c1d77f82b1158166917749cb71d8fa934b00ec431d872e49b6a63c5a","contentType":"text/markdown; charset=utf-8"},{"id":"64edf735-0096-59ae-adf2-338ad3cc5d35","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/64edf735-0096-59ae-adf2-338ad3cc5d35/attachment.md","path":"canonical/duendesoftware-com/user-session-service.md","size":4271,"sha256":"69ebde961df6a70b3286f147afd62a85328c8290787a7f2d7131041c9d0d066f","contentType":"text/markdown; charset=utf-8"},{"id":"aa159456-9fc4-568a-96b3-138670f676e3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/aa159456-9fc4-568a-96b3-138670f676e3/attachment.md","path":"canonical/duendesoftware-com/userinfo-endpoint.md","size":1091,"sha256":"51f46ac06f3f8210b735ffd40eba84602836c3d3691b281f47642e0718a7c73e","contentType":"text/markdown; charset=utf-8"},{"id":"03278fd8-70cb-536b-8d82-2e1aad5587de","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/03278fd8-70cb-536b-8d82-2e1aad5587de/attachment.md","path":"canonical/duendesoftware-com/users-and-logging-in.md","size":3986,"sha256":"c096e2dca99b1c3c9fa6baf10a6662c9da365d22f46d0539fa0b0651b5af3c88","contentType":"text/markdown; charset=utf-8"},{"id":"b0252687-9444-5193-9ca0-0cc32b28ee35","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b0252687-9444-5193-9ca0-0cc32b28ee35/attachment.md","path":"canonical/duendesoftware-com/using-json-web-tokens.md","size":3244,"sha256":"f0d1838bd6c2e2398597aabfa2948bf30fa0802237cda18def18445f99ecf46e","contentType":"text/markdown; charset=utf-8"},{"id":"9c0744e7-7bfa-55e6-9136-3c895b6e5ac7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9c0744e7-7bfa-55e6-9136-3c895b6e5ac7/attachment.md","path":"canonical/duendesoftware-com/validation.md","size":8600,"sha256":"d1bbe7f2cd8cbf0e223d1219feb48a220341fa61d9a9517bc01f221f65d74f94","contentType":"text/markdown; charset=utf-8"},{"id":"627dbeae-dd26-5052-926d-281cdf63bdca","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/627dbeae-dd26-5052-926d-281cdf63bdca/attachment.md","path":"canonical/duendesoftware-com/web-applications.md","size":10172,"sha256":"632292b1b273e33e9334af8e3af1c5712ba9ab4da9cf810d42b99a30c757b018","contentType":"text/markdown; charset=utf-8"},{"id":"e93800c4-e7ed-5168-a5a1-949e3ccaf2d9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e93800c4-e7ed-5168-a5a1-949e3ccaf2d9/attachment.md","path":"canonical/duendesoftware-com/windows-authentication.md","size":4854,"sha256":"ac8fd2f46bc59dc0ab8cefefd95750d7b84fe915d0eb17ef31310f7276f015b8","contentType":"text/markdown; charset=utf-8"},{"id":"63685c81-719b-5599-8cbf-4060446b3d6d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/63685c81-719b-5599-8cbf-4060446b3d6d/attachment.md","path":"canonical/duendesoftware-com/yarp-extensions.md","size":7931,"sha256":"c31f506cf588da8f4e0192270cb093ed57036d86fedc91a998a3b44555e038b4","contentType":"text/markdown; charset=utf-8"},{"id":"24983e38-2e28-54ba-aa42-ca8a8a0b97b1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/24983e38-2e28-54ba-aa42-ca8a8a0b97b1/attachment.json","path":"canonical/index.json","size":509666,"sha256":"8e7590d7f7c8d45d2bc56ca9c7ebcc40d96afb1d33441d192805e42558b6694a","contentType":"application/json; charset=utf-8"},{"id":"5a7d8a15-b4e6-5d9f-bcd0-6e7f69090bde","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5a7d8a15-b4e6-5d9f-bcd0-6e7f69090bde/attachment.yaml","path":"canonical/index.yaml","size":382297,"sha256":"30f71330c3415aa9d6a616884b76e0745726dc04497117bdd734d05ad605d058","contentType":"application/yaml; charset=utf-8"},{"id":"9be73a18-31ae-5794-bc39-a3ae6cc0d105","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9be73a18-31ae-5794-bc39-a3ae6cc0d105/attachment.py","path":"config/__init__.py","size":428,"sha256":"6b8b58f4b0c21d05e20f5f7b3e05d9de31aec2e361d7ad918a5b78b044a4d73b","contentType":"text/x-python; charset=utf-8"},{"id":"2ab2b7ee-1336-5e23-a56a-a6fc42c04b1c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2ab2b7ee-1336-5e23-a56a-a6fc42c04b1c/attachment.py","path":"config/config_registry.py","size":14110,"sha256":"216229d357df6769fedb88091248f2186b89354d990c67b46ca8961c05df30c8","contentType":"text/x-python; charset=utf-8"},{"id":"fef25058-4ba4-546b-ae45-e53ab01c3fb0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fef25058-4ba4-546b-ae45-e53ab01c3fb0/attachment.yaml","path":"config/defaults.yaml","size":7592,"sha256":"66d675ffa7c9bf8fef97172222fce3c918f3aeb0b14f92b92dc94114b23076fa","contentType":"application/yaml; charset=utf-8"},{"id":"422696bb-30a8-515a-b82b-696104e3eb73","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/422696bb-30a8-515a-b82b-696104e3eb73/attachment.yaml","path":"config/filtering.yaml","size":5808,"sha256":"6b610581bfa07b8f480cffab8a7caf365a096f9c5c8f63f89cacea50636860df","contentType":"application/yaml; charset=utf-8"},{"id":"94ed1ec6-eb8d-5f02-bbfd-fc88765691d6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/94ed1ec6-eb8d-5f02-bbfd-fc88765691d6/attachment.yaml","path":"config/tag_detection.yaml","size":5672,"sha256":"80776a6de8047e292322a4c29ec1adb97da821a977d354f462f7794715c8c9e1","contentType":"application/yaml; charset=utf-8"},{"id":"ff16a21a-bbcb-5e56-a4b4-90882d729f97","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ff16a21a-bbcb-5e56-a4b4-90882d729f97/attachment.py","path":"duende_docs_api.py","size":14745,"sha256":"01f6e38c5f2a45e1a033d17cd63a11d158e443cb4c3eeb47c574a258886acb7a","contentType":"text/x-python; charset=utf-8"},{"id":"2399e475-8a33-5f55-917d-1183f45ae9f0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2399e475-8a33-5f55-917d-1183f45ae9f0/attachment.json","path":"references/sources.json","size":886,"sha256":"96283a5f52404de5291b85fda506229f93e21c210cce5028b40e747033b13c36","contentType":"application/json; charset=utf-8"},{"id":"a71c1764-20bd-5b34-8237-fba45f34e5ca","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a71c1764-20bd-5b34-8237-fba45f34e5ca/attachment.txt","path":"requirements.txt","size":229,"sha256":"c6cc7c42cfbed4e94faf43dd4583a2882d04ceda90bf3985856f479e1d6c17ba","contentType":"text/plain; charset=utf-8"},{"id":"6771800c-3deb-54c2-91b4-9636dd3c40dd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6771800c-3deb-54c2-91b4-9636dd3c40dd/attachment.py","path":"scripts/__init__.py","size":45,"sha256":"f75f5bd3bb686537064f8bd5769382bbdba1386bb80fcd1ffb2a21100298395c","contentType":"text/x-python; charset=utf-8"},{"id":"5c8d4212-3fc2-5ca0-ad45-d56913a029b8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5c8d4212-3fc2-5ca0-ad45-d56913a029b8/attachment.py","path":"scripts/bootstrap.py","size":4203,"sha256":"700913a6ca9b8fd297664248e14d23f4cecc1b3b7f19aa5789574dcf3ff427e8","contentType":"text/x-python; charset=utf-8"},{"id":"b21ccf05-0857-59d5-8ae2-d96981b4374e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b21ccf05-0857-59d5-8ae2-d96981b4374e/attachment.py","path":"scripts/core/__init__.py","size":511,"sha256":"b37ecda0214ad7b22eab65af9046ce9bc67cacb24bcf28ac66718518a0200501","contentType":"text/x-python; charset=utf-8"},{"id":"f1ad798a-25e1-5958-82ac-d865f71548e8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f1ad798a-25e1-5958-82ac-d865f71548e8/attachment.py","path":"scripts/core/doc_resolver.py","size":35934,"sha256":"bd21638315d345343e1ec58bf4ea0d9701271b05fd9ad7b8a2c46edd5ef125f3","contentType":"text/x-python; charset=utf-8"},{"id":"fae19a0f-a825-5320-9198-26448da475a2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fae19a0f-a825-5320-9198-26448da475a2/attachment.py","path":"scripts/core/find_docs.py","size":17357,"sha256":"58a5c2eed7fbe7171fa7fdcf897a6b107ed080148a5d8b892397b791b5816ebd","contentType":"text/x-python; charset=utf-8"},{"id":"c8386315-305a-5e36-80bd-69175393f86e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c8386315-305a-5e36-80bd-69175393f86e/attachment.py","path":"scripts/core/llms_full_parser.py","size":19214,"sha256":"6e3a0687cf302a6e58290fab4339e117d92e620852ae104adb9f1482006a538f","contentType":"text/x-python; charset=utf-8"},{"id":"38d119fb-30ba-509a-b37e-72bd66523481","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/38d119fb-30ba-509a-b37e-72bd66523481/attachment.py","path":"scripts/core/scrape_docs.py","size":24101,"sha256":"f301ed327a746e012197f2e97d4220535554a57a02e9bf75e9fd8be7ae66557c","contentType":"text/x-python; charset=utf-8"},{"id":"3f613a99-1188-5c3d-b836-2d34dcdc5fee","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3f613a99-1188-5c3d-b836-2d34dcdc5fee/attachment.py","path":"scripts/maintenance/__init__.py","size":44,"sha256":"c0ac43262315f516d742347eebdae7ecbaae7a964467900f47fcc5bd9be64885","contentType":"text/x-python; charset=utf-8"},{"id":"fa51a690-16c7-5698-ae06-254537324e74","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fa51a690-16c7-5698-ae06-254537324e74/attachment.py","path":"scripts/maintenance/clear_cache.py","size":5601,"sha256":"80a953d32dfcae57ccfbd8b314cd1721a50a614c5f9f37ede9aa146242895aa2","contentType":"text/x-python; charset=utf-8"},{"id":"5740217d-4115-5c4b-a770-000b6c1fc3d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5740217d-4115-5c4b-a770-000b6c1fc3d8/attachment.py","path":"scripts/maintenance/validate_index.py","size":8805,"sha256":"1c8bfdbb33c6b8915973d86eebc12ff2c4a8b0dcda4a5ba7036945b133c86fe6","contentType":"text/x-python; charset=utf-8"},{"id":"6226d2e3-c560-5e50-a7a2-8f3d37b8935e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6226d2e3-c560-5e50-a7a2-8f3d37b8935e/attachment.py","path":"scripts/management/__init__.py","size":208,"sha256":"7700acd4e8aafd1a174efdfde5df5786e4445f621e8cbf728b9460300dc6c468","contentType":"text/x-python; charset=utf-8"},{"id":"c8cee380-2e98-5bbc-8e37-f8076d747a46","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c8cee380-2e98-5bbc-8e37-f8076d747a46/attachment.py","path":"scripts/management/extract_metadata.py","size":19675,"sha256":"b162f5c9bdc0709e0d450b5f410d05a77e9f5e32f9efdc00e7decc3a2f67b252","contentType":"text/x-python; charset=utf-8"},{"id":"28a24823-d8ab-5b41-9ea9-3134ea6b5b2a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/28a24823-d8ab-5b41-9ea9-3134ea6b5b2a/attachment.py","path":"scripts/management/generate_report.py","size":5789,"sha256":"ce8930df752595fa8c65bc2dc65b500e24bc2ec67fc5fcac321d9669577ae222","contentType":"text/x-python; charset=utf-8"},{"id":"e3e6d371-90cc-5a1c-9d65-2cf53bafd69c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e3e6d371-90cc-5a1c-9d65-2cf53bafd69c/attachment.py","path":"scripts/management/index_manager.py","size":27676,"sha256":"07db0037a19aa2e5f5981baed748374c4bbfdc25b8ac1f380a20cee280db4de4","contentType":"text/x-python; charset=utf-8"},{"id":"624b48d9-c6aa-5a7d-9613-ba15f9f98eab","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/624b48d9-c6aa-5a7d-9613-ba15f9f98eab/attachment.py","path":"scripts/management/manage_index.py","size":18111,"sha256":"958510f061fa0707b012b1b679944da72c2ba9cd9c3a4f5426f520194f4e14f4","contentType":"text/x-python; charset=utf-8"},{"id":"fc6b087e-be96-5d34-9b6a-901c11d3f8ff","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fc6b087e-be96-5d34-9b6a-901c11d3f8ff/attachment.py","path":"scripts/management/rebuild_index.py","size":15215,"sha256":"251a3da0fa9f429a825678a30969c56d77890a3999c9e5145dcd6d6d8607268c","contentType":"text/x-python; charset=utf-8"},{"id":"1433d0b0-58b0-52b3-ad57-999e7f89b12e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1433d0b0-58b0-52b3-ad57-999e7f89b12e/attachment.py","path":"scripts/management/refresh_index.py","size":8490,"sha256":"4f5b1621b3a51496388719b2709c9d8ff5253338cc31bc7c9e1d318ea2b7413c","contentType":"text/x-python; charset=utf-8"},{"id":"1c7cf44d-56a0-523e-8f2b-b9c44281cb89","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1c7cf44d-56a0-523e-8f2b-b9c44281cb89/attachment.py","path":"scripts/utils/__init__.py","size":4759,"sha256":"5f3e81fd37f7f5595d71921f6392996baaea526ad856f4d5744f5ed9441954c4","contentType":"text/x-python; charset=utf-8"},{"id":"c3677a14-4ec6-5177-b6f1-da110a2a870e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c3677a14-4ec6-5177-b6f1-da110a2a870e/attachment.py","path":"scripts/utils/cache_manager.py","size":12117,"sha256":"6ac9410a1da4ef5ebabab3610f2890b82ba071b5df4fa6a5314ce98c8d396960","contentType":"text/x-python; charset=utf-8"},{"id":"c94eef5f-26cc-5f0a-8f98-4ed1ebbaa4aa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c94eef5f-26cc-5f0a-8f98-4ed1ebbaa4aa/attachment.py","path":"scripts/utils/cli_utils.py","size":5327,"sha256":"10a60377263553e5ec8327b83c35fcd70dabc78d210a27ca13e8e27a3b683136","contentType":"text/x-python; charset=utf-8"},{"id":"50d78094-808f-5f45-9322-564cc660cb18","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/50d78094-808f-5f45-9322-564cc660cb18/attachment.py","path":"scripts/utils/common_paths.py","size":5529,"sha256":"7e0cacb912a3447c5e0e9ae5e9796a45ae9ef68d81e2ae42fc3fcd5067eeae8a","contentType":"text/x-python; charset=utf-8"},{"id":"b718f774-80b6-5972-9ec2-e8c1c91be704","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b718f774-80b6-5972-9ec2-e8c1c91be704/attachment.py","path":"scripts/utils/config_helpers.py","size":15896,"sha256":"2ef895408c1924081b68879c6269c71a184e09aa83d4ffabb8e073404df98b97","contentType":"text/x-python; charset=utf-8"},{"id":"d4457cc6-8f21-5ab8-ac9a-469516012f93","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d4457cc6-8f21-5ab8-ac9a-469516012f93/attachment.py","path":"scripts/utils/constants.py","size":1238,"sha256":"6ba9cdec2bfb9194168b3df806e76505782dc5a3d381b91451d944152be1227e","contentType":"text/x-python; charset=utf-8"},{"id":"d40446fc-c3ec-5088-8c08-b1add72c79e5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d40446fc-c3ec-5088-8c08-b1add72c79e5/attachment.py","path":"scripts/utils/dev_mode.py","size":8552,"sha256":"cf1c7033927ccf7acf7391b582819f718151a1b9f2640799677e2a4a98abda50","contentType":"text/x-python; charset=utf-8"},{"id":"3ae7f1f1-64a4-567c-9bb3-b5dff20aaead","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3ae7f1f1-64a4-567c-9bb3-b5dff20aaead/attachment.py","path":"scripts/utils/http_utils.py","size":22890,"sha256":"642e4c40d678afa3e35297b64bbf4cae1d4906bc52f14fe5e6f4b05212c52fac","contentType":"text/x-python; charset=utf-8"},{"id":"09c287c4-95b0-5328-a61c-f4824d2ebecc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/09c287c4-95b0-5328-a61c-f4824d2ebecc/attachment.py","path":"scripts/utils/logging_utils.py","size":41316,"sha256":"515a9bb164f43c27f56ec5a7f805bb776763213c8dcc260aacc4658e767d6852","contentType":"text/x-python; charset=utf-8"},{"id":"71bb7082-f87d-500f-8846-c781b8ae9a3d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/71bb7082-f87d-500f-8846-c781b8ae9a3d/attachment.py","path":"scripts/utils/metadata_utils.py","size":1812,"sha256":"7ca6084b7da9fd1ec2cfd8794b305d479e9e5487f284030d48106a422a669077","contentType":"text/x-python; charset=utf-8"},{"id":"c6ed9a44-c5bd-534f-8a66-a365bc45da09","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c6ed9a44-c5bd-534f-8a66-a365bc45da09/attachment.py","path":"scripts/utils/path_config.py","size":5296,"sha256":"33fc659ec62634e79e395cfd9c5aff6f09bb6089b1a49386f85d5837719a9838","contentType":"text/x-python; charset=utf-8"},{"id":"49d8aaac-f377-5d9e-be00-0fda3cba8862","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/49d8aaac-f377-5d9e-be00-0fda3cba8862/attachment.py","path":"scripts/utils/script_utils.py","size":8159,"sha256":"19fecbc00151b546c1568557b3150a9fad564e109cd2baefbf59028a8fe97b05","contentType":"text/x-python; charset=utf-8"},{"id":"49107925-f4d5-5ae8-b0c8-b630e5854577","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/49107925-f4d5-5ae8-b0c8-b630e5854577/attachment.py","path":"scripts/utils/search_constants.py","size":4646,"sha256":"93d3d767960c5c02dc4ba6581be06266dcb7703ad28c1fb26246349892c4df2d","contentType":"text/x-python; charset=utf-8"},{"id":"68b1dcb2-2422-50f0-875a-566e9f6584d7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/68b1dcb2-2422-50f0-875a-566e9f6584d7/attachment.py","path":"tests/__init__.py","size":30,"sha256":"aff313bfe81fcb3fea575ef6f6800c820b5b5037796a934f5aae0dd7aa85b6a4","contentType":"text/x-python; charset=utf-8"},{"id":"9bcee08d-0c1f-5393-98e6-e1df9ea5bcb2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9bcee08d-0c1f-5393-98e6-e1df9ea5bcb2/attachment.py","path":"tests/conftest.py","size":1339,"sha256":"76ee03eb525cf06d3ce0e0c46d9a4b85fb77bb20e5ba9b486979e1a52bf5f445","contentType":"text/x-python; charset=utf-8"},{"id":"78b481e1-41b8-516a-a25d-fba1a882abcc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/78b481e1-41b8-516a-a25d-fba1a882abcc/attachment.py","path":"tests/test_scrape_docs.py","size":15120,"sha256":"700f6f1b929584537adda5af279be9f33a618e8f7149be226559fa8267c0fd37","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"b45086f193a00d8f4b4e87b557a9a6ef5256504c700ab394d0f9c1e1b546193a","attachment_count":367,"text_attachments":367,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"plugins/duende-ecosystem/skills/duende-docs/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"browser-automation-scraping","category_label":"Browser"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"browser-automation-scraping","import_tag":"clean-skills-v1","description":"Single source of truth and librarian for ALL Duende Software documentation. Manages local documentation storage, scraping, discovery, and resolution. Use when finding, locating, searching, or resolving Duende documentation; discovering docs by keywords, category, tags, or natural language queries; scraping from llms-full.txt; managing index metadata (keywords, tags, aliases); or rebuilding index from filesystem. Run scripts to scrape, find, and resolve documentation. Handles doc_id resolution, keyword search, natural language queries, category/tag filtering, alias resolution, llms-full.txt parsing, markdown subsection extraction for internal use, hash-based drift detection, and comprehensive index maintenance.","allowed-tools":"Read, Glob, Grep, Bash"}},"renderedAt":1782979950050}

Duende Documentation Skill CRITICAL: Path Doubling Prevention - MANDATORY ABSOLUTE PROHIBITION: NEVER use with in PowerShell when running scripts from this skill. The Problem: If your current working directory is already inside the skill directory, using relative paths causes PowerShell to resolve paths relative to the current directory instead of the repository root, resulting in path doubling. REQUIRED Solutions (choose one): 1. ALWAYS use absolute paths (recommended) 2. Use separate commands (never with ) 3. Run from repository root with relative paths NEVER DO THIS: - Chain with : causes…