├── .editorconfig
├── .gitattributes
├── .github
├── FUNDING.yml
└── workflows
│ ├── Build_&_Test.yml
│ ├── Manual_Nuget_Push.yml
│ └── docs.yml
├── .gitignore
├── .nuke
├── build.schema.json
└── parameters.json
├── LICENSE
├── README.md
├── build.cmd
├── build.ps1
├── build.sh
├── build
├── .editorconfig
├── Directory.Build.props
├── Directory.Build.targets
├── _build.csproj
├── _build.csproj.DotSettings
└── build.cs
├── docs
├── .vitepress
│ ├── config.ts
│ └── theme
│ │ ├── custom.css
│ │ └── index.js
├── ClassDiagram.drawio
├── guide
│ ├── bootstrapping.md
│ ├── extensions.md
│ ├── gettingstarted.md
│ ├── history.md
│ ├── index.md
│ ├── nunit.md
│ ├── opentelemetry.md
│ ├── security.md
│ ├── snapshot.md
│ ├── tunit.md
│ └── xunit.md
├── index.md
├── public
│ ├── ClassDiagram.drawio.png
│ ├── alba.jpg
│ └── tracing.png
├── scenarios
│ ├── assertions.md
│ ├── formdata.md
│ ├── headers.md
│ ├── index.md
│ ├── json.md
│ ├── redirects.md
│ ├── setup.md
│ ├── statuscode.md
│ ├── text.md
│ ├── urls.md
│ ├── writingscenarios.md
│ └── xml.md
└── vite.config.js
├── img
└── icon.png
├── mdsnippets.json
├── package-lock.json
├── package.json
└── src
├── Alba.Testing
├── Acceptance
│ ├── asserting_against_status_code.cs
│ ├── asserting_against_the_response_body_text.cs
│ ├── assertions_against_redirects.cs
│ ├── assertions_against_response_headers.cs
│ ├── assertions_against_the_querystring.cs
│ ├── assertions_against_the_request_headers.cs
│ ├── content_type_verifications.cs
│ ├── customize_before_each_and_after_each.cs
│ ├── data_binding_in_mvc_app.cs
│ ├── specs_against_aspnet_core_app.cs
│ ├── using_custom_service_registrations.cs
│ ├── web_application_factory_usage.cs
│ └── write_out_the_body_anytime_the_status_code_is_in_the_500s.cs
├── ActivityTests.cs
├── Alba.Testing.csproj
├── Assertions
│ ├── AssertionRunner.cs
│ ├── BodyContainsAssertionTests.cs
│ ├── BodyDoesNotContainAssertionTests.cs
│ ├── BodyTextAssertionTests.cs
│ ├── HasSingleHeaderValueAssertionTests.cs
│ ├── HeaderMatchAssertionTests.cs
│ ├── HeaderMultiValueAssertionTests.cs
│ ├── HeaderValueAssertionTests.cs
│ ├── NoHeaderValueAssertionTests.cs
│ ├── RedirectAssertionTests.cs
│ ├── StatusCodeAssertionTests.cs
│ ├── StatusCodeSuccessAssertionTests.cs
│ └── sending_and_receiving_json.cs
├── CrudeRouter.cs
├── FormDataExtensionsTests.cs
├── MimeTypeTests.cs
├── MimimalApi
│ └── end_to_end_with_json_serialization.cs
├── Properties
│ └── launchSettings.json
├── Samples
│ ├── ContractTestWithAlba.cs
│ ├── Extensions.cs
│ ├── FormData.cs
│ ├── Headers.cs
│ ├── JsonAndXml.cs
│ ├── MinimalApiUsage.cs
│ ├── Quickstart.cs
│ ├── Quickstart3.cs
│ ├── Redirects.cs
│ ├── SnapshotTesting.SnapshotTest.verified.txt
│ ├── SnapshotTesting.cs
│ ├── StatusCodes.cs
│ └── Urls.cs
├── ScenarioAssertionExceptionTests.cs
├── ScenarioContext.cs
├── ScenarioTests.cs
├── Security
│ ├── IdentityServerFixture.cs
│ ├── JwtSecurityStubTests.cs
│ ├── OpenConnectClientCredentialsTests.cs
│ ├── OpenConnectUserPasswordTests.cs
│ ├── web_api_authentication_with_individual_stub.cs
│ ├── web_api_authentication_with_jwt.cs
│ └── web_api_authentication_with_stub.cs
├── SpecificationExtensions.cs
├── TestImage.jpg
├── TestTextFile.txt
├── before_and_after_actions.cs
├── reading_and_writing_xml_to_context.cs
├── using_extensions_with_sync_builder.cs
├── using_json_helpers.cs
└── xunit.runner.json
├── Alba.sln
├── Alba
├── Alba.csproj
├── AlbaHost.cs
├── AlbaHostExtensions.cs
├── AlbaJsonFormatterException.cs
├── AlbaWebApplicationFactory.cs
├── AssemblyInfo.cs
├── AssertionContext.cs
├── Assertions
│ ├── BodyContainsAssertion.cs
│ ├── BodyDoesNotContainAssertion.cs
│ ├── BodyTextAssertion.cs
│ ├── HasSingleHeaderValueAssertion.cs
│ ├── HeaderExistsAssertion.cs
│ ├── HeaderMatchAssertion.cs
│ ├── HeaderMultiValueAssertion.cs
│ ├── HeaderValueAssertion.cs
│ ├── NoHeaderValueAssertion.cs
│ ├── RedirectAssertion.cs
│ ├── StatusCodeAssertion.cs
│ └── StatusCodeSuccessAssertion.cs
├── ConfigurationOverride.cs
├── EmptyResponseException.cs
├── FormDataExtensions.cs
├── HeaderExpectations.cs
├── HeaderExtensions.cs
├── HttpContextExtensions.cs
├── HttpRequestBody.cs
├── IAlbaExtension.cs
├── IAlbaHost.cs
├── IAlbaWebApplicationFactory.cs
├── IScenarioAssertion.cs
├── IScenarioResult.cs
├── IUrlExpression.cs
├── Internal
│ ├── AlbaTracing.cs
│ ├── LightweightCache.cs
│ ├── StreamExtensions.cs
│ └── StringExtensions.cs
├── MimeType.cs
├── Scenario.cs
├── ScenarioAssertionException.cs
├── ScenarioExpectationsExtensions.cs
├── ScenarioResult.cs
├── Security
│ ├── AuthenticationExtensionBase.cs
│ ├── AuthenticationStub.cs
│ ├── ClaimsExtensions.cs
│ ├── IHasClaims.cs
│ ├── JwtSecurityStub.cs
│ ├── OpenConnectClientCredentials.cs
│ ├── OpenConnectExtension.cs
│ └── OpenConnectUserPassword.cs
├── SendExpression.cs
└── Serialization
│ ├── FormatterSerializer.cs
│ ├── IJsonStrategy.cs
│ └── SystemTextJsonSerializer.cs
├── Directory.Build.props
├── IdentityServer.New
├── Config.cs
├── HostingExtensions.cs
├── IdentityServer.New.csproj
├── Pages
│ ├── Account
│ │ ├── AccessDenied.cshtml
│ │ ├── AccessDenied.cshtml.cs
│ │ ├── Create
│ │ │ ├── Index.cshtml
│ │ │ ├── Index.cshtml.cs
│ │ │ └── InputModel.cs
│ │ ├── Login
│ │ │ ├── Index.cshtml
│ │ │ ├── Index.cshtml.cs
│ │ │ ├── InputModel.cs
│ │ │ ├── LoginOptions.cs
│ │ │ └── ViewModel.cs
│ │ └── Logout
│ │ │ ├── Index.cshtml
│ │ │ ├── Index.cshtml.cs
│ │ │ ├── LoggedOut.cshtml
│ │ │ ├── LoggedOut.cshtml.cs
│ │ │ ├── LoggedOutViewModel.cs
│ │ │ └── LogoutOptions.cs
│ ├── Ciba
│ │ ├── All.cshtml
│ │ ├── All.cshtml.cs
│ │ ├── Consent.cshtml
│ │ ├── Consent.cshtml.cs
│ │ ├── ConsentOptions.cs
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ ├── InputModel.cs
│ │ ├── ViewModel.cs
│ │ └── _ScopeListItem.cshtml
│ ├── Consent
│ │ ├── ConsentOptions.cs
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ ├── InputModel.cs
│ │ ├── ViewModel.cs
│ │ └── _ScopeListItem.cshtml
│ ├── Device
│ │ ├── DeviceOptions.cs
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ ├── InputModel.cs
│ │ ├── Success.cshtml
│ │ ├── Success.cshtml.cs
│ │ ├── ViewModel.cs
│ │ └── _ScopeListItem.cshtml
│ ├── Diagnostics
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ └── ViewModel.cs
│ ├── Extensions.cs
│ ├── ExternalLogin
│ │ ├── Callback.cshtml
│ │ ├── Callback.cshtml.cs
│ │ ├── Challenge.cshtml
│ │ └── Challenge.cshtml.cs
│ ├── Grants
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ └── ViewModel.cs
│ ├── Home
│ │ └── Error
│ │ │ ├── Index.cshtml
│ │ │ ├── Index.cshtml.cs
│ │ │ └── ViewModel.cs
│ ├── Index.cshtml
│ ├── Index.cshtml.cs
│ ├── Redirect
│ │ ├── Index.cshtml
│ │ └── Index.cshtml.cs
│ ├── SecurityHeadersAttribute.cs
│ ├── ServerSideSessions
│ │ ├── Index.cshtml
│ │ └── Index.cshtml.cs
│ ├── Shared
│ │ ├── _Layout.cshtml
│ │ ├── _Nav.cshtml
│ │ └── _ValidationSummary.cshtml
│ ├── TestUsers.cs
│ ├── _ViewImports.cshtml
│ └── _ViewStart.cshtml
├── Program.cs
├── Properties
│ └── launchSettings.json
├── keys
│ └── is-signing-key-BAF757129D4DA200C5FD1BF53156790E.json
└── wwwroot
│ ├── css
│ ├── site.css
│ ├── site.min.css
│ └── site.scss
│ ├── duende-logo.svg
│ ├── favicon.ico
│ └── js
│ ├── signin-redirect.js
│ └── signout-redirect.js
├── MinimalApiWithOakton
├── MinimalApiWithOakton.csproj
├── Program.cs
├── Properties
│ └── launchSettings.json
├── appsettings.Development.json
└── appsettings.json
├── NUnitSamples
├── NUnitSamples.csproj
└── UnitTest1.cs
├── TUnitSamples
├── Program.cs
└── TUnitSamples.csproj
├── WebApiAspNetCore3
├── Controllers
│ └── WeatherForecastController.cs
├── HomeController.cs
├── Program.cs
├── Properties
│ └── launchSettings.json
├── Startup.cs
├── WeatherForecast.cs
├── WebApiStartupHostingModel.csproj
├── appsettings.Development.json
└── appsettings.json
├── WebApiNet6
├── Program.cs
├── Properties
│ └── launchSettings.json
├── WebApiNet6.csproj
├── appsettings.Development.json
└── appsettings.json
├── WebApp
├── Controllers
│ ├── AuthController.cs
│ ├── FakeController.cs
│ ├── FilesController.cs
│ ├── GatewayController.cs
│ ├── JsonController.cs
│ ├── MathController.cs
│ ├── QueryStringContoller.cs
│ └── ValuesController.cs
├── IWidget.cs
├── Program.cs
├── Project_Readme.html
├── Properties
│ └── launchSettings.json
├── Startup.cs
├── WebApp.csproj
├── appsettings.json
├── hello.txt
└── web.config
└── WebAppSecuredWithJwt
├── ArithmeticController.cs
├── IdentityController.cs
├── Program.cs
├── Properties
└── launchSettings.json
├── Startup.cs
├── WebAppSecuredWithJwt.csproj
├── appsettings.Development.json
└── appsettings.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.cs]
2 | indent_style = space
3 | indent_size = 4
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.verified.txt text eol=lf working-tree-encoding=UTF-8
2 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [JasperFx]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # eventsourcingnetcore
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/workflows/Build_&_Test.yml:
--------------------------------------------------------------------------------
1 | # ------------------------------------------------------------------------------
2 | #