From 14ded01432c3924876a45b0ee4a2a9a960fde350 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 7 Nov 2023 13:36:37 -0800 Subject: [PATCH 1/4] Use Microsoft Identity --- Directory.Packages.props | 1 + eShop.sln | 7 - src/Basket.API/Grpc/BasketService.cs | 6 + src/Basket.API/appsettings.json | 11 +- src/Identity.API/.gitignore | 2 - src/Identity.API/Configuration/Config.cs | 189 - src/Identity.API/Data/ApplicationDbContext.cs | 22 - ...0230925223402_InitialMigration.Designer.cs | 324 -- .../20230925223402_InitialMigration.cs | 235 -- .../ApplicationDbContextModelSnapshot.cs | 321 -- src/Identity.API/GlobalUsings.cs | 156 - src/Identity.API/Identity.API.csproj | 54 - .../ForgotPasswordViewModel.cs | 9 - .../AccountViewModels/LoggedOutViewModel.cs | 9 - .../AccountViewModels/LoginViewModel.cs | 17 - .../AccountViewModels/LogoutViewModel.cs | 7 - .../AccountViewModels/RedirectViewModel.cs | 7 - .../AccountViewModels/RegisterViewModel.cs | 23 - .../ResetPasswordViewModel.cs | 21 - .../AccountViewModels/SendCodeViewModel.cs | 13 - .../AccountViewModels/VerifyCodeViewModel.cs | 19 - src/Identity.API/Models/ApplicationUser.cs | 31 - .../ConsentViewModels/ConsentInputModel.cs | 11 - .../ConsentViewModels/ConsentOptions.cs | 12 - .../ConsentViewModels/ConsentViewModel.cs | 13 - .../ConsentViewModels/ProcessConsentResult.cs | 15 - .../ConsentViewModels/ScopeViewModel.cs | 12 - src/Identity.API/Models/ErrorViewModel.cs | 9 - .../AddPhoneNumberViewModel.cs | 10 - .../ChangePasswordViewModel.cs | 21 - .../ConfigureTwoFactorViewModel.cs | 9 - .../ManageViewModels/FactorViewModel.cs | 7 - .../Models/ManageViewModels/IndexViewModel.cs | 15 - .../ManageViewModels/SetPasswordViewModel.cs | 16 - .../VerifyPhoneNumberViewModel.cs | 13 - src/Identity.API/Program.cs | 53 - .../Properties/launchSettings.json | 12 - .../Quickstart/Account/AccountController.cs | 334 -- .../Quickstart/Account/AccountOptions.cs | 16 - .../Quickstart/Account/ExternalController.cs | 238 -- .../Quickstart/Account/ExternalProvider.cs | 10 - .../Quickstart/Account/LoggedOutViewModel.cs | 18 - .../Quickstart/Account/LoginInputModel.cs | 15 - .../Quickstart/Account/LoginViewModel.cs | 17 - .../Quickstart/Account/LogoutInputModel.cs | 10 - .../Quickstart/Account/LogoutViewModel.cs | 10 - .../Quickstart/Account/RedirectViewModel.cs | 11 - .../Quickstart/Consent/ConsentController.cs | 247 -- .../Quickstart/Consent/ConsentInputModel.cs | 14 - .../Quickstart/Consent/ConsentOptions.cs | 15 - .../Quickstart/Consent/ConsentViewModel.cs | 16 - .../Consent/ProcessConsentResult.cs | 17 - .../Quickstart/Consent/ScopeViewModel.cs | 15 - .../Device/DeviceAuthorizationInputModel.cs | 10 - .../Device/DeviceAuthorizationViewModel.cs | 11 - .../Quickstart/Device/DeviceController.cs | 214 -- .../Diagnostics/DiagnosticsController.cs | 22 - .../Diagnostics/DiagnosticsViewModel.cs | 28 - src/Identity.API/Quickstart/Extensions.cs | 22 - .../Quickstart/Grants/GrantsController.cs | 85 - .../Quickstart/Grants/GrantsViewModel.cs | 23 - .../Quickstart/Home/ErrorViewModel.cs | 18 - .../Quickstart/Home/HomeController.cs | 59 - .../Quickstart/SecurityHeadersAttribute.cs | 52 - src/Identity.API/README.md | 14 - src/Identity.API/Services/EFLoginService.cs | 34 - src/Identity.API/Services/ILoginService.cs | 13 - src/Identity.API/Services/IRedirectService.cs | 7 - src/Identity.API/Services/ProfileService.cs | 118 - src/Identity.API/Services/RedirectService.cs | 29 - src/Identity.API/UsersSeed.cs | 98 - .../Views/Account/AccessDenied.cshtml | 7 - .../Views/Account/LoggedOut.cshtml | 34 - src/Identity.API/Views/Account/Login.cshtml | 47 - src/Identity.API/Views/Account/Logout.cshtml | 15 - src/Identity.API/Views/Consent/Index.cshtml | 104 - src/Identity.API/Views/Device/Success.cshtml | 7 - .../Views/Device/UserCodeCapture.cshtml | 23 - .../Views/Device/UserCodeConfirmation.cshtml | 108 - .../Views/Diagnostics/Index.cshtml | 64 - src/Identity.API/Views/Grants/Index.cshtml | 87 - src/Identity.API/Views/Home/Index.cshtml | 32 - src/Identity.API/Views/Shared/Error.cshtml | 40 - src/Identity.API/Views/Shared/Redirect.cshtml | 11 - src/Identity.API/Views/Shared/_Layout.cshtml | 46 - .../Views/Shared/_ScopeListItem.cshtml | 34 - .../Views/Shared/_ValidationSummary.cshtml | 7 - src/Identity.API/Views/_ViewImports.cshtml | 2 - src/Identity.API/Views/_ViewStart.cshtml | 3 - src/Identity.API/appsettings.Development.json | 5 - src/Identity.API/appsettings.json | 12 - src/Identity.API/bundleconfig.json | 24 - src/Identity.API/libman.json | 35 - src/Identity.API/tempkey.jwk | 1 - src/Identity.API/wwwroot/_references.js | 6 - src/Identity.API/wwwroot/css/site.css | 1129 ------ src/Identity.API/wwwroot/favicon.ico | Bin 15086 -> 0 bytes .../wwwroot/fonts/Montserrat-Bold.eot | Bin 29744 -> 0 bytes .../wwwroot/fonts/Montserrat-Bold.svg | 1933 ---------- .../wwwroot/fonts/Montserrat-Bold.ttf | Bin 29560 -> 0 bytes .../wwwroot/fonts/Montserrat-Bold.woff | Bin 17348 -> 0 bytes .../wwwroot/fonts/Montserrat-Bold.woff2 | Bin 12112 -> 0 bytes .../wwwroot/fonts/Montserrat-Regular.eot | Bin 29212 -> 0 bytes .../wwwroot/fonts/Montserrat-Regular.svg | 1743 --------- .../wwwroot/fonts/Montserrat-Regular.ttf | Bin 29016 -> 0 bytes .../wwwroot/fonts/Montserrat-Regular.woff | Bin 17284 -> 0 bytes .../wwwroot/fonts/Montserrat-Regular.woff2 | Bin 12080 -> 0 bytes .../wwwroot/fonts/Oswald-Bold.eot | Bin 102320 -> 0 bytes .../wwwroot/fonts/Oswald-Bold.svg | 3184 ---------------- .../wwwroot/fonts/Oswald-Bold.ttf | Bin 91680 -> 0 bytes .../wwwroot/fonts/Oswald-Bold.woff | Bin 51904 -> 0 bytes .../wwwroot/fonts/Oswald-Bold.woff2 | Bin 38576 -> 0 bytes .../wwwroot/fonts/Oswald-ExtraLight.eot | Bin 102480 -> 0 bytes .../wwwroot/fonts/Oswald-ExtraLight.svg | 2860 --------------- .../wwwroot/fonts/Oswald-ExtraLight.ttf | Bin 91360 -> 0 bytes .../wwwroot/fonts/Oswald-ExtraLight.woff | Bin 50872 -> 0 bytes .../wwwroot/fonts/Oswald-ExtraLight.woff2 | Bin 37864 -> 0 bytes .../wwwroot/fonts/Oswald-Light.eot | Bin 102388 -> 0 bytes .../wwwroot/fonts/Oswald-Light.svg | 2902 --------------- .../wwwroot/fonts/Oswald-Light.ttf | Bin 91504 -> 0 bytes .../wwwroot/fonts/Oswald-Light.woff | Bin 51288 -> 0 bytes .../wwwroot/fonts/Oswald-Light.woff2 | Bin 38408 -> 0 bytes .../wwwroot/fonts/Oswald-Medium.eot | Bin 102396 -> 0 bytes .../wwwroot/fonts/Oswald-Medium.svg | 3232 ----------------- .../wwwroot/fonts/Oswald-Medium.ttf | Bin 91652 -> 0 bytes .../wwwroot/fonts/Oswald-Medium.woff | Bin 52168 -> 0 bytes .../wwwroot/fonts/Oswald-Medium.woff2 | Bin 38936 -> 0 bytes .../wwwroot/fonts/Oswald-Regular.eot | Bin 102216 -> 0 bytes .../wwwroot/fonts/Oswald-Regular.svg | 2720 -------------- .../wwwroot/fonts/Oswald-Regular.ttf | Bin 91400 -> 0 bytes .../wwwroot/fonts/Oswald-Regular.woff | Bin 50820 -> 0 bytes .../wwwroot/fonts/Oswald-Regular.woff2 | Bin 37812 -> 0 bytes .../wwwroot/fonts/Oswald-SemiBold.eot | Bin 102468 -> 0 bytes .../wwwroot/fonts/Oswald-SemiBold.svg | 3197 ---------------- .../wwwroot/fonts/Oswald-SemiBold.ttf | Bin 91700 -> 0 bytes .../wwwroot/fonts/Oswald-SemiBold.woff | Bin 52124 -> 0 bytes .../wwwroot/fonts/Oswald-SemiBold.woff2 | Bin 38884 -> 0 bytes .../plus-jakarta-sans-v8-latin-200.woff2 | Bin 11904 -> 0 bytes ...plus-jakarta-sans-v8-latin-200italic.woff2 | Bin 12644 -> 0 bytes .../plus-jakarta-sans-v8-latin-300.woff2 | Bin 12216 -> 0 bytes ...plus-jakarta-sans-v8-latin-300italic.woff2 | Bin 13012 -> 0 bytes .../plus-jakarta-sans-v8-latin-500.woff2 | Bin 12380 -> 0 bytes ...plus-jakarta-sans-v8-latin-500italic.woff2 | Bin 13152 -> 0 bytes .../plus-jakarta-sans-v8-latin-600.woff2 | Bin 12228 -> 0 bytes ...plus-jakarta-sans-v8-latin-600italic.woff2 | Bin 13056 -> 0 bytes .../plus-jakarta-sans-v8-latin-700.woff2 | Bin 12364 -> 0 bytes ...plus-jakarta-sans-v8-latin-700italic.woff2 | Bin 13052 -> 0 bytes .../plus-jakarta-sans-v8-latin-800.woff2 | Bin 12044 -> 0 bytes ...plus-jakarta-sans-v8-latin-800italic.woff2 | Bin 12648 -> 0 bytes .../plus-jakarta-sans-v8-latin-italic.woff2 | Bin 12656 -> 0 bytes .../plus-jakarta-sans-v8-latin-regular.woff2 | Bin 11876 -> 0 bytes src/Identity.API/wwwroot/icon.jpg | Bin 19482 -> 0 bytes src/Identity.API/wwwroot/icon.png | Bin 20796 -> 0 bytes .../wwwroot/images/arrow-down.png | Bin 1045 -> 0 bytes .../wwwroot/images/arrow-right.svg | 1 - src/Identity.API/wwwroot/images/banner.png | Bin 969018 -> 0 bytes src/Identity.API/wwwroot/images/banner1.svg | 1 - src/Identity.API/wwwroot/images/banner2.svg | 1 - src/Identity.API/wwwroot/images/banner3.svg | 1 - src/Identity.API/wwwroot/images/banner4.svg | 1 - src/Identity.API/wwwroot/images/brand.PNG | Bin 4023 -> 0 bytes .../wwwroot/images/brand_dark.PNG | Bin 4266 -> 0 bytes src/Identity.API/wwwroot/images/cart.png | Bin 1532 -> 0 bytes src/Identity.API/wwwroot/images/check.svg | 7 - src/Identity.API/wwwroot/images/header.jpg | Bin 297005 -> 0 bytes .../wwwroot/images/logo-footer.svg | 31 - .../wwwroot/images/logo-header.svg | 18 - src/Identity.API/wwwroot/images/logo.svg | 14 - .../wwwroot/images/logo_color.svg | 14 - src/Identity.API/wwwroot/images/logout.PNG | Bin 455 -> 0 bytes .../wwwroot/images/main_banner.png | Bin 729906 -> 0 bytes .../wwwroot/images/main_banner_text.png | Bin 8828 -> 0 bytes .../wwwroot/images/main_banner_text.svg | 6 - .../wwwroot/images/main_footer_text.PNG | Bin 4669 -> 0 bytes src/Identity.API/wwwroot/images/my_orders.PNG | Bin 252 -> 0 bytes src/Identity.API/wwwroot/images/refresh.svg | 44 - .../wwwroot/js/signin-redirect.js | 1 - .../wwwroot/js/signout-redirect.js | 6 - src/Identity.API/wwwroot/js/site.js | 1 - src/Identity.API/wwwroot/js/site.min.js | 0 src/Ordering.API/Apis/OrdersApi.cs | 16 +- src/Ordering.API/appsettings.json | 10 +- src/WebApp/Components/Layout/UserMenu.razor | 7 +- src/WebApp/Extensions/Extensions.cs | 23 +- src/WebApp/WebApp.csproj | 1 + src/WebApp/appsettings.json | 12 +- src/WebhookClient/Extensions/Extensions.cs | 23 +- src/WebhookClient/Program.cs | 6 +- .../Properties/launchSettings.json | 2 +- src/WebhookClient/appsettings.json | 10 + src/Webhooks.API/Program.cs | 7 +- src/Webhooks.API/appsettings.json | 11 +- src/eShop.AppHost/Program.cs | 26 +- src/eShop.AppHost/eShop.AppHost.csproj | 1 - .../AuthenticationExtensions.cs | 27 +- .../eShop.ServiceDefaults.csproj | 1 + 196 files changed, 94 insertions(+), 27462 deletions(-) delete mode 100644 src/Identity.API/.gitignore delete mode 100644 src/Identity.API/Configuration/Config.cs delete mode 100644 src/Identity.API/Data/ApplicationDbContext.cs delete mode 100644 src/Identity.API/Data/Migrations/20230925223402_InitialMigration.Designer.cs delete mode 100644 src/Identity.API/Data/Migrations/20230925223402_InitialMigration.cs delete mode 100644 src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs delete mode 100644 src/Identity.API/GlobalUsings.cs delete mode 100644 src/Identity.API/Identity.API.csproj delete mode 100644 src/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/LoginViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/LogoutViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/RedirectViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/RegisterViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs delete mode 100644 src/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs delete mode 100644 src/Identity.API/Models/ApplicationUser.cs delete mode 100644 src/Identity.API/Models/ConsentViewModels/ConsentInputModel.cs delete mode 100644 src/Identity.API/Models/ConsentViewModels/ConsentOptions.cs delete mode 100644 src/Identity.API/Models/ConsentViewModels/ConsentViewModel.cs delete mode 100644 src/Identity.API/Models/ConsentViewModels/ProcessConsentResult.cs delete mode 100644 src/Identity.API/Models/ConsentViewModels/ScopeViewModel.cs delete mode 100644 src/Identity.API/Models/ErrorViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/FactorViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/IndexViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs delete mode 100644 src/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs delete mode 100644 src/Identity.API/Program.cs delete mode 100644 src/Identity.API/Properties/launchSettings.json delete mode 100644 src/Identity.API/Quickstart/Account/AccountController.cs delete mode 100644 src/Identity.API/Quickstart/Account/AccountOptions.cs delete mode 100644 src/Identity.API/Quickstart/Account/ExternalController.cs delete mode 100644 src/Identity.API/Quickstart/Account/ExternalProvider.cs delete mode 100644 src/Identity.API/Quickstart/Account/LoggedOutViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Account/LoginInputModel.cs delete mode 100644 src/Identity.API/Quickstart/Account/LoginViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Account/LogoutInputModel.cs delete mode 100644 src/Identity.API/Quickstart/Account/LogoutViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Account/RedirectViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ConsentController.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ConsentInputModel.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ConsentOptions.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ConsentViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ProcessConsentResult.cs delete mode 100644 src/Identity.API/Quickstart/Consent/ScopeViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Device/DeviceAuthorizationInputModel.cs delete mode 100644 src/Identity.API/Quickstart/Device/DeviceAuthorizationViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Device/DeviceController.cs delete mode 100644 src/Identity.API/Quickstart/Diagnostics/DiagnosticsController.cs delete mode 100644 src/Identity.API/Quickstart/Diagnostics/DiagnosticsViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Extensions.cs delete mode 100644 src/Identity.API/Quickstart/Grants/GrantsController.cs delete mode 100644 src/Identity.API/Quickstart/Grants/GrantsViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Home/ErrorViewModel.cs delete mode 100644 src/Identity.API/Quickstart/Home/HomeController.cs delete mode 100644 src/Identity.API/Quickstart/SecurityHeadersAttribute.cs delete mode 100644 src/Identity.API/README.md delete mode 100644 src/Identity.API/Services/EFLoginService.cs delete mode 100644 src/Identity.API/Services/ILoginService.cs delete mode 100644 src/Identity.API/Services/IRedirectService.cs delete mode 100644 src/Identity.API/Services/ProfileService.cs delete mode 100644 src/Identity.API/Services/RedirectService.cs delete mode 100644 src/Identity.API/UsersSeed.cs delete mode 100644 src/Identity.API/Views/Account/AccessDenied.cshtml delete mode 100644 src/Identity.API/Views/Account/LoggedOut.cshtml delete mode 100644 src/Identity.API/Views/Account/Login.cshtml delete mode 100644 src/Identity.API/Views/Account/Logout.cshtml delete mode 100644 src/Identity.API/Views/Consent/Index.cshtml delete mode 100644 src/Identity.API/Views/Device/Success.cshtml delete mode 100644 src/Identity.API/Views/Device/UserCodeCapture.cshtml delete mode 100644 src/Identity.API/Views/Device/UserCodeConfirmation.cshtml delete mode 100644 src/Identity.API/Views/Diagnostics/Index.cshtml delete mode 100644 src/Identity.API/Views/Grants/Index.cshtml delete mode 100644 src/Identity.API/Views/Home/Index.cshtml delete mode 100644 src/Identity.API/Views/Shared/Error.cshtml delete mode 100644 src/Identity.API/Views/Shared/Redirect.cshtml delete mode 100644 src/Identity.API/Views/Shared/_Layout.cshtml delete mode 100644 src/Identity.API/Views/Shared/_ScopeListItem.cshtml delete mode 100644 src/Identity.API/Views/Shared/_ValidationSummary.cshtml delete mode 100644 src/Identity.API/Views/_ViewImports.cshtml delete mode 100644 src/Identity.API/Views/_ViewStart.cshtml delete mode 100644 src/Identity.API/appsettings.Development.json delete mode 100644 src/Identity.API/appsettings.json delete mode 100644 src/Identity.API/bundleconfig.json delete mode 100644 src/Identity.API/libman.json delete mode 100644 src/Identity.API/tempkey.jwk delete mode 100644 src/Identity.API/wwwroot/_references.js delete mode 100644 src/Identity.API/wwwroot/css/site.css delete mode 100644 src/Identity.API/wwwroot/favicon.ico delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Bold.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Bold.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Bold.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Regular.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Regular.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Regular.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Regular.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Montserrat-Regular.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Bold.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Bold.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Bold.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Bold.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Bold.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-ExtraLight.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-ExtraLight.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-ExtraLight.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-ExtraLight.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-ExtraLight.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Light.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Light.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Light.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Light.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Light.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Medium.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Medium.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Medium.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Medium.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Medium.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Regular.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Regular.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Regular.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Regular.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-Regular.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-SemiBold.eot delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-SemiBold.svg delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-SemiBold.ttf delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-SemiBold.woff delete mode 100644 src/Identity.API/wwwroot/fonts/Oswald-SemiBold.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-200.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-200italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-300.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-300italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-500.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-500italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-600.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-600italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-700.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-700italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-800.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-800italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-italic.woff2 delete mode 100644 src/Identity.API/wwwroot/fonts/plus-jakarta-sans-v8-latin-regular.woff2 delete mode 100644 src/Identity.API/wwwroot/icon.jpg delete mode 100644 src/Identity.API/wwwroot/icon.png delete mode 100644 src/Identity.API/wwwroot/images/arrow-down.png delete mode 100644 src/Identity.API/wwwroot/images/arrow-right.svg delete mode 100644 src/Identity.API/wwwroot/images/banner.png delete mode 100644 src/Identity.API/wwwroot/images/banner1.svg delete mode 100644 src/Identity.API/wwwroot/images/banner2.svg delete mode 100644 src/Identity.API/wwwroot/images/banner3.svg delete mode 100644 src/Identity.API/wwwroot/images/banner4.svg delete mode 100644 src/Identity.API/wwwroot/images/brand.PNG delete mode 100644 src/Identity.API/wwwroot/images/brand_dark.PNG delete mode 100644 src/Identity.API/wwwroot/images/cart.png delete mode 100644 src/Identity.API/wwwroot/images/check.svg delete mode 100644 src/Identity.API/wwwroot/images/header.jpg delete mode 100644 src/Identity.API/wwwroot/images/logo-footer.svg delete mode 100644 src/Identity.API/wwwroot/images/logo-header.svg delete mode 100644 src/Identity.API/wwwroot/images/logo.svg delete mode 100644 src/Identity.API/wwwroot/images/logo_color.svg delete mode 100644 src/Identity.API/wwwroot/images/logout.PNG delete mode 100644 src/Identity.API/wwwroot/images/main_banner.png delete mode 100644 src/Identity.API/wwwroot/images/main_banner_text.png delete mode 100644 src/Identity.API/wwwroot/images/main_banner_text.svg delete mode 100644 src/Identity.API/wwwroot/images/main_footer_text.PNG delete mode 100644 src/Identity.API/wwwroot/images/my_orders.PNG delete mode 100644 src/Identity.API/wwwroot/images/refresh.svg delete mode 100644 src/Identity.API/wwwroot/js/signin-redirect.js delete mode 100644 src/Identity.API/wwwroot/js/signout-redirect.js delete mode 100644 src/Identity.API/wwwroot/js/site.js delete mode 100644 src/Identity.API/wwwroot/js/site.min.js diff --git a/Directory.Packages.props b/Directory.Packages.props index 7972531..c15d79b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -87,6 +87,7 @@ + diff --git a/eShop.sln b/eShop.sln index e254ab3..d5e0ae8 100644 --- a/eShop.sln +++ b/eShop.sln @@ -25,8 +25,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "eShop.ServiceDefaults", "sr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBus", "src\EventBus\EventBus.csproj", "{53FC1F8E-F56F-4245-A4DD-5100FEB380EC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Identity.API", "src\Identity.API\Identity.API.csproj", "{0A92921A-7B75-43C1-8A18-F3DE1D74C76E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IntegrationEventLogEF", "src\IntegrationEventLogEF\IntegrationEventLogEF.csproj", "{71B91168-EC19-4F90-8115-5C8CC2433832}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Bff.Shopping", "src\Mobile.Bff.Shopping\Mobile.Bff.Shopping.csproj", "{A6D9A9F5-E654-462F-A55F-320F386B163D}" @@ -95,10 +93,6 @@ Global {53FC1F8E-F56F-4245-A4DD-5100FEB380EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {53FC1F8E-F56F-4245-A4DD-5100FEB380EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {53FC1F8E-F56F-4245-A4DD-5100FEB380EC}.Release|Any CPU.Build.0 = Release|Any CPU - {0A92921A-7B75-43C1-8A18-F3DE1D74C76E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A92921A-7B75-43C1-8A18-F3DE1D74C76E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A92921A-7B75-43C1-8A18-F3DE1D74C76E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A92921A-7B75-43C1-8A18-F3DE1D74C76E}.Release|Any CPU.Build.0 = Release|Any CPU {71B91168-EC19-4F90-8115-5C8CC2433832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {71B91168-EC19-4F90-8115-5C8CC2433832}.Debug|Any CPU.Build.0 = Debug|Any CPU {71B91168-EC19-4F90-8115-5C8CC2433832}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -197,7 +191,6 @@ Global {65321F44-C60B-4F80-B0D4-55E14E23CDB8} = {932D8224-11F6-4D07-B109-DA28AD288A63} {CB04FF2E-F033-487F-8CC1-F2D3490F2187} = {932D8224-11F6-4D07-B109-DA28AD288A63} {53FC1F8E-F56F-4245-A4DD-5100FEB380EC} = {932D8224-11F6-4D07-B109-DA28AD288A63} - {0A92921A-7B75-43C1-8A18-F3DE1D74C76E} = {932D8224-11F6-4D07-B109-DA28AD288A63} {71B91168-EC19-4F90-8115-5C8CC2433832} = {932D8224-11F6-4D07-B109-DA28AD288A63} {A6D9A9F5-E654-462F-A55F-320F386B163D} = {932D8224-11F6-4D07-B109-DA28AD288A63} {C8BA83CE-480E-4CC7-9508-747A76671F63} = {932D8224-11F6-4D07-B109-DA28AD288A63} diff --git a/src/Basket.API/Grpc/BasketService.cs b/src/Basket.API/Grpc/BasketService.cs index 3f1deda..54a6ec1 100644 --- a/src/Basket.API/Grpc/BasketService.cs +++ b/src/Basket.API/Grpc/BasketService.cs @@ -2,9 +2,11 @@ using eShop.Basket.API.Repositories; using eShop.Basket.API.Extensions; using eShop.Basket.API.Model; +using Microsoft.Identity.Web.Resource; namespace eShop.Basket.API.Grpc; +[Authorize] public class BasketService( IBasketRepository repository, ILogger logger) : Basket.BasketBase @@ -33,6 +35,8 @@ public override async Task GetBasket(GetBasketRequest re return new(); } + [Authorize] + [RequiredScope(RequiredScopesConfigurationKey = "AzureAD:Scopes")] public override async Task UpdateBasket(UpdateBasketRequest request, ServerCallContext context) { var userId = context.GetUserIdentity(); @@ -56,6 +60,8 @@ public override async Task UpdateBasket(UpdateBasketRequ return MapToCustomerBasketResponse(response); } + [Authorize] + [RequiredScope(RequiredScopesConfigurationKey = "AzureAD:Scopes")] public override async Task DeleteBasket(DeleteBasketRequest request, ServerCallContext context) { var userId = context.GetUserIdentity(); diff --git a/src/Basket.API/appsettings.json b/src/Basket.API/appsettings.json index 7d42199..45c2186 100644 --- a/src/Basket.API/appsettings.json +++ b/src/Basket.API/appsettings.json @@ -15,9 +15,16 @@ "EventBus": "amqp://localhost" }, "Identity": { - "Audience": "basket" + "Audience": "https://localhost:7298/", + "Authority": "https://login.microsoftonline.com//v2.0/" }, "EventBus": { "SubscriptionClientName": "Basket" + }, + "AzureAd": { + "Instance": "https://login.microsoftonline.com/", + "TenantId": "", + "ClientId": "", + "Scopes": "basket" } -} +} \ No newline at end of file diff --git a/src/Identity.API/.gitignore b/src/Identity.API/.gitignore deleted file mode 100644 index ce33b6a..0000000 --- a/src/Identity.API/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -wwwroot/lib/ -keys/ diff --git a/src/Identity.API/Configuration/Config.cs b/src/Identity.API/Configuration/Config.cs deleted file mode 100644 index a3afeca..0000000 --- a/src/Identity.API/Configuration/Config.cs +++ /dev/null @@ -1,189 +0,0 @@ -namespace eShop.Identity.API.Configuration -{ - public class Config - { - // ApiResources define the apis in your system - public static IEnumerable GetApis() - { - return new List - { - new ApiResource("orders", "Orders Service"), - new ApiResource("basket", "Basket Service"), - new ApiResource("webhooks", "Webhooks registration Service"), - }; - } - - // ApiScope is used to protect the API - //The effect is the same as that of API resources in IdentityServer 3.x - public static IEnumerable GetApiScopes() - { - return new List - { - new ApiScope("orders", "Orders Service"), - new ApiScope("basket", "Basket Service"), - new ApiScope("webhooks", "Webhooks registration Service"), - }; - } - - // Identity resources are data like user ID, name, or email address of a user - // see: http://docs.identityserver.io/en/release/configuration/resources.html - public static IEnumerable GetResources() - { - return new List - { - new IdentityResources.OpenId(), - new IdentityResources.Profile() - }; - } - - // client want to access resources (aka scopes) - public static IEnumerable GetClients(IConfiguration configuration) - { - return new List - { - new Client - { - ClientId = "xamarin", - ClientName = "eShop Xamarin OpenId Client", - AllowedGrantTypes = GrantTypes.Hybrid, - //Used to retrieve the access token on the back channel. - ClientSecrets = - { - new Secret("secret".Sha256()) - }, - RedirectUris = { configuration["XamarinCallback"] }, - RequireConsent = false, - RequirePkce = true, - PostLogoutRedirectUris = { $"{configuration["XamarinCallback"]}/Account/Redirecting" }, - //AllowedCorsOrigins = { "http://eshopxamarin" }, - AllowedScopes = new List - { - IdentityServerConstants.StandardScopes.OpenId, - IdentityServerConstants.StandardScopes.Profile, - IdentityServerConstants.StandardScopes.OfflineAccess, - "orders", - "basket", - "mobileshoppingagg", - "webhooks" - }, - //Allow requesting refresh tokens for long lived API access - AllowOfflineAccess = true, - AllowAccessTokensViaBrowser = true - }, - new Client - { - ClientId = "webapp", - ClientName = "WebApp Client", - ClientSecrets = new List - { - new Secret("secret".Sha256()) - }, - ClientUri = $"{configuration["WebAppClient"]}", // public uri of the client - AllowedGrantTypes = GrantTypes.Code, - AllowAccessTokensViaBrowser = false, - RequireConsent = false, - AllowOfflineAccess = true, - AlwaysIncludeUserClaimsInIdToken = true, - RequirePkce = false, - RedirectUris = new List - { - $"{configuration["WebAppClient"]}/signin-oidc" - }, - PostLogoutRedirectUris = new List - { - $"{configuration["WebAppClient"]}/signout-callback-oidc" - }, - AllowedScopes = new List - { - IdentityServerConstants.StandardScopes.OpenId, - IdentityServerConstants.StandardScopes.Profile, - IdentityServerConstants.StandardScopes.OfflineAccess, - "orders", - "basket", - "webshoppingagg", - "webhooks" - }, - AccessTokenLifetime = 60*60*2, // 2 hours - IdentityTokenLifetime= 60*60*2 // 2 hours - }, - new Client - { - ClientId = "webhooksclient", - ClientName = "Webhooks Client", - ClientSecrets = new List - { - new Secret("secret".Sha256()) - }, - ClientUri = $"{configuration["WebhooksWebClient"]}", // public uri of the client - AllowedGrantTypes = GrantTypes.Code, - AllowAccessTokensViaBrowser = false, - RequireConsent = false, - AllowOfflineAccess = true, - AlwaysIncludeUserClaimsInIdToken = true, - RedirectUris = new List - { - $"{configuration["WebhooksWebClient"]}/signin-oidc" - }, - PostLogoutRedirectUris = new List - { - $"{configuration["WebhooksWebClient"]}/signout-callback-oidc" - }, - AllowedScopes = new List - { - IdentityServerConstants.StandardScopes.OpenId, - IdentityServerConstants.StandardScopes.Profile, - IdentityServerConstants.StandardScopes.OfflineAccess, - "webhooks" - }, - AccessTokenLifetime = 60*60*2, // 2 hours - IdentityTokenLifetime= 60*60*2 // 2 hours - }, - new Client - { - ClientId = "basketswaggerui", - ClientName = "Basket Swagger UI", - AllowedGrantTypes = GrantTypes.Implicit, - AllowAccessTokensViaBrowser = true, - - RedirectUris = { $"{configuration["BasketApiClient"]}/swagger/oauth2-redirect.html" }, - PostLogoutRedirectUris = { $"{configuration["BasketApiClient"]}/swagger/" }, - - AllowedScopes = - { - "basket" - } - }, - new Client - { - ClientId = "orderingswaggerui", - ClientName = "Ordering Swagger UI", - AllowedGrantTypes = GrantTypes.Implicit, - AllowAccessTokensViaBrowser = true, - - RedirectUris = { $"{configuration["OrderingApiClient"]}/swagger/oauth2-redirect.html" }, - PostLogoutRedirectUris = { $"{configuration["OrderingApiClient"]}/swagger/" }, - - AllowedScopes = - { - "orders" - } - }, - new Client - { - ClientId = "webhooksswaggerui", - ClientName = "WebHooks Service Swagger UI", - AllowedGrantTypes = GrantTypes.Implicit, - AllowAccessTokensViaBrowser = true, - - RedirectUris = { $"{configuration["WebhooksApiClient"]}/swagger/oauth2-redirect.html" }, - PostLogoutRedirectUris = { $"{configuration["WebhooksApiClient"]}/swagger/" }, - - AllowedScopes = - { - "webhooks" - } - } - }; - } - } -} diff --git a/src/Identity.API/Data/ApplicationDbContext.cs b/src/Identity.API/Data/ApplicationDbContext.cs deleted file mode 100644 index 5b51ebb..0000000 --- a/src/Identity.API/Data/ApplicationDbContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace eShop.Identity.API.Data; - -/// -/// Add migrations using the following command inside the 'Identity.API' project directory: -/// -/// dotnet ef migrations add [migration-name] -/// -public class ApplicationDbContext : IdentityDbContext -{ - public ApplicationDbContext(DbContextOptions options) - : base(options) - { - } - - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); - // Customize the ASP.NET Identity model and override the defaults if needed. - // For example, you can rename the ASP.NET Identity table names and more. - // Add your customizations after calling base.OnModelCreating(builder); - } -} diff --git a/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.Designer.cs b/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.Designer.cs deleted file mode 100644 index df66115..0000000 --- a/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.Designer.cs +++ /dev/null @@ -1,324 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using eShop.Identity.API.Data; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace eShop.Identity.API.Data.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20230925223402_InitialMigration")] - partial class InitialMigration - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("eShop.Identity.API.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("CardHolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardType") - .HasColumnType("integer"); - - b.Property("City") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Country") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("Expiration") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("State") - .IsRequired() - .HasColumnType("text"); - - b.Property("Street") - .IsRequired() - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ZipCode") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.cs b/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.cs deleted file mode 100644 index 2f28ed1..0000000 --- a/src/Identity.API/Data/Migrations/20230925223402_InitialMigration.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace eShop.Identity.API.Data.Migrations -{ - /// - public partial class InitialMigration : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - CardNumber = table.Column(type: "text", nullable: false), - SecurityNumber = table.Column(type: "text", nullable: false), - Expiration = table.Column(type: "text", nullable: false), - CardHolderName = table.Column(type: "text", nullable: false), - CardType = table.Column(type: "integer", nullable: false), - Street = table.Column(type: "text", nullable: false), - City = table.Column(type: "text", nullable: false), - State = table.Column(type: "text", nullable: false), - Country = table.Column(type: "text", nullable: false), - ZipCode = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - LastName = table.Column(type: "text", nullable: false), - UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "boolean", nullable: false), - PasswordHash = table.Column(type: "text", nullable: true), - SecurityStamp = table.Column(type: "text", nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true), - PhoneNumber = table.Column(type: "text", nullable: true), - PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), - TwoFactorEnabled = table.Column(type: "boolean", nullable: false), - LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), - LockoutEnabled = table.Column(type: "boolean", nullable: false), - AccessFailedCount = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - RoleId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "text", nullable: false), - ProviderKey = table.Column(type: "text", nullable: false), - ProviderDisplayName = table.Column(type: "text", nullable: true), - UserId = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - RoleId = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - LoginProvider = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs deleted file mode 100644 index 92d3a09..0000000 --- a/src/Identity.API/Data/Migrations/ApplicationDbContextModelSnapshot.cs +++ /dev/null @@ -1,321 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using eShop.Identity.API.Data; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace eShop.Identity.API.Data.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - partial class ApplicationDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("eShop.Identity.API.Models.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("CardHolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("CardType") - .HasColumnType("integer"); - - b.Property("City") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Country") - .IsRequired() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("Expiration") - .IsRequired() - .HasColumnType("text"); - - b.Property("LastName") - .IsRequired() - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityNumber") - .IsRequired() - .HasColumnType("text"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("State") - .IsRequired() - .HasColumnType("text"); - - b.Property("Street") - .IsRequired() - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ZipCode") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("eShop.Identity.API.Models.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Identity.API/GlobalUsings.cs b/src/Identity.API/GlobalUsings.cs deleted file mode 100644 index 6de6883..0000000 --- a/src/Identity.API/GlobalUsings.cs +++ /dev/null @@ -1,156 +0,0 @@ -global using System; -global using System.Collections.Generic; -global using System.ComponentModel.DataAnnotations; -global using System.IdentityModel.Tokens.Jwt; -global using System.Linq; -global using System.Security.Claims; -global using System.Text.RegularExpressions; -global using System.Threading.Tasks; -global using Duende.IdentityServer; -global using Duende.IdentityServer.Configuration; -global using Duende.IdentityServer.Events; -global using Duende.IdentityServer.Extensions; -global using Duende.IdentityServer.Models; -global using Duende.IdentityServer.Services; -global using Duende.IdentityServer.Stores; -global using Duende.IdentityServer.Validation; -global using IdentityModel; -global using Microsoft.AspNetCore.Authentication; -global using Microsoft.AspNetCore.Authorization; -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.AspNetCore.Http; -global using Microsoft.AspNetCore.Identity; -global using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -global using Microsoft.AspNetCore.Mvc; -global using Microsoft.AspNetCore.Mvc.Filters; -global using Microsoft.AspNetCore.Mvc.Rendering; -global using Microsoft.EntityFrameworkCore; -global using Microsoft.EntityFrameworkCore.Infrastructure; -global using Microsoft.EntityFrameworkCore.Metadata; -global using Microsoft.EntityFrameworkCore.Migrations; -global using eShop.Identity.API; -global using eShop.Identity.API.Configuration; -global using eShop.Identity.API.Data; -global using eShop.Identity.API.Models; -global using eShop.Identity.API.Services; -global using Microsoft.Extensions.Configuration; -global using Microsoft.Extensions.DependencyInjection; -global using Microsoft.Extensions.Hosting; -global using Microsoft.Extensions.Logging; -global using Microsoft.Extensions.Options; -global using Polly; -global using eShop.ServiceDefaults; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Identity.API/Identity.API.csproj b/src/Identity.API/Identity.API.csproj deleted file mode 100644 index 5a3b4f8..0000000 --- a/src/Identity.API/Identity.API.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - net8.0 - aspnet-eShopOnContainers.Identity-90487118-103c-4ff0-b9da-e5e26f7ab0c5 - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs b/src/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs deleted file mode 100644 index 5f78272..0000000 --- a/src/Identity.API/Models/AccountViewModels/ForgotPasswordViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record ForgotPasswordViewModel - { - [Required] - [EmailAddress] - public string Email { get; init; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs b/src/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs deleted file mode 100644 index 63d60ce..0000000 --- a/src/Identity.API/Models/AccountViewModels/LoggedOutViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record LoggedOutViewModel - { - public string PostLogoutRedirectUri { get; init; } - public string ClientName { get; init; } - public string SignOutIframeUrl { get; init; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/LoginViewModel.cs b/src/Identity.API/Models/AccountViewModels/LoginViewModel.cs deleted file mode 100644 index 0467417..0000000 --- a/src/Identity.API/Models/AccountViewModels/LoginViewModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record LoginViewModel - { - [Required] - [EmailAddress] - public string Email { get; set; } - - [Required] - [DataType(DataType.Password)] - public string Password { get; set; } - - [Display(Name = "Remember me?")] - public bool RememberMe { get; set; } - public string ReturnUrl { get; set; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/LogoutViewModel.cs b/src/Identity.API/Models/AccountViewModels/LogoutViewModel.cs deleted file mode 100644 index d202bef..0000000 --- a/src/Identity.API/Models/AccountViewModels/LogoutViewModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record LogoutViewModel - { - public string LogoutId { get; set; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/RedirectViewModel.cs b/src/Identity.API/Models/AccountViewModels/RedirectViewModel.cs deleted file mode 100644 index 4da3be9..0000000 --- a/src/Identity.API/Models/AccountViewModels/RedirectViewModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public class RedirectViewModel - { - public string RedirectUrl { get; set; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/RegisterViewModel.cs b/src/Identity.API/Models/AccountViewModels/RegisterViewModel.cs deleted file mode 100644 index 9c47f79..0000000 --- a/src/Identity.API/Models/AccountViewModels/RegisterViewModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record RegisterViewModel - { - [Required] - [EmailAddress] - [Display(Name = "Email")] - public string Email { get; init; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; init; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm password")] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string ConfirmPassword { get; init; } - - public ApplicationUser User { get; init; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs b/src/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs deleted file mode 100644 index ced1c9c..0000000 --- a/src/Identity.API/Models/AccountViewModels/ResetPasswordViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record ResetPasswordViewModel - { - [Required] - [EmailAddress] - public string Email { get; init; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - public string Password { get; init; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm password")] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string ConfirmPassword { get; init; } - - public string Code { get; init; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs b/src/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs deleted file mode 100644 index 195ac1d..0000000 --- a/src/Identity.API/Models/AccountViewModels/SendCodeViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record SendCodeViewModel - { - public string SelectedProvider { get; init; } - - public ICollection Providers { get; init; } - - public string ReturnUrl { get; init; } - - public bool RememberMe { get; init; } - } -} diff --git a/src/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs b/src/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs deleted file mode 100644 index f207380..0000000 --- a/src/Identity.API/Models/AccountViewModels/VerifyCodeViewModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace eShop.Identity.API.Models.AccountViewModels -{ - public record VerifyCodeViewModel - { - [Required] - public string Provider { get; init; } - - [Required] - public string Code { get; init; } - - public string ReturnUrl { get; init; } - - [Display(Name = "Remember this browser?")] - public bool RememberBrowser { get; init; } - - [Display(Name = "Remember me?")] - public bool RememberMe { get; init; } - } -} diff --git a/src/Identity.API/Models/ApplicationUser.cs b/src/Identity.API/Models/ApplicationUser.cs deleted file mode 100644 index 11a151a..0000000 --- a/src/Identity.API/Models/ApplicationUser.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace eShop.Identity.API.Models -{ - // Add profile data for application users by adding properties to the ApplicationUser class - public class ApplicationUser : IdentityUser - { - [Required] - public string CardNumber { get; set; } - [Required] - public string SecurityNumber { get; set; } - [Required] - [RegularExpression(@"(0[1-9]|1[0-2])\/[0-9]{2}", ErrorMessage = "Expiration should match a valid MM/YY value")] - public string Expiration { get; set; } - [Required] - public string CardHolderName { get; set; } - public int CardType { get; set; } - [Required] - public string Street { get; set; } - [Required] - public string City { get; set; } - [Required] - public string State { get; set; } - [Required] - public string Country { get; set; } - [Required] - public string ZipCode { get; set; } - [Required] - public string Name { get; set; } - [Required] - public string LastName { get; set; } - } -} diff --git a/src/Identity.API/Models/ConsentViewModels/ConsentInputModel.cs b/src/Identity.API/Models/ConsentViewModels/ConsentInputModel.cs deleted file mode 100644 index 7edde46..0000000 --- a/src/Identity.API/Models/ConsentViewModels/ConsentInputModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace eShop.Identity.API.Models.ConsentViewModels -{ - public class ConsentInputModel - { - public string Button { get; set; } - public IEnumerable ScopesConsented { get; set; } - public bool RememberConsent { get; set; } - public string ReturnUrl { get; set; } - public string Description { get; set; } - } -} diff --git a/src/Identity.API/Models/ConsentViewModels/ConsentOptions.cs b/src/Identity.API/Models/ConsentViewModels/ConsentOptions.cs deleted file mode 100644 index 765c354..0000000 --- a/src/Identity.API/Models/ConsentViewModels/ConsentOptions.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace eShop.Identity.API.Models.ConsentViewModels -{ - public class ConsentOptions - { - public static bool EnableOfflineAccess = true; - public static string OfflineAccessDisplayName = "Offline Access"; - public static string OfflineAccessDescription = "Access to your applications and resources, even when you are offline"; - - public static readonly string MustChooseOneErrorMessage = "You must pick at least one permission"; - public static readonly string InvalidSelectionErrorMessage = "Invalid selection"; - } -} diff --git a/src/Identity.API/Models/ConsentViewModels/ConsentViewModel.cs b/src/Identity.API/Models/ConsentViewModels/ConsentViewModel.cs deleted file mode 100644 index 07cc706..0000000 --- a/src/Identity.API/Models/ConsentViewModels/ConsentViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace eShop.Identity.API.Models.ConsentViewModels -{ - public class ConsentViewModel : ConsentInputModel - { - public string ClientName { get; set; } - public string ClientUrl { get; set; } - public string ClientLogoUrl { get; set; } - public bool AllowRememberConsent { get; set; } - - public IEnumerable IdentityScopes { get; set; } - public IEnumerable ApiScopes { get; set; } - } -} diff --git a/src/Identity.API/Models/ConsentViewModels/ProcessConsentResult.cs b/src/Identity.API/Models/ConsentViewModels/ProcessConsentResult.cs deleted file mode 100644 index 44d0fa8..0000000 --- a/src/Identity.API/Models/ConsentViewModels/ProcessConsentResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace eShop.Identity.API.Models.ConsentViewModels -{ - public class ProcessConsentResult - { - public bool IsRedirect => RedirectUri != null; - public string RedirectUri { get; set; } - public Client Client { get; set; } - - public bool ShowView => ViewModel != null; - public ConsentViewModel ViewModel { get; set; } - - public bool HasValidationError => ValidationError != null; - public string ValidationError { get; set; } - } -} diff --git a/src/Identity.API/Models/ConsentViewModels/ScopeViewModel.cs b/src/Identity.API/Models/ConsentViewModels/ScopeViewModel.cs deleted file mode 100644 index 9ca8260..0000000 --- a/src/Identity.API/Models/ConsentViewModels/ScopeViewModel.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace eShop.Identity.API.Models.ConsentViewModels -{ - public class ScopeViewModel - { - public string Value { get; set; } - public string DisplayName { get; set; } - public string Description { get; set; } - public bool Emphasize { get; set; } - public bool Required { get; set; } - public bool Checked { get; set; } - } -} diff --git a/src/Identity.API/Models/ErrorViewModel.cs b/src/Identity.API/Models/ErrorViewModel.cs deleted file mode 100644 index 0cf0caa..0000000 --- a/src/Identity.API/Models/ErrorViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. -namespace eShop.Identity.API.Models -{ - public record ErrorViewModel - { - public ErrorMessage Error { get; set; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs b/src/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs deleted file mode 100644 index fc3bf7f..0000000 --- a/src/Identity.API/Models/ManageViewModels/AddPhoneNumberViewModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record AddPhoneNumberViewModel - { - [Required] - [Phone] - [Display(Name = "Phone number")] - public string PhoneNumber { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs b/src/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs deleted file mode 100644 index f7a909b..0000000 --- a/src/Identity.API/Models/ManageViewModels/ChangePasswordViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record ChangePasswordViewModel - { - [Required] - [DataType(DataType.Password)] - [Display(Name = "Current password")] - public string OldPassword { get; init; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "New password")] - public string NewPassword { get; init; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm new password")] - [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] - public string ConfirmPassword { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs b/src/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs deleted file mode 100644 index bdc4ce7..0000000 --- a/src/Identity.API/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record ConfigureTwoFactorViewModel - { - public string SelectedProvider { get; init; } - - public ICollection Providers { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/FactorViewModel.cs b/src/Identity.API/Models/ManageViewModels/FactorViewModel.cs deleted file mode 100644 index f181b80..0000000 --- a/src/Identity.API/Models/ManageViewModels/FactorViewModel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record FactorViewModel - { - public string Purpose { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/IndexViewModel.cs b/src/Identity.API/Models/ManageViewModels/IndexViewModel.cs deleted file mode 100644 index e107f33..0000000 --- a/src/Identity.API/Models/ManageViewModels/IndexViewModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record IndexViewModel - { - public bool HasPassword { get; init; } - - public IList Logins { get; init; } - - public string PhoneNumber { get; init; } - - public bool TwoFactor { get; init; } - - public bool BrowserRemembered { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs b/src/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs deleted file mode 100644 index 893f7b8..0000000 --- a/src/Identity.API/Models/ManageViewModels/SetPasswordViewModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record SetPasswordViewModel - { - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "New password")] - public string NewPassword { get; init; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm new password")] - [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] - public string ConfirmPassword { get; init; } - } -} diff --git a/src/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs b/src/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs deleted file mode 100644 index 4c9d047..0000000 --- a/src/Identity.API/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace eShop.Identity.API.Models.ManageViewModels -{ - public record VerifyPhoneNumberViewModel - { - [Required] - public string Code { get; init; } - - [Required] - [Phone] - [Display(Name = "Phone number")] - public string PhoneNumber { get; init; } - } -} diff --git a/src/Identity.API/Program.cs b/src/Identity.API/Program.cs deleted file mode 100644 index 31f101f..0000000 --- a/src/Identity.API/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -var builder = WebApplication.CreateBuilder(args); - -builder.AddServiceDefaults(); - -builder.Services.AddControllersWithViews(); - -builder.AddNpgsqlDbContext("IdentityDB"); - -// Apply database migration automatically. Note that this approach is not -// recommended for production scenarios. Consider generating SQL scripts from -// migrations instead. -builder.Services.AddMigration(); - -builder.Services.AddIdentity() - .AddEntityFrameworkStores() - .AddDefaultTokenProviders(); - -builder.Services.AddIdentityServer(options => -{ - options.IssuerUri = "null"; - options.Authentication.CookieLifetime = TimeSpan.FromHours(2); - - options.Events.RaiseErrorEvents = true; - options.Events.RaiseInformationEvents = true; - options.Events.RaiseFailureEvents = true; - options.Events.RaiseSuccessEvents = true; -}) -.AddInMemoryIdentityResources(Config.GetResources()) -.AddInMemoryApiScopes(Config.GetApiScopes()) -.AddInMemoryApiResources(Config.GetApis()) -.AddInMemoryClients(Config.GetClients(builder.Configuration)) -.AddAspNetIdentity() -.AddDeveloperSigningCredential(); // Not recommended for production - you need to store your key material somewhere secure - -builder.Services.AddTransient(); -builder.Services.AddTransient, EFLoginService>(); -builder.Services.AddTransient(); - -var app = builder.Build(); - -app.MapDefaultEndpoints(); - -app.UseStaticFiles(); - -// This cookie policy fixes login issues with Chrome 80+ using HTTP -app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.Lax }); -app.UseRouting(); -app.UseIdentityServer(); -app.UseAuthorization(); - -app.MapDefaultControllerRoute(); - -app.Run(); diff --git a/src/Identity.API/Properties/launchSettings.json b/src/Identity.API/Properties/launchSettings.json deleted file mode 100644 index 4976a7a..0000000 --- a/src/Identity.API/Properties/launchSettings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "profiles": { - "http": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:5223", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/src/Identity.API/Quickstart/Account/AccountController.cs b/src/Identity.API/Quickstart/Account/AccountController.cs deleted file mode 100644 index e0aef7b..0000000 --- a/src/Identity.API/Quickstart/Account/AccountController.cs +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI -{ - [SecurityHeaders] - [AllowAnonymous] - public class AccountController : Controller - { - private readonly UserManager _userManager; - private readonly SignInManager _signInManager; - private readonly IIdentityServerInteractionService _interaction; - private readonly IClientStore _clientStore; - private readonly IAuthenticationSchemeProvider _schemeProvider; - private readonly IAuthenticationHandlerProvider _handlerProvider; - private readonly IEventService _events; - - public AccountController( - UserManager userManager, - SignInManager signInManager, - IIdentityServerInteractionService interaction, - IClientStore clientStore, - IAuthenticationSchemeProvider schemeProvider, - IAuthenticationHandlerProvider handlerProvider, - IEventService events) - { - _userManager = userManager; - _signInManager = signInManager; - _interaction = interaction; - _clientStore = clientStore; - _schemeProvider = schemeProvider; - _handlerProvider = handlerProvider; - _events = events; - } - - /// - /// Entry point into the login workflow - /// - [HttpGet] - public async Task Login(string returnUrl) - { - // build a model so we know what to show on the login page - var vm = await BuildLoginViewModelAsync(returnUrl); - - ViewData["ReturnUrl"] = returnUrl; - - if (vm.IsExternalLoginOnly) - { - // we only have one option for logging in and it's an external provider - return RedirectToAction("Challenge", "External", new { scheme = vm.ExternalLoginScheme, returnUrl }); - } - - return View(vm); - } - - /// - /// Handle postback from username/password login - /// - [HttpPost] - [ValidateAntiForgeryToken] - public async Task Login(LoginInputModel model, string button) - { - // check if we are in the context of an authorization request - var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl); - - // the user clicked the "cancel" button - if (button != "login") - { - if (context != null) - { - // if the user cancels, send a result back into IdentityServer as if they - // denied the consent (even if this client does not require consent). - // this will send back an access denied OIDC error response to the client. - await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied); - - // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null - if (context.IsNativeClient()) - { - // The client is native, so this change in how to - // return the response is for better UX for the end user. - return this.LoadingPage("Redirect", model.ReturnUrl); - } - - return Redirect(model.ReturnUrl); - } - else - { - // since we don't have a valid context, then we just go back to the home page - return Redirect("~/"); - } - } - - if (ModelState.IsValid) - { - var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberLogin, lockoutOnFailure: true); - if (result.Succeeded) - { - var user = await _userManager.FindByNameAsync(model.Username); - await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id, user.UserName, clientId: context?.Client.ClientId)); - - if (context != null) - { - if (context.IsNativeClient()) - { - // The client is native, so this change in how to - // return the response is for better UX for the end user. - return this.LoadingPage("Redirect", model.ReturnUrl); - } - - // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null - return Redirect(model.ReturnUrl); - } - - // request for a local page - if (Url.IsLocalUrl(model.ReturnUrl)) - { - return Redirect(model.ReturnUrl); - } - else if (string.IsNullOrEmpty(model.ReturnUrl)) - { - return Redirect("~/"); - } - else - { - // user might have clicked on a malicious link - should be logged - throw new Exception("invalid return URL"); - } - } - - await _events.RaiseAsync(new UserLoginFailureEvent(model.Username, "invalid credentials", clientId: context?.Client.ClientId)); - ModelState.AddModelError(string.Empty, AccountOptions.InvalidCredentialsErrorMessage); - } - - // something went wrong, show form with error - var vm = await BuildLoginViewModelAsync(model); - - ViewData["ReturnUrl"] = model.ReturnUrl; - - return View(vm); - } - - - /// - /// Show logout page - /// - [HttpGet] - public async Task Logout(string logoutId) - { - // build a model so the logout page knows what to display - var vm = await BuildLogoutViewModelAsync(logoutId); - - if (vm.ShowLogoutPrompt == false) - { - // if the request for logout was properly authenticated from IdentityServer, then - // we don't need to show the prompt and can just log the user out directly. - return await Logout(vm); - } - - return View(vm); - } - - /// - /// Handle logout page postback - /// - [HttpPost] - [ValidateAntiForgeryToken] - public async Task Logout(LogoutInputModel model) - { - // build a model so the logged out page knows what to display - var vm = await BuildLoggedOutViewModelAsync(model.LogoutId); - - if (User?.Identity.IsAuthenticated == true) - { - // delete local authentication cookie - await _signInManager.SignOutAsync(); - - // raise the logout event - await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName())); - } - - // check if we need to trigger sign-out at an upstream identity provider - if (vm.TriggerExternalSignout) - { - // build a return URL so the upstream provider will redirect back - // to us after the user has logged out. this allows us to then - // complete our single sign-out processing. - string url = Url.Action("Logout", new { logoutId = vm.LogoutId }); - - // this triggers a redirect to the external provider for sign-out - return SignOut(new AuthenticationProperties { RedirectUri = url }, vm.ExternalAuthenticationScheme); - } - - return View("LoggedOut", vm); - } - - [HttpGet] - public IActionResult AccessDenied() - { - return View(); - } - - - /*****************************************/ - /* helper APIs for the AccountController */ - /*****************************************/ - private async Task BuildLoginViewModelAsync(string returnUrl) - { - var context = await _interaction.GetAuthorizationContextAsync(returnUrl); - if (context?.IdP != null && await _schemeProvider.GetSchemeAsync(context.IdP) != null) - { - var local = context.IdP == IdentityServerConstants.LocalIdentityProvider; - - // this is meant to short circuit the UI and only trigger the one external IdP - var vm = new LoginViewModel - { - EnableLocalLogin = local, - ReturnUrl = returnUrl, - Username = context?.LoginHint, - }; - - if (!local) - { - vm.ExternalProviders = new[] { new ExternalProvider { AuthenticationScheme = context.IdP } }; - } - - return vm; - } - - var schemes = await _schemeProvider.GetAllSchemesAsync(); - - var providers = schemes - .Where(x => x.DisplayName != null) - .Select(x => new ExternalProvider - { - DisplayName = x.DisplayName ?? x.Name, - AuthenticationScheme = x.Name - }).ToList(); - - var allowLocal = true; - if (context?.Client.ClientId != null) - { - var client = await _clientStore.FindEnabledClientByIdAsync(context.Client.ClientId); - if (client != null) - { - allowLocal = client.EnableLocalLogin; - - if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any()) - { - providers = providers.Where(provider => client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)).ToList(); - } - } - } - - return new LoginViewModel - { - AllowRememberLogin = AccountOptions.AllowRememberLogin, - EnableLocalLogin = allowLocal && AccountOptions.AllowLocalLogin, - ReturnUrl = returnUrl, - Username = context?.LoginHint, - ExternalProviders = providers.ToArray() - }; - } - - private async Task BuildLoginViewModelAsync(LoginInputModel model) - { - var vm = await BuildLoginViewModelAsync(model.ReturnUrl); - vm.Username = model.Username; - vm.RememberLogin = model.RememberLogin; - return vm; - } - - private async Task BuildLogoutViewModelAsync(string logoutId) - { - var vm = new LogoutViewModel { LogoutId = logoutId, ShowLogoutPrompt = AccountOptions.ShowLogoutPrompt }; - - if (User?.Identity.IsAuthenticated != true) - { - // if the user is not authenticated, then just show logged out page - vm.ShowLogoutPrompt = false; - return vm; - } - - var context = await _interaction.GetLogoutContextAsync(logoutId); - if (context?.ShowSignoutPrompt == false) - { - // it's safe to automatically sign-out - vm.ShowLogoutPrompt = false; - return vm; - } - - // show the logout prompt. this prevents attacks where the user - // is automatically signed out by another malicious web page. - return vm; - } - - private async Task BuildLoggedOutViewModelAsync(string logoutId) - { - // get context information (client name, post logout redirect URI and iframe for federated signout) - var logout = await _interaction.GetLogoutContextAsync(logoutId); - - var vm = new LoggedOutViewModel - { - AutomaticRedirectAfterSignOut = AccountOptions.AutomaticRedirectAfterSignOut, - PostLogoutRedirectUri = logout?.PostLogoutRedirectUri, - ClientName = string.IsNullOrEmpty(logout?.ClientName) ? logout?.ClientId : logout?.ClientName, - SignOutIframeUrl = logout?.SignOutIFrameUrl, - LogoutId = logoutId - }; - - if (User?.Identity.IsAuthenticated == true) - { - var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value; - if (idp != null && idp != IdentityServerConstants.LocalIdentityProvider) - { - var handler = await _handlerProvider.GetHandlerAsync(HttpContext, idp); - if (handler is IAuthenticationSignOutHandler) - { - if (vm.LogoutId == null) - { - // if there's no current logout context, we need to create one - // this captures necessary info from the current logged in user - // before we signout and redirect away to the external IdP for signout - vm.LogoutId = await _interaction.CreateLogoutContextAsync(); - } - - vm.ExternalAuthenticationScheme = idp; - } - } - } - - return vm; - } - } -} \ No newline at end of file diff --git a/src/Identity.API/Quickstart/Account/AccountOptions.cs b/src/Identity.API/Quickstart/Account/AccountOptions.cs deleted file mode 100644 index 00ef16b..0000000 --- a/src/Identity.API/Quickstart/Account/AccountOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -public class AccountOptions -{ - public static bool AllowLocalLogin = true; - public static bool AllowRememberLogin = true; - public static TimeSpan RememberMeLoginDuration = TimeSpan.FromDays(30); - - public static bool ShowLogoutPrompt = false; - public static bool AutomaticRedirectAfterSignOut = true; - - public static string InvalidCredentialsErrorMessage = "Invalid username or password"; -} diff --git a/src/Identity.API/Quickstart/Account/ExternalController.cs b/src/Identity.API/Quickstart/Account/ExternalController.cs deleted file mode 100644 index 5abc2fa..0000000 --- a/src/Identity.API/Quickstart/Account/ExternalController.cs +++ /dev/null @@ -1,238 +0,0 @@ -namespace IdentityServerHost.Quickstart.UI; - -[SecurityHeaders] -[AllowAnonymous] -public class ExternalController : Controller -{ - private readonly UserManager _userManager; - private readonly SignInManager _signInManager; - private readonly IIdentityServerInteractionService _interaction; - private readonly IClientStore _clientStore; - private readonly IEventService _events; - private readonly ILogger _logger; - - public ExternalController( - UserManager userManager, - SignInManager signInManager, - IIdentityServerInteractionService interaction, - IClientStore clientStore, - IEventService events, - ILogger logger) - { - _userManager = userManager; - _signInManager = signInManager; - _interaction = interaction; - _clientStore = clientStore; - _events = events; - _logger = logger; - } - - /// - /// initiate roundtrip to external authentication provider - /// - [HttpGet] - public IActionResult Challenge(string scheme, string returnUrl) - { - if (string.IsNullOrEmpty(returnUrl)) returnUrl = "~/"; - - // validate returnUrl - either it is a valid OIDC URL or back to a local page - if (Url.IsLocalUrl(returnUrl) == false && _interaction.IsValidReturnUrl(returnUrl) == false) - { - // user might have clicked on a malicious link - should be logged - throw new Exception("invalid return URL"); - } - - // start challenge and roundtrip the return URL and scheme - var props = new AuthenticationProperties - { - RedirectUri = Url.Action(nameof(Callback)), - Items = - { - { "returnUrl", returnUrl }, - { "scheme", scheme }, - } - }; - - return Challenge(props, scheme); - - } - - /// - /// Post processing of external authentication - /// - [HttpGet] - public async Task Callback() - { - // read external identity from the temporary cookie - var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme); - if (result?.Succeeded != true) - { - throw new Exception("External authentication error"); - } - - if (_logger.IsEnabled(LogLevel.Debug)) - { - var externalClaims = result.Principal.Claims.Select(c => $"{c.Type}: {c.Value}"); - _logger.LogDebug("External claims: {@claims}", externalClaims); - } - - // lookup our user and external provider info - var (user, provider, providerUserId, claims) = await FindUserFromExternalProviderAsync(result); - if (user == null) - { - // this might be where you might initiate a custom workflow for user registration - // in this sample we don't show how that would be done, as our sample implementation - // simply auto-provisions new external user - user = await AutoProvisionUserAsync(provider, providerUserId, claims); - } - - // this allows us to collect any additional claims or properties - // for the specific protocols used and store them in the local auth cookie. - // this is typically used to store data needed for signout from those protocols. - var additionalLocalClaims = new List(); - var localSignInProps = new AuthenticationProperties(); - ProcessLoginCallback(result, additionalLocalClaims, localSignInProps); - - // issue authentication cookie for user - // we must issue the cookie maually, and can't use the SignInManager because - // it doesn't expose an API to issue additional claims from the login workflow - var principal = await _signInManager.CreateUserPrincipalAsync(user); - additionalLocalClaims.AddRange(principal.Claims); - var name = principal.FindFirst(JwtClaimTypes.Name)?.Value ?? user.Id; - - var isuser = new IdentityServerUser(user.Id) - { - DisplayName = name, - IdentityProvider = provider, - AdditionalClaims = additionalLocalClaims - }; - - await HttpContext.SignInAsync(isuser, localSignInProps); - - // delete temporary cookie used during external authentication - await HttpContext.SignOutAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme); - - // retrieve return URL - var returnUrl = result.Properties.Items["returnUrl"] ?? "~/"; - - // check if external login is in the context of an OIDC request - var context = await _interaction.GetAuthorizationContextAsync(returnUrl); - await _events.RaiseAsync(new UserLoginSuccessEvent(provider, providerUserId, user.Id, name, true, context?.Client.ClientId)); - - if (context != null) - { - if (context.IsNativeClient()) - { - // The client is native, so this change in how to - // return the response is for better UX for the end user. - return this.LoadingPage("Redirect", returnUrl); - } - } - - return Redirect(returnUrl); - } - - private async Task<(ApplicationUser user, string provider, string providerUserId, IEnumerable claims)> - FindUserFromExternalProviderAsync(AuthenticateResult result) - { - var externalUser = result.Principal; - - // try to determine the unique id of the external user (issued by the provider) - // the most common claim type for that are the sub claim and the NameIdentifier - // depending on the external provider, some other claim type might be used - var userIdClaim = externalUser.FindFirst(JwtClaimTypes.Subject) ?? - externalUser.FindFirst(ClaimTypes.NameIdentifier) ?? - throw new Exception("Unknown userid"); - - // remove the user id claim so we don't include it as an extra claim if/when we provision the user - var claims = externalUser.Claims.ToList(); - claims.Remove(userIdClaim); - - var provider = result.Properties.Items["scheme"]; - var providerUserId = userIdClaim.Value; - - // find external user - var user = await _userManager.FindByLoginAsync(provider, providerUserId); - - return (user, provider, providerUserId, claims); - } - - private async Task AutoProvisionUserAsync(string provider, string providerUserId, IEnumerable claims) - { - // create a list of claims that we want to transfer into our store - var filtered = new List(); - - // user's display name - var name = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Name)?.Value ?? - claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value; - if (name != null) - { - filtered.Add(new Claim(JwtClaimTypes.Name, name)); - } - else - { - var first = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.GivenName)?.Value ?? - claims.FirstOrDefault(x => x.Type == ClaimTypes.GivenName)?.Value; - var last = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.FamilyName)?.Value ?? - claims.FirstOrDefault(x => x.Type == ClaimTypes.Surname)?.Value; - if (first != null && last != null) - { - filtered.Add(new Claim(JwtClaimTypes.Name, first + " " + last)); - } - else if (first != null) - { - filtered.Add(new Claim(JwtClaimTypes.Name, first)); - } - else if (last != null) - { - filtered.Add(new Claim(JwtClaimTypes.Name, last)); - } - } - - // email - var email = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Email)?.Value ?? - claims.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value; - if (email != null) - { - filtered.Add(new Claim(JwtClaimTypes.Email, email)); - } - - var user = new ApplicationUser - { - UserName = Guid.NewGuid().ToString(), - }; - var identityResult = await _userManager.CreateAsync(user); - if (!identityResult.Succeeded) throw new Exception(identityResult.Errors.First().Description); - - if (filtered.Any()) - { - identityResult = await _userManager.AddClaimsAsync(user, filtered); - if (!identityResult.Succeeded) throw new Exception(identityResult.Errors.First().Description); - } - - identityResult = await _userManager.AddLoginAsync(user, new UserLoginInfo(provider, providerUserId, provider)); - if (!identityResult.Succeeded) throw new Exception(identityResult.Errors.First().Description); - - return user; - } - - // if the external login is OIDC-based, there are certain things we need to preserve to make logout work - // this will be different for WS-Fed, SAML2p or other protocols - private void ProcessLoginCallback(AuthenticateResult externalResult, List localClaims, AuthenticationProperties localSignInProps) - { - // if the external system sent a session id claim, copy it over - // so we can use it for single sign-out - var sid = externalResult.Principal.Claims.FirstOrDefault(x => x.Type == JwtClaimTypes.SessionId); - if (sid != null) - { - localClaims.Add(new Claim(JwtClaimTypes.SessionId, sid.Value)); - } - - // if the external provider issued an id_token, we'll keep it for signout - var idToken = externalResult.Properties.GetTokenValue("id_token"); - if (idToken != null) - { - localSignInProps.StoreTokens(new[] { new AuthenticationToken { Name = "id_token", Value = idToken } }); - } - } -} diff --git a/src/Identity.API/Quickstart/Account/ExternalProvider.cs b/src/Identity.API/Quickstart/Account/ExternalProvider.cs deleted file mode 100644 index c92594f..0000000 --- a/src/Identity.API/Quickstart/Account/ExternalProvider.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -public class ExternalProvider -{ - public string DisplayName { get; set; } - public string AuthenticationScheme { get; set; } -} diff --git a/src/Identity.API/Quickstart/Account/LoggedOutViewModel.cs b/src/Identity.API/Quickstart/Account/LoggedOutViewModel.cs deleted file mode 100644 index 7e55f2c..0000000 --- a/src/Identity.API/Quickstart/Account/LoggedOutViewModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class LoggedOutViewModel -{ - public string PostLogoutRedirectUri { get; set; } - public string ClientName { get; set; } - public string SignOutIframeUrl { get; set; } - - public bool AutomaticRedirectAfterSignOut { get; set; } - - public string LogoutId { get; set; } - public bool TriggerExternalSignout => ExternalAuthenticationScheme != null; - public string ExternalAuthenticationScheme { get; set; } -} diff --git a/src/Identity.API/Quickstart/Account/LoginInputModel.cs b/src/Identity.API/Quickstart/Account/LoginInputModel.cs deleted file mode 100644 index 813ba8f..0000000 --- a/src/Identity.API/Quickstart/Account/LoginInputModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class LoginInputModel -{ - [Required] - public string Username { get; set; } - [Required] - public string Password { get; set; } - public bool RememberLogin { get; set; } - public string ReturnUrl { get; set; } -} diff --git a/src/Identity.API/Quickstart/Account/LoginViewModel.cs b/src/Identity.API/Quickstart/Account/LoginViewModel.cs deleted file mode 100644 index f539c70..0000000 --- a/src/Identity.API/Quickstart/Account/LoginViewModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class LoginViewModel : LoginInputModel -{ - public bool AllowRememberLogin { get; set; } = true; - public bool EnableLocalLogin { get; set; } = true; - - public IEnumerable ExternalProviders { get; set; } = Enumerable.Empty(); - public IEnumerable VisibleExternalProviders => ExternalProviders.Where(x => !string.IsNullOrWhiteSpace(x.DisplayName)); - - public bool IsExternalLoginOnly => EnableLocalLogin == false && ExternalProviders?.Count() == 1; - public string ExternalLoginScheme => IsExternalLoginOnly ? ExternalProviders?.SingleOrDefault()?.AuthenticationScheme : null; -} diff --git a/src/Identity.API/Quickstart/Account/LogoutInputModel.cs b/src/Identity.API/Quickstart/Account/LogoutInputModel.cs deleted file mode 100644 index 2fd5d8c..0000000 --- a/src/Identity.API/Quickstart/Account/LogoutInputModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class LogoutInputModel -{ - public string LogoutId { get; set; } -} diff --git a/src/Identity.API/Quickstart/Account/LogoutViewModel.cs b/src/Identity.API/Quickstart/Account/LogoutViewModel.cs deleted file mode 100644 index 841289b..0000000 --- a/src/Identity.API/Quickstart/Account/LogoutViewModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class LogoutViewModel : LogoutInputModel -{ - public bool ShowLogoutPrompt { get; set; } = true; -} diff --git a/src/Identity.API/Quickstart/Account/RedirectViewModel.cs b/src/Identity.API/Quickstart/Account/RedirectViewModel.cs deleted file mode 100644 index e5005f4..0000000 --- a/src/Identity.API/Quickstart/Account/RedirectViewModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - - -namespace IdentityServerHost.Quickstart.UI; - -public class RedirectViewModel -{ - public string RedirectUrl { get; set; } -} diff --git a/src/Identity.API/Quickstart/Consent/ConsentController.cs b/src/Identity.API/Quickstart/Consent/ConsentController.cs deleted file mode 100644 index 2cdf323..0000000 --- a/src/Identity.API/Quickstart/Consent/ConsentController.cs +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -/// -/// This controller processes the consent UI -/// -[SecurityHeaders] -[Authorize] -public class ConsentController : Controller -{ - private readonly IIdentityServerInteractionService _interaction; - private readonly IEventService _events; - private readonly ILogger _logger; - - public ConsentController( - IIdentityServerInteractionService interaction, - IEventService events, - ILogger logger) - { - _interaction = interaction; - _events = events; - _logger = logger; - } - - /// - /// Shows the consent screen - /// - /// - /// - [HttpGet] - public async Task Index(string returnUrl) - { - var vm = await BuildViewModelAsync(returnUrl); - if (vm != null) - { - return View("Index", vm); - } - - return View("Error"); - } - - /// - /// Handles the consent screen postback - /// - [HttpPost] - [ValidateAntiForgeryToken] - public async Task Index(ConsentInputModel model) - { - var result = await ProcessConsent(model); - - if (result.IsRedirect) - { - var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl); - if (context?.IsNativeClient() == true) - { - // The client is native, so this change in how to - // return the response is for better UX for the end user. - return this.LoadingPage("Redirect", result.RedirectUri); - } - - return Redirect(result.RedirectUri); - } - - if (result.HasValidationError) - { - ModelState.AddModelError(string.Empty, result.ValidationError); - } - - if (result.ShowView) - { - return View("Index", result.ViewModel); - } - - return View("Error"); - } - - /*****************************************/ - /* helper APIs for the ConsentController */ - /*****************************************/ - private async Task ProcessConsent(ConsentInputModel model) - { - var result = new ProcessConsentResult(); - - // validate return url is still valid - var request = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl); - if (request == null) return result; - - ConsentResponse grantedConsent = null; - - // user clicked 'no' - send back the standard 'access_denied' response - if (model?.Button == "no") - { - grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied }; - - // emit event - await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); - } - // user clicked 'yes' - validate the data - else if (model?.Button == "yes") - { - // if the user consented to some scope, build the response model - if (model.ScopesConsented != null && model.ScopesConsented.Any()) - { - var scopes = model.ScopesConsented; - if (ConsentOptions.EnableOfflineAccess == false) - { - scopes = scopes.Where(x => x != IdentityServerConstants.StandardScopes.OfflineAccess); - } - - grantedConsent = new ConsentResponse - { - RememberConsent = model.RememberConsent, - ScopesValuesConsented = scopes.ToArray(), - Description = model.Description - }; - - // emit event - await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); - } - else - { - result.ValidationError = ConsentOptions.MustChooseOneErrorMessage; - } - } - else - { - result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage; - } - - if (grantedConsent != null) - { - // communicate outcome of consent back to identityserver - await _interaction.GrantConsentAsync(request, grantedConsent); - - // indicate that's it ok to redirect back to authorization endpoint - result.RedirectUri = model.ReturnUrl; - result.Client = request.Client; - } - else - { - // we need to redisplay the consent UI - result.ViewModel = await BuildViewModelAsync(model.ReturnUrl, model); - } - - return result; - } - - private async Task BuildViewModelAsync(string returnUrl, ConsentInputModel model = null) - { - var request = await _interaction.GetAuthorizationContextAsync(returnUrl); - if (request != null) - { - return CreateConsentViewModel(model, returnUrl, request); - } - else - { - _logger.LogError("No consent request matching request: {0}", returnUrl); - } - - return null; - } - - private ConsentViewModel CreateConsentViewModel( - ConsentInputModel model, string returnUrl, - AuthorizationRequest request) - { - var vm = new ConsentViewModel - { - RememberConsent = model?.RememberConsent ?? true, - ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty(), - Description = model?.Description, - - ReturnUrl = returnUrl, - - ClientName = request.Client.ClientName ?? request.Client.ClientId, - ClientUrl = request.Client.ClientUri, - ClientLogoUrl = request.Client.LogoUri, - AllowRememberConsent = request.Client.AllowRememberConsent - }; - - vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null)).ToArray(); - - var apiScopes = new List(); - foreach (var parsedScope in request.ValidatedResources.ParsedScopes) - { - var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName); - if (apiScope != null) - { - var scopeVm = CreateScopeViewModel(parsedScope, apiScope, vm.ScopesConsented.Contains(parsedScope.RawValue) || model == null); - apiScopes.Add(scopeVm); - } - } - if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess) - { - apiScopes.Add(GetOfflineAccessScope(vm.ScopesConsented.Contains(IdentityServerConstants.StandardScopes.OfflineAccess) || model == null)); - } - vm.ApiScopes = apiScopes; - - return vm; - } - - private ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) - { - return new ScopeViewModel - { - Value = identity.Name, - DisplayName = identity.DisplayName ?? identity.Name, - Description = identity.Description, - Emphasize = identity.Emphasize, - Required = identity.Required, - Checked = check || identity.Required - }; - } - - public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check) - { - var displayName = apiScope.DisplayName ?? apiScope.Name; - if (!string.IsNullOrWhiteSpace(parsedScopeValue.ParsedParameter)) - { - displayName += ":" + parsedScopeValue.ParsedParameter; - } - - return new ScopeViewModel - { - Value = parsedScopeValue.RawValue, - DisplayName = displayName, - Description = apiScope.Description, - Emphasize = apiScope.Emphasize, - Required = apiScope.Required, - Checked = check || apiScope.Required - }; - } - - private ScopeViewModel GetOfflineAccessScope(bool check) - { - return new ScopeViewModel - { - Value = IdentityServerConstants.StandardScopes.OfflineAccess, - DisplayName = ConsentOptions.OfflineAccessDisplayName, - Description = ConsentOptions.OfflineAccessDescription, - Emphasize = true, - Checked = check - }; - } -} diff --git a/src/Identity.API/Quickstart/Consent/ConsentInputModel.cs b/src/Identity.API/Quickstart/Consent/ConsentInputModel.cs deleted file mode 100644 index fc66102..0000000 --- a/src/Identity.API/Quickstart/Consent/ConsentInputModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class ConsentInputModel -{ - public string Button { get; set; } - public IEnumerable ScopesConsented { get; set; } - public bool RememberConsent { get; set; } - public string ReturnUrl { get; set; } - public string Description { get; set; } -} diff --git a/src/Identity.API/Quickstart/Consent/ConsentOptions.cs b/src/Identity.API/Quickstart/Consent/ConsentOptions.cs deleted file mode 100644 index 4a68927..0000000 --- a/src/Identity.API/Quickstart/Consent/ConsentOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class ConsentOptions -{ - public static bool EnableOfflineAccess = true; - public static string OfflineAccessDisplayName = "Offline Access"; - public static string OfflineAccessDescription = "Access to your applications and resources, even when you are offline"; - - public static readonly string MustChooseOneErrorMessage = "You must pick at least one permission"; - public static readonly string InvalidSelectionErrorMessage = "Invalid selection"; -} diff --git a/src/Identity.API/Quickstart/Consent/ConsentViewModel.cs b/src/Identity.API/Quickstart/Consent/ConsentViewModel.cs deleted file mode 100644 index 0603d78..0000000 --- a/src/Identity.API/Quickstart/Consent/ConsentViewModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class ConsentViewModel : ConsentInputModel -{ - public string ClientName { get; set; } - public string ClientUrl { get; set; } - public string ClientLogoUrl { get; set; } - public bool AllowRememberConsent { get; set; } - - public IEnumerable IdentityScopes { get; set; } - public IEnumerable ApiScopes { get; set; } -} diff --git a/src/Identity.API/Quickstart/Consent/ProcessConsentResult.cs b/src/Identity.API/Quickstart/Consent/ProcessConsentResult.cs deleted file mode 100644 index a7dd8bb..0000000 --- a/src/Identity.API/Quickstart/Consent/ProcessConsentResult.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -public class ProcessConsentResult -{ - public bool IsRedirect => RedirectUri != null; - public string RedirectUri { get; set; } - public Client Client { get; set; } - - public bool ShowView => ViewModel != null; - public ConsentViewModel ViewModel { get; set; } - - public bool HasValidationError => ValidationError != null; - public string ValidationError { get; set; } -} diff --git a/src/Identity.API/Quickstart/Consent/ScopeViewModel.cs b/src/Identity.API/Quickstart/Consent/ScopeViewModel.cs deleted file mode 100644 index c052253..0000000 --- a/src/Identity.API/Quickstart/Consent/ScopeViewModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class ScopeViewModel -{ - public string Value { get; set; } - public string DisplayName { get; set; } - public string Description { get; set; } - public bool Emphasize { get; set; } - public bool Required { get; set; } - public bool Checked { get; set; } -} diff --git a/src/Identity.API/Quickstart/Device/DeviceAuthorizationInputModel.cs b/src/Identity.API/Quickstart/Device/DeviceAuthorizationInputModel.cs deleted file mode 100644 index 8e64039..0000000 --- a/src/Identity.API/Quickstart/Device/DeviceAuthorizationInputModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class DeviceAuthorizationInputModel : ConsentInputModel -{ - public string UserCode { get; set; } -} diff --git a/src/Identity.API/Quickstart/Device/DeviceAuthorizationViewModel.cs b/src/Identity.API/Quickstart/Device/DeviceAuthorizationViewModel.cs deleted file mode 100644 index 230413f..0000000 --- a/src/Identity.API/Quickstart/Device/DeviceAuthorizationViewModel.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class DeviceAuthorizationViewModel : ConsentViewModel -{ - public string UserCode { get; set; } - public bool ConfirmUserCode { get; set; } -} diff --git a/src/Identity.API/Quickstart/Device/DeviceController.cs b/src/Identity.API/Quickstart/Device/DeviceController.cs deleted file mode 100644 index 5eb55ca..0000000 --- a/src/Identity.API/Quickstart/Device/DeviceController.cs +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -[Authorize] -[SecurityHeaders] -public class DeviceController : Controller -{ - private readonly IDeviceFlowInteractionService _interaction; - private readonly IEventService _events; - private readonly IOptions _options; - private readonly ILogger _logger; - - public DeviceController( - IDeviceFlowInteractionService interaction, - IEventService eventService, - IOptions options, - ILogger logger) - { - _interaction = interaction; - _events = eventService; - _options = options; - _logger = logger; - } - - [HttpGet] - public async Task Index() - { - string userCodeParamName = _options.Value.UserInteraction.DeviceVerificationUserCodeParameter; - string userCode = Request.Query[userCodeParamName]; - if (string.IsNullOrWhiteSpace(userCode)) return View("UserCodeCapture"); - - var vm = await BuildViewModelAsync(userCode); - if (vm == null) return View("Error"); - - vm.ConfirmUserCode = true; - return View("UserCodeConfirmation", vm); - } - - [HttpPost] - [ValidateAntiForgeryToken] - public async Task UserCodeCapture(string userCode) - { - var vm = await BuildViewModelAsync(userCode); - if (vm == null) return View("Error"); - - return View("UserCodeConfirmation", vm); - } - - [HttpPost] - [ValidateAntiForgeryToken] - public async Task Callback(DeviceAuthorizationInputModel model) - { - if (model == null) throw new ArgumentNullException(nameof(model)); - - var result = await ProcessConsent(model); - if (result.HasValidationError) return View("Error"); - - return View("Success"); - } - - private async Task ProcessConsent(DeviceAuthorizationInputModel model) - { - var result = new ProcessConsentResult(); - - var request = await _interaction.GetAuthorizationContextAsync(model.UserCode); - if (request == null) return result; - - ConsentResponse grantedConsent = null; - - // user clicked 'no' - send back the standard 'access_denied' response - if (model.Button == "no") - { - grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied }; - - // emit event - await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); - } - // user clicked 'yes' - validate the data - else if (model.Button == "yes") - { - // if the user consented to some scope, build the response model - if (model.ScopesConsented != null && model.ScopesConsented.Any()) - { - var scopes = model.ScopesConsented; - if (ConsentOptions.EnableOfflineAccess == false) - { - scopes = scopes.Where(x => x != IdentityServerConstants.StandardScopes.OfflineAccess); - } - - grantedConsent = new ConsentResponse - { - RememberConsent = model.RememberConsent, - ScopesValuesConsented = scopes.ToArray(), - Description = model.Description - }; - - // emit event - await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); - } - else - { - result.ValidationError = ConsentOptions.MustChooseOneErrorMessage; - } - } - else - { - result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage; - } - - if (grantedConsent != null) - { - // communicate outcome of consent back to identityserver - await _interaction.HandleRequestAsync(model.UserCode, grantedConsent); - - // indicate that's it ok to redirect back to authorization endpoint - result.RedirectUri = model.ReturnUrl; - result.Client = request.Client; - } - else - { - // we need to redisplay the consent UI - result.ViewModel = await BuildViewModelAsync(model.UserCode, model); - } - - return result; - } - - private async Task BuildViewModelAsync(string userCode, DeviceAuthorizationInputModel model = null) - { - var request = await _interaction.GetAuthorizationContextAsync(userCode); - if (request != null) - { - return CreateConsentViewModel(userCode, model, request); - } - - return null; - } - - private DeviceAuthorizationViewModel CreateConsentViewModel(string userCode, DeviceAuthorizationInputModel model, DeviceFlowAuthorizationRequest request) - { - var vm = new DeviceAuthorizationViewModel - { - UserCode = userCode, - Description = model?.Description, - - RememberConsent = model?.RememberConsent ?? true, - ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty(), - - ClientName = request.Client.ClientName ?? request.Client.ClientId, - ClientUrl = request.Client.ClientUri, - ClientLogoUrl = request.Client.LogoUri, - AllowRememberConsent = request.Client.AllowRememberConsent - }; - - vm.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null)).ToArray(); - - var apiScopes = new List(); - foreach (var parsedScope in request.ValidatedResources.ParsedScopes) - { - var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName); - if (apiScope != null) - { - var scopeVm = CreateScopeViewModel(parsedScope, apiScope, vm.ScopesConsented.Contains(parsedScope.RawValue) || model == null); - apiScopes.Add(scopeVm); - } - } - if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess) - { - apiScopes.Add(GetOfflineAccessScope(vm.ScopesConsented.Contains(IdentityServerConstants.StandardScopes.OfflineAccess) || model == null)); - } - vm.ApiScopes = apiScopes; - - return vm; - } - - private ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) - { - return new ScopeViewModel - { - Value = identity.Name, - DisplayName = identity.DisplayName ?? identity.Name, - Description = identity.Description, - Emphasize = identity.Emphasize, - Required = identity.Required, - Checked = check || identity.Required - }; - } - - public ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check) - { - return new ScopeViewModel - { - Value = parsedScopeValue.RawValue, - DisplayName = apiScope.DisplayName ?? apiScope.Name, - Description = apiScope.Description, - Emphasize = apiScope.Emphasize, - Required = apiScope.Required, - Checked = check || apiScope.Required - }; - } - private ScopeViewModel GetOfflineAccessScope(bool check) - { - return new ScopeViewModel - { - Value = IdentityServerConstants.StandardScopes.OfflineAccess, - DisplayName = ConsentOptions.OfflineAccessDisplayName, - Description = ConsentOptions.OfflineAccessDescription, - Emphasize = true, - Checked = check - }; - } -} diff --git a/src/Identity.API/Quickstart/Diagnostics/DiagnosticsController.cs b/src/Identity.API/Quickstart/Diagnostics/DiagnosticsController.cs deleted file mode 100644 index 9668eec..0000000 --- a/src/Identity.API/Quickstart/Diagnostics/DiagnosticsController.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -[SecurityHeaders] -[Authorize] -public class DiagnosticsController : Controller -{ - public async Task Index() - { - var localAddresses = new string[] { "127.0.0.1", "::1", HttpContext.Connection.LocalIpAddress.ToString() }; - if (!localAddresses.Contains(HttpContext.Connection.RemoteIpAddress.ToString())) - { - return NotFound(); - } - - var model = new DiagnosticsViewModel(await HttpContext.AuthenticateAsync()); - return View(model); - } -} diff --git a/src/Identity.API/Quickstart/Diagnostics/DiagnosticsViewModel.cs b/src/Identity.API/Quickstart/Diagnostics/DiagnosticsViewModel.cs deleted file mode 100644 index 6f87fd1..0000000 --- a/src/Identity.API/Quickstart/Diagnostics/DiagnosticsViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -using System.Text; -using System.Text.Json; - -namespace IdentityServerHost.Quickstart.UI; - -public class DiagnosticsViewModel -{ - public DiagnosticsViewModel(AuthenticateResult result) - { - AuthenticateResult = result; - - if (result.Properties.Items.ContainsKey("client_list")) - { - var encoded = result.Properties.Items["client_list"]; - var bytes = Base64Url.Decode(encoded); - var value = Encoding.UTF8.GetString(bytes); - - Clients = JsonSerializer.Deserialize(value); - } - } - - public AuthenticateResult AuthenticateResult { get; } - public IEnumerable Clients { get; } = new List(); -} diff --git a/src/Identity.API/Quickstart/Extensions.cs b/src/Identity.API/Quickstart/Extensions.cs deleted file mode 100644 index 4dbaf53..0000000 --- a/src/Identity.API/Quickstart/Extensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace IdentityServerHost.Quickstart.UI; - -public static class Extensions -{ - /// - /// Checks if the redirect URI is for a native client. - /// - /// - public static bool IsNativeClient(this AuthorizationRequest context) - { - return !context.RedirectUri.StartsWith("https", StringComparison.Ordinal) - && !context.RedirectUri.StartsWith("http", StringComparison.Ordinal); - } - - public static IActionResult LoadingPage(this Controller controller, string viewName, string redirectUri) - { - controller.HttpContext.Response.StatusCode = 200; - controller.HttpContext.Response.Headers["Location"] = ""; - - return controller.View(viewName, new RedirectViewModel { RedirectUrl = redirectUri }); - } -} diff --git a/src/Identity.API/Quickstart/Grants/GrantsController.cs b/src/Identity.API/Quickstart/Grants/GrantsController.cs deleted file mode 100644 index 3045c44..0000000 --- a/src/Identity.API/Quickstart/Grants/GrantsController.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -/// -/// This sample controller allows a user to revoke grants given to clients -/// -[SecurityHeaders] -[Authorize] -public class GrantsController : Controller -{ - private readonly IIdentityServerInteractionService _interaction; - private readonly IClientStore _clients; - private readonly IResourceStore _resources; - private readonly IEventService _events; - - public GrantsController(IIdentityServerInteractionService interaction, - IClientStore clients, - IResourceStore resources, - IEventService events) - { - _interaction = interaction; - _clients = clients; - _resources = resources; - _events = events; - } - - /// - /// Show list of grants - /// - [HttpGet] - public async Task Index() - { - return View("Index", await BuildViewModelAsync()); - } - - /// - /// Handle postback to revoke a client - /// - [HttpPost] - [ValidateAntiForgeryToken] - public async Task Revoke(string clientId) - { - await _interaction.RevokeUserConsentAsync(clientId); - await _events.RaiseAsync(new GrantsRevokedEvent(User.GetSubjectId(), clientId)); - - return RedirectToAction("Index"); - } - - private async Task BuildViewModelAsync() - { - var grants = await _interaction.GetAllUserGrantsAsync(); - - var list = new List(); - foreach (var grant in grants) - { - var client = await _clients.FindClientByIdAsync(grant.ClientId); - if (client != null) - { - var resources = await _resources.FindResourcesByScopeAsync(grant.Scopes); - - var item = new GrantViewModel() - { - ClientId = client.ClientId, - ClientName = client.ClientName ?? client.ClientId, - ClientLogoUrl = client.LogoUri, - ClientUrl = client.ClientUri, - Description = grant.Description, - Created = grant.CreationTime, - Expires = grant.Expiration, - IdentityGrantNames = resources.IdentityResources.Select(x => x.DisplayName ?? x.Name).ToArray(), - ApiGrantNames = resources.ApiScopes.Select(x => x.DisplayName ?? x.Name).ToArray() - }; - - list.Add(item); - } - } - - return new GrantsViewModel - { - Grants = list - }; - } -} diff --git a/src/Identity.API/Quickstart/Grants/GrantsViewModel.cs b/src/Identity.API/Quickstart/Grants/GrantsViewModel.cs deleted file mode 100644 index 991d279..0000000 --- a/src/Identity.API/Quickstart/Grants/GrantsViewModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class GrantsViewModel -{ - public IEnumerable Grants { get; set; } -} - -public class GrantViewModel -{ - public string ClientId { get; set; } - public string ClientName { get; set; } - public string ClientUrl { get; set; } - public string ClientLogoUrl { get; set; } - public string Description { get; set; } - public DateTime Created { get; set; } - public DateTime? Expires { get; set; } - public IEnumerable IdentityGrantNames { get; set; } - public IEnumerable ApiGrantNames { get; set; } -} diff --git a/src/Identity.API/Quickstart/Home/ErrorViewModel.cs b/src/Identity.API/Quickstart/Home/ErrorViewModel.cs deleted file mode 100644 index e1cfa86..0000000 --- a/src/Identity.API/Quickstart/Home/ErrorViewModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI; - -public class ErrorViewModel -{ - public ErrorViewModel() - { - } - - public ErrorViewModel(string error) - { - Error = new ErrorMessage { Error = error }; - } - - public ErrorMessage Error { get; set; } -} diff --git a/src/Identity.API/Quickstart/Home/HomeController.cs b/src/Identity.API/Quickstart/Home/HomeController.cs deleted file mode 100644 index 27f4d73..0000000 --- a/src/Identity.API/Quickstart/Home/HomeController.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - -namespace IdentityServerHost.Quickstart.UI -{ - [SecurityHeaders] - [AllowAnonymous] - public class HomeController : Controller - { - private readonly IIdentityServerInteractionService _interaction; - private readonly IWebHostEnvironment _environment; - private readonly ILogger _logger; - - public HomeController( - IIdentityServerInteractionService interaction, - IWebHostEnvironment environment, - ILogger logger) - { - _interaction = interaction; - _environment = environment; - _logger = logger; - } - - public IActionResult Index() - { - if (_environment.IsDevelopment()) - { - // only show in development - return View(); - } - - _logger.LogInformation("Homepage is disabled in production. Returning 404."); - return NotFound(); - } - - /// - /// Shows the error page - /// - public async Task Error(string errorId) - { - var vm = new ErrorViewModel(); - - // retrieve error details from identityserver - var message = await _interaction.GetErrorContextAsync(errorId); - if (message != null) - { - vm.Error = message; - - if (!_environment.IsDevelopment()) - { - // only show in development - message.ErrorDescription = null; - } - } - - return View("Error", vm); - } - } -} \ No newline at end of file diff --git a/src/Identity.API/Quickstart/SecurityHeadersAttribute.cs b/src/Identity.API/Quickstart/SecurityHeadersAttribute.cs deleted file mode 100644 index fb41af1..0000000 --- a/src/Identity.API/Quickstart/SecurityHeadersAttribute.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) Brock Allen & Dominick Baier. All rights reserved. -// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. - - -namespace IdentityServerHost.Quickstart.UI; - -public class SecurityHeadersAttribute : ActionFilterAttribute -{ - public override void OnResultExecuting(ResultExecutingContext context) - { - var result = context.Result; - if (result is ViewResult) - { - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options - if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Type-Options")) - { - context.HttpContext.Response.Headers.Append("X-Content-Type-Options", "nosniff"); - } - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options - if (!context.HttpContext.Response.Headers.ContainsKey("X-Frame-Options")) - { - context.HttpContext.Response.Headers.Append("X-Frame-Options", "SAMEORIGIN"); - } - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy - var csp = "default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandbox allow-forms allow-same-origin allow-scripts; base-uri 'self';"; - // also consider adding upgrade-insecure-requests once you have HTTPS in place for production - //csp += "upgrade-insecure-requests;"; - // also an example if you need client images to be displayed from twitter - // csp += "img-src 'self' https://pbs.twimg.com;"; - - // once for standards compliant browsers - if (!context.HttpContext.Response.Headers.ContainsKey("Content-Security-Policy")) - { - context.HttpContext.Response.Headers.Append("Content-Security-Policy", csp); - } - // and once again for IE - if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Security-Policy")) - { - context.HttpContext.Response.Headers.Append("X-Content-Security-Policy", csp); - } - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy - var referrer_policy = "no-referrer"; - if (!context.HttpContext.Response.Headers.ContainsKey("Referrer-Policy")) - { - context.HttpContext.Response.Headers.Append("Referrer-Policy", referrer_policy); - } - } - } -} diff --git a/src/Identity.API/README.md b/src/Identity.API/README.md deleted file mode 100644 index ffaaed5..0000000 --- a/src/Identity.API/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Containerized eShop - Identity Service -Sample reference containerized application, cross-platform and microservices architecture. -Powered by Microsoft - -## Overview -This sample runs a microservices oriented application and a .net core Mvc application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution. - -## Setup -This service is a identity provider or STS (Security Token Service) currently implemented with IdentityServer 4 wrapping ASP.NET Identity underneath. - -Check procedures on how to get the sample app started at the Wiki: -https://github.com/dotnet/eShopOnContainers/wiki - - diff --git a/src/Identity.API/Services/EFLoginService.cs b/src/Identity.API/Services/EFLoginService.cs deleted file mode 100644 index 8aa9eaf..0000000 --- a/src/Identity.API/Services/EFLoginService.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace eShop.Identity.API.Services -{ - public class EFLoginService : ILoginService - { - private UserManager _userManager; - private SignInManager _signInManager; - - public EFLoginService(UserManager userManager, SignInManager signInManager) - { - _userManager = userManager; - _signInManager = signInManager; - } - - public async Task FindByUsername(string user) - { - return await _userManager.FindByEmailAsync(user); - } - - public async Task ValidateCredentials(ApplicationUser user, string password) - { - return await _userManager.CheckPasswordAsync(user, password); - } - - public Task SignIn(ApplicationUser user) - { - return _signInManager.SignInAsync(user, true); - } - - public Task SignInAsync(ApplicationUser user, AuthenticationProperties properties, string authenticationMethod = null) - { - return _signInManager.SignInAsync(user, properties, authenticationMethod); - } - } -} diff --git a/src/Identity.API/Services/ILoginService.cs b/src/Identity.API/Services/ILoginService.cs deleted file mode 100644 index a39d006..0000000 --- a/src/Identity.API/Services/ILoginService.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace eShop.Identity.API.Services -{ - public interface ILoginService - { - Task ValidateCredentials(T user, string password); - - Task FindByUsername(string user); - - Task SignIn(T user); - - Task SignInAsync(T user, AuthenticationProperties properties, string authenticationMethod = null); - } -} diff --git a/src/Identity.API/Services/IRedirectService.cs b/src/Identity.API/Services/IRedirectService.cs deleted file mode 100644 index d4aaf12..0000000 --- a/src/Identity.API/Services/IRedirectService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace eShop.Identity.API.Services -{ - public interface IRedirectService - { - string ExtractRedirectUriFromReturnUrl(string url); - } -} diff --git a/src/Identity.API/Services/ProfileService.cs b/src/Identity.API/Services/ProfileService.cs deleted file mode 100644 index f42a50f..0000000 --- a/src/Identity.API/Services/ProfileService.cs +++ /dev/null @@ -1,118 +0,0 @@ -namespace eShop.Identity.API.Services -{ - public class ProfileService : IProfileService - { - private readonly UserManager _userManager; - - public ProfileService(UserManager userManager) - { - _userManager = userManager; - } - - public async Task GetProfileDataAsync(ProfileDataRequestContext context) - { - var subject = context.Subject ?? throw new ArgumentNullException(nameof(context.Subject)); - - var subjectId = subject.Claims.Where(x => x.Type == "sub").FirstOrDefault()?.Value; - - var user = await _userManager.FindByIdAsync(subjectId); - if (user == null) - throw new ArgumentException("Invalid subject identifier"); - - var claims = GetClaimsFromUser(user); - context.IssuedClaims = claims.ToList(); - } - - public async Task IsActiveAsync(IsActiveContext context) - { - var subject = context.Subject ?? throw new ArgumentNullException(nameof(context.Subject)); - - var subjectId = subject.Claims.Where(x => x.Type == "sub").FirstOrDefault()?.Value; - var user = await _userManager.FindByIdAsync(subjectId); - - context.IsActive = false; - - if (user != null) - { - if (_userManager.SupportsUserSecurityStamp) - { - var security_stamp = subject.Claims.Where(c => c.Type == "security_stamp").Select(c => c.Value).SingleOrDefault(); - if (security_stamp != null) - { - var db_security_stamp = await _userManager.GetSecurityStampAsync(user); - if (db_security_stamp != security_stamp) - return; - } - } - - context.IsActive = - !user.LockoutEnabled || - !user.LockoutEnd.HasValue || - user.LockoutEnd <= DateTime.UtcNow; - } - } - - private IEnumerable GetClaimsFromUser(ApplicationUser user) - { - var claims = new List - { - new Claim(JwtClaimTypes.Subject, user.Id), - new Claim(JwtClaimTypes.PreferredUserName, user.UserName), - new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName) - }; - - if (!string.IsNullOrWhiteSpace(user.Name)) - claims.Add(new Claim("name", user.Name)); - - if (!string.IsNullOrWhiteSpace(user.LastName)) - claims.Add(new Claim("last_name", user.LastName)); - - if (!string.IsNullOrWhiteSpace(user.CardNumber)) - claims.Add(new Claim("card_number", user.CardNumber)); - - if (!string.IsNullOrWhiteSpace(user.CardHolderName)) - claims.Add(new Claim("card_holder", user.CardHolderName)); - - if (!string.IsNullOrWhiteSpace(user.SecurityNumber)) - claims.Add(new Claim("card_security_number", user.SecurityNumber)); - - if (!string.IsNullOrWhiteSpace(user.Expiration)) - claims.Add(new Claim("card_expiration", user.Expiration)); - - if (!string.IsNullOrWhiteSpace(user.City)) - claims.Add(new Claim("address_city", user.City)); - - if (!string.IsNullOrWhiteSpace(user.Country)) - claims.Add(new Claim("address_country", user.Country)); - - if (!string.IsNullOrWhiteSpace(user.State)) - claims.Add(new Claim("address_state", user.State)); - - if (!string.IsNullOrWhiteSpace(user.Street)) - claims.Add(new Claim("address_street", user.Street)); - - if (!string.IsNullOrWhiteSpace(user.ZipCode)) - claims.Add(new Claim("address_zip_code", user.ZipCode)); - - if (_userManager.SupportsUserEmail) - { - claims.AddRange(new[] - { - new Claim(JwtClaimTypes.Email, user.Email), - new Claim(JwtClaimTypes.EmailVerified, user.EmailConfirmed ? "true" : "false", ClaimValueTypes.Boolean) - }); - } - - if (_userManager.SupportsUserPhoneNumber && !string.IsNullOrWhiteSpace(user.PhoneNumber)) - { - claims.AddRange(new[] - { - new Claim(JwtClaimTypes.PhoneNumber, user.PhoneNumber), - new Claim(JwtClaimTypes.PhoneNumberVerified, user.PhoneNumberConfirmed ? "true" : "false", ClaimValueTypes.Boolean) - }); - } - - return claims; - } - } -} diff --git a/src/Identity.API/Services/RedirectService.cs b/src/Identity.API/Services/RedirectService.cs deleted file mode 100644 index d3714d0..0000000 --- a/src/Identity.API/Services/RedirectService.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace eShop.Identity.API.Services -{ - public class RedirectService : IRedirectService - { - public string ExtractRedirectUriFromReturnUrl(string url) - { - var decodedUrl = System.Net.WebUtility.HtmlDecode(url); - var results = Regex.Split(decodedUrl, "redirect_uri="); - if (results.Length < 2) - return ""; - - string result = results[1]; - - string splitKey; - if (result.Contains("signin-oidc")) - splitKey = "signin-oidc"; - else - splitKey = "scope"; - - results = Regex.Split(result, splitKey); - if (results.Length < 2) - return ""; - - result = results[0]; - - return result.Replace("%3A", ":").Replace("%2F", "/").Replace("&", ""); - } - } -} diff --git a/src/Identity.API/UsersSeed.cs b/src/Identity.API/UsersSeed.cs deleted file mode 100644 index dd2af82..0000000 --- a/src/Identity.API/UsersSeed.cs +++ /dev/null @@ -1,98 +0,0 @@ - -namespace eShop.Identity.API; - -public class UsersSeed(ILogger logger, UserManager userManager) : IDbSeeder -{ - public async Task SeedAsync(ApplicationDbContext context) - { - var alice = await userManager.FindByNameAsync("alice"); - - if (alice == null) - { - alice = new ApplicationUser - { - UserName = "alice", - Email = "AliceSmith@email.com", - EmailConfirmed = true, - CardHolderName = "Alice Smith", - CardNumber = "4012888888881881", - CardType = 1, - City = "Redmond", - Country = "U.S.", - Expiration = "12/24", - Id = Guid.NewGuid().ToString(), - LastName = "Smith", - Name = "Alice", - PhoneNumber = "1234567890", - ZipCode = "98052", - State = "WA", - Street = "15703 NE 61st Ct", - SecurityNumber = "123" - }; - - var result = userManager.CreateAsync(alice, "Pass123$").Result; - - if (!result.Succeeded) - { - throw new Exception(result.Errors.First().Description); - } - - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("alice created"); - } - } - else - { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("alice already exists"); - } - } - - var bob = await userManager.FindByNameAsync("bob"); - - if (bob == null) - { - bob = new ApplicationUser - { - UserName = "bob", - Email = "BobSmith@email.com", - EmailConfirmed = true, - CardHolderName = "Bob Smith", - CardNumber = "4012888888881881", - CardType = 1, - City = "Redmond", - Country = "U.S.", - Expiration = "12/24", - Id = Guid.NewGuid().ToString(), - LastName = "Smith", - Name = "Bob", - PhoneNumber = "1234567890", - ZipCode = "98052", - State = "WA", - Street = "15703 NE 61st Ct", - SecurityNumber = "456" - }; - - var result = await userManager.CreateAsync(bob, "Pass123$"); - - if (!result.Succeeded) - { - throw new Exception(result.Errors.First().Description); - } - - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("bob created"); - } - } - else - { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("bob already exists"); - } - } - } -} diff --git a/src/Identity.API/Views/Account/AccessDenied.cshtml b/src/Identity.API/Views/Account/AccessDenied.cshtml deleted file mode 100644 index 32e6c53..0000000 --- a/src/Identity.API/Views/Account/AccessDenied.cshtml +++ /dev/null @@ -1,7 +0,0 @@ - -
-
-

Access Denied

-

You do not have access to that resource.

-
-
\ No newline at end of file diff --git a/src/Identity.API/Views/Account/LoggedOut.cshtml b/src/Identity.API/Views/Account/LoggedOut.cshtml deleted file mode 100644 index 3cc190b..0000000 --- a/src/Identity.API/Views/Account/LoggedOut.cshtml +++ /dev/null @@ -1,34 +0,0 @@ -@model LoggedOutViewModel - -@{ - // set this so the layout rendering sees an anonymous user - ViewData["signed-out"] = true; -} - -
-

- Logout - You are now logged out -

- - @if (Model.PostLogoutRedirectUri != null) - { -
- Click here to return to the - @Model.ClientName application. -
- } - - @if (Model.SignOutIframeUrl != null) - { - - } -
- -@section scripts -{ - @if (Model.AutomaticRedirectAfterSignOut) - { - - } -} diff --git a/src/Identity.API/Views/Account/Login.cshtml b/src/Identity.API/Views/Account/Login.cshtml deleted file mode 100644 index f7f41df..0000000 --- a/src/Identity.API/Views/Account/Login.cshtml +++ /dev/null @@ -1,47 +0,0 @@ -@model LoginViewModel - - \ No newline at end of file diff --git a/src/Identity.API/Views/Account/Logout.cshtml b/src/Identity.API/Views/Account/Logout.cshtml deleted file mode 100644 index e74bde6..0000000 --- a/src/Identity.API/Views/Account/Logout.cshtml +++ /dev/null @@ -1,15 +0,0 @@ -@model LogoutViewModel - -
-
-

Logout

-

Would you like to logut of IdentityServer?

-
- -
- -
- -
-
-
diff --git a/src/Identity.API/Views/Consent/Index.cshtml b/src/Identity.API/Views/Consent/Index.cshtml deleted file mode 100644 index f8aa10d..0000000 --- a/src/Identity.API/Views/Consent/Index.cshtml +++ /dev/null @@ -1,104 +0,0 @@ -@model ConsentViewModel - - diff --git a/src/Identity.API/Views/Device/Success.cshtml b/src/Identity.API/Views/Device/Success.cshtml deleted file mode 100644 index 050dd91..0000000 --- a/src/Identity.API/Views/Device/Success.cshtml +++ /dev/null @@ -1,7 +0,0 @@ - -
-
-

Success

-

You have successfully authorized the device

-
-
diff --git a/src/Identity.API/Views/Device/UserCodeCapture.cshtml b/src/Identity.API/Views/Device/UserCodeCapture.cshtml deleted file mode 100644 index 6d41261..0000000 --- a/src/Identity.API/Views/Device/UserCodeCapture.cshtml +++ /dev/null @@ -1,23 +0,0 @@ -@model string - -
-
-

User Code

-

Please enter the code displayed on your device.

-
- - - -
-
-
-
- - -
- - -
-
-
-
diff --git a/src/Identity.API/Views/Device/UserCodeConfirmation.cshtml b/src/Identity.API/Views/Device/UserCodeConfirmation.cshtml deleted file mode 100644 index e1d3b19..0000000 --- a/src/Identity.API/Views/Device/UserCodeConfirmation.cshtml +++ /dev/null @@ -1,108 +0,0 @@ -@model DeviceAuthorizationViewModel - -
-
- @if (Model.ClientLogoUrl != null) - { - - } -

- @Model.ClientName - is requesting your permission -

- @if (Model.ConfirmUserCode) - { -

Please confirm that the authorization request quotes the code: @Model.UserCode.

- } -

Uncheck the permissions you do not wish to grant.

-
- -
-
- -
-
- -
- -
-
- @if (Model.IdentityScopes.Any()) - { -
-
-
- - Personal Information -
-
    - @foreach (var scope in Model.IdentityScopes) - { - - } -
-
-
- } - - @if (Model.ApiScopes.Any()) - { -
-
-
- - Application Access -
-
    - @foreach (var scope in Model.ApiScopes) - { - - } -
-
-
- } - -
-
-
- - Description -
-
- -
-
-
- - @if (Model.AllowRememberConsent) - { -
-
- - -
-
- } -
-
- -
-
- - -
-
- @if (Model.ClientUrl != null) - { - - - @Model.ClientName - - } -
-
-
-
diff --git a/src/Identity.API/Views/Diagnostics/Index.cshtml b/src/Identity.API/Views/Diagnostics/Index.cshtml deleted file mode 100644 index e939c0d..0000000 --- a/src/Identity.API/Views/Diagnostics/Index.cshtml +++ /dev/null @@ -1,64 +0,0 @@ -@model DiagnosticsViewModel - -
-
-

Authentication Cookie

-
- -
-
-
-
-

Claims

-
-
-
- @foreach (var claim in Model.AuthenticateResult.Principal.Claims) - { -
@claim.Type
-
@claim.Value
- } -
-
-
-
- -
-
-
-

Properties

-
-
-
- @foreach (var prop in Model.AuthenticateResult.Properties.Items) - { -
@prop.Key
-
@prop.Value
- } - @if (Model.Clients.Any()) - { -
Clients
-
- @{ - var clients = Model.Clients.ToArray(); - for(var i = 0; i < clients.Length; i++) - { - @clients[i] - if (i < clients.Length - 1) - { - , - } - } - } -
- } -
-
-
-
-
-
- - - - diff --git a/src/Identity.API/Views/Grants/Index.cshtml b/src/Identity.API/Views/Grants/Index.cshtml deleted file mode 100644 index 0cfc7ec..0000000 --- a/src/Identity.API/Views/Grants/Index.cshtml +++ /dev/null @@ -1,87 +0,0 @@ -@model GrantsViewModel - -
-
-

Client Application Permissions

-

Below is the list of applications you have given permission to and the resources they have access to.

-
- - @if (Model.Grants.Any() == false) - { -
-
-
- You have not given access to any applications -
-
-
- } - else - { - foreach (var grant in Model.Grants) - { -
-
-
-
- @if (grant.ClientLogoUrl != null) - { - - } - @grant.ClientName -
- -
-
- - -
-
-
-
- -
    - @if (grant.Description != null) - { -
  • - @grant.Description -
  • - } -
  • - @grant.Created.ToString("yyyy-MM-dd") -
  • - @if (grant.Expires.HasValue) - { -
  • - @grant.Expires.Value.ToString("yyyy-MM-dd") -
  • - } - @if (grant.IdentityGrantNames.Any()) - { -
  • - -
      - @foreach (var name in grant.IdentityGrantNames) - { -
    • @name
    • - } -
    -
  • - } - @if (grant.ApiGrantNames.Any()) - { -
  • - -
      - @foreach (var name in grant.ApiGrantNames) - { -
    • @name
    • - } -
    -
  • - } -
-
- } - } -
\ No newline at end of file diff --git a/src/Identity.API/Views/Home/Index.cshtml b/src/Identity.API/Views/Home/Index.cshtml deleted file mode 100644 index 9d26e73..0000000 --- a/src/Identity.API/Views/Home/Index.cshtml +++ /dev/null @@ -1,32 +0,0 @@ -@using System.Diagnostics - -@{ - var version = FileVersionInfo.GetVersionInfo(typeof(Duende.IdentityServer.Hosting.IdentityServerMiddleware).Assembly.Location).ProductVersion.Split('+').First(); -} - -
-

- - Welcome to IdentityServer4 - (version @version) -

- - -
diff --git a/src/Identity.API/Views/Shared/Error.cshtml b/src/Identity.API/Views/Shared/Error.cshtml deleted file mode 100644 index 4c746e7..0000000 --- a/src/Identity.API/Views/Shared/Error.cshtml +++ /dev/null @@ -1,40 +0,0 @@ -@model ErrorViewModel - -@{ - var error = Model?.Error?.Error; - var errorDescription = Model?.Error?.ErrorDescription; - var request_id = Model?.Error?.RequestId; -} - -
-
-

Error

-
- -
-
-
- Sorry, there was an error - - @if (error != null) - { - - - : @error - - - - if (errorDescription != null) - { -
@errorDescription
- } - } -
- - @if (request_id != null) - { -
Request Id: @request_id
- } -
-
-
diff --git a/src/Identity.API/Views/Shared/Redirect.cshtml b/src/Identity.API/Views/Shared/Redirect.cshtml deleted file mode 100644 index ecc31c1..0000000 --- a/src/Identity.API/Views/Shared/Redirect.cshtml +++ /dev/null @@ -1,11 +0,0 @@ -@model RedirectViewModel - -
-
-

You are now being returned to the application

-

Once complete, you may close this tab.

-
-
- - - diff --git a/src/Identity.API/Views/Shared/_Layout.cshtml b/src/Identity.API/Views/Shared/_Layout.cshtml deleted file mode 100644 index c1a1a49..0000000 --- a/src/Identity.API/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - Identity | Northern Mountains - - - - - - - - -
- -
-
-
- -
-
- -
- @RenderBody() -
- -
- -
- - - - - @RenderSection("scripts", required: false) - - diff --git a/src/Identity.API/Views/Shared/_ScopeListItem.cshtml b/src/Identity.API/Views/Shared/_ScopeListItem.cshtml deleted file mode 100644 index 162029e..0000000 --- a/src/Identity.API/Views/Shared/_ScopeListItem.cshtml +++ /dev/null @@ -1,34 +0,0 @@ -@model ScopeViewModel - -
  • - - @if (Model.Required) - { - (required) - } - @if (Model.Description != null) - { - - } -
  • \ No newline at end of file diff --git a/src/Identity.API/Views/Shared/_ValidationSummary.cshtml b/src/Identity.API/Views/Shared/_ValidationSummary.cshtml deleted file mode 100644 index 5fd90ba..0000000 --- a/src/Identity.API/Views/Shared/_ValidationSummary.cshtml +++ /dev/null @@ -1,7 +0,0 @@ -@if (ViewContext.ModelState.IsValid == false) -{ -
    - Error -
    -
    -} \ No newline at end of file diff --git a/src/Identity.API/Views/_ViewImports.cshtml b/src/Identity.API/Views/_ViewImports.cshtml deleted file mode 100644 index bb20544..0000000 --- a/src/Identity.API/Views/_ViewImports.cshtml +++ /dev/null @@ -1,2 +0,0 @@ -@using IdentityServerHost.Quickstart.UI -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/src/Identity.API/Views/_ViewStart.cshtml b/src/Identity.API/Views/_ViewStart.cshtml deleted file mode 100644 index 820a2f6..0000000 --- a/src/Identity.API/Views/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "_Layout"; -} diff --git a/src/Identity.API/appsettings.Development.json b/src/Identity.API/appsettings.Development.json deleted file mode 100644 index 09ecc3d..0000000 --- a/src/Identity.API/appsettings.Development.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ConnectionStrings": { - "IdentityDB": "Host=localhost;Database=IdentityDB;Username=postgres;Password=yourWeak(!)Password" - } -} \ No newline at end of file diff --git a/src/Identity.API/appsettings.json b/src/Identity.API/appsettings.json deleted file mode 100644 index 6b02899..0000000 --- a/src/Identity.API/appsettings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "XamarinCallback": "http://localhost:5105/xamarincallback", - "UseCustomizationData": false, - "TokenLifetimeMinutes": 120, - "PermanentTokenLifetimeDays": 365 -} diff --git a/src/Identity.API/bundleconfig.json b/src/Identity.API/bundleconfig.json deleted file mode 100644 index 621a937..0000000 --- a/src/Identity.API/bundleconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -// Configure bundling and minification for the project. -// More info at https://go.microsoft.com/fwlink/?LinkId=808241 -[ - { - "outputFileName": "wwwroot/css/site.min.css", - // An array of relative input file paths. Globbing patterns supported - "inputFiles": [ - "wwwroot/css/**/*.css" - ] - }, - { - "outputFileName": "wwwroot/js/site.min.js", - "inputFiles": [ - "wwwroot/js/site.js" - ], - // Optionally specify minification options - "minify": { - "enabled": true, - "renameLocals": true - }, - // Optinally generate .map file - "sourceMap": false - } -] diff --git a/src/Identity.API/libman.json b/src/Identity.API/libman.json deleted file mode 100644 index 3ff9915..0000000 --- a/src/Identity.API/libman.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": "1.0", - "defaultProvider": "cdnjs", - "libraries": [ - { - "library": "jquery@3.6.3", - "destination": "wwwroot/lib/jquery/" - }, - { - "provider": "unpkg", - "library": "bootstrap@5.2.3", - "files": [ - "dist/css/bootstrap.css", - "dist/css/bootstrap.css.map", - "dist/css/bootstrap.min.css", - "dist/css/bootstrap.min.css.map", - "dist/js/bootstrap.js", - "dist/js/bootstrap.min.js" - ], - "destination": "wwwroot/lib/bootstrap/" - }, - { - "library": "jquery-validation-unobtrusive@4.0.0", - "destination": "wwwroot/lib/jquery-validation-unobtrusive/" - }, - { - "library": "jquery-validate@1.19.5", - "destination": "wwwroot/lib/jquery-validate/", - "files": [ - "jquery.validate.min.js", - "jquery.validate.js" - ] - } - ] -} \ No newline at end of file diff --git a/src/Identity.API/tempkey.jwk b/src/Identity.API/tempkey.jwk deleted file mode 100644 index c8184bd..0000000 --- a/src/Identity.API/tempkey.jwk +++ /dev/null @@ -1 +0,0 @@ -{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"Pf7_o1LMYwcXEWHkZ54kP4ItOYu0lhOOn4vc88XYg9XmDR8DcPxyvRLWGIuV-jSioMP59HIN5yHeDrQbG3tY2lTUynRYHdwOFVQAzQ3LpGSF4eKfMOSDU05HkWv-w2E1XWogVFAafv2F4FHeYtqWAzjjcjlYy_n0GkCcjBvIneuVqWNZQ9-eBt28cApruVfTeoE01Liz-ww4T0CQ9ujJQf9zUxhYb6WWMQ1U-A0qGK9hmh00Ymf-rxS2HuZ9o8Bps9YEvy7rCBfy6nSMB8T2I2SNCHDdlR8Oi-j_l0VQyidnfnRY0_Lio8uSKDTiUL_vBKyCREAfCEHM6TCpdixR-Q","DP":"CR-Lyp15RyQV_TmxXq2EX8mntgdnT6ROePrkNlRCSXH-AAVJQ-24OlBH0qzehzMWI9Yk72bhqZdBIC1W8SGsTxf6T3xp-MwINJwHgYftX-D9RDQCYS5o6_gFW1775Of43Zv8tsjjwwkxUKHiwH8ImbEyqv2qVhdb_yMlgFwtXCc","DQ":"ulVv9t13HB8K8jKLomSoINMaFtNGN0LS6wY93JKtwGCjcvV5lwXRiHhq0AbDOrJggg-zZVedlbXpWRokMI-hLTHc9TguYEfiJ11DvgldTB5MUfMxHau0L8ofS5YAuTSEgg4EPIrWgvVEF1ljHwLQtDSBB3CvI6UHF7rXXy9cwIk","E":"AQAB","K":null,"KeyId":"F7383A0ED7CD960EF473FD2851803938","Kid":"F7383A0ED7CD960EF473FD2851803938","Kty":"RSA","N":"p3jTfCB0YsKpqJ6CNJi0tVmFBmoyI_D7QLLsbB-TCZ3-HIXDEr_k6zKb2GJ_QP7mncdSnYpJWSv7fWPfM0bL3A6NaMLF9MDjbfD5ti9irEW1dzBvIK0YjWmfks3eq6Mb2mM6PZtNEnoCqEzjgcRkDR1vtClEzUjs1E_i7TB-Y0J_aTYpLf-eN7yA1Obu8zMVRSSVBIwG5W5jljzA2nxk2u9qeDq8Sn0qgGwbX8cyYGQoVWBOPx7zap4cNcL6dHILjnlVrHqAUW9NVXtBWlVDP1Gvnm2zhCVJT_gW1twNhswyFULGVQH1ZWI0NukEqHG6LpN8Ti7Hx-K8MEEv_vQBYw","Oth":null,"P":"1XZw-ufz_e5fWroi8naLluW5Ow1f-Ems8oG1WYUJkc1Q4vZWklLRqlEsDH48gqk0dEgXLE9tz0dDTo03tAPJmR1InFpusyLp2XPPJ4XLhWFCMDDb0xr4oayV1XDOi3U9eKERtcASo1IDo8zDEuY8NHFdJlNKpfJ7P0JSB0hEwoc","Q":"yNg4tO9PVrwQ0CaouP0jniFouHAEfZMyJ0vVM1xPVim7jeKysOJi79lHO7OWNSABB3hY8dLcMSiKxS3BaU0Q2ns9Gw-NLR6eqT0BN9Nzh-a0sa0iuPUWCPgsWdrqjIf4FBX0Ra-6q7_LxuWCncehUAtoLFWMkcOrEj03Gwz1lUU","QI":"UWdYA2qY622GL97_tPvrgk1VWSqoO2a0-TlGu0gK51T_Z1hqLwzG9QpTujoxnRU7Js_QUe_9cIEO72N0qliEm6A-MClM-5LUA9XleyAosb1cblLjAPqT9gfGbRRAbB3Aj3YwsgASGUiSpGVfaUuXn-OnuLoidZQXw7w9xcPuxMo","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true,"SignatureProviderObjectPoolCacheSize":16}} \ No newline at end of file diff --git a/src/Identity.API/wwwroot/_references.js b/src/Identity.API/wwwroot/_references.js deleted file mode 100644 index b6fe9d6..0000000 --- a/src/Identity.API/wwwroot/_references.js +++ /dev/null @@ -1,6 +0,0 @@ -/// -/// -/// -/// -/// -/// diff --git a/src/Identity.API/wwwroot/css/site.css b/src/Identity.API/wwwroot/css/site.css deleted file mode 100644 index 659690f..0000000 --- a/src/Identity.API/wwwroot/css/site.css +++ /dev/null @@ -1,1129 +0,0 @@ -/* plus-jakarta-sans-200 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 200; - src: url('../fonts/plus-jakarta-sans-v8-latin-200.woff2') format('woff2'); -} - -/* plus-jakarta-sans-200italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 200; - src: url('../fonts/plus-jakarta-sans-v8-latin-200italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-300 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 300; - src: url('../fonts/plus-jakarta-sans-v8-latin-300.woff2') format('woff2'); -} - -/* plus-jakarta-sans-300italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 300; - src: url('../fonts/plus-jakarta-sans-v8-latin-300italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-regular - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 400; - src: url('../fonts/plus-jakarta-sans-v8-latin-regular.woff2') format('woff2'); -} - -/* plus-jakarta-sans-italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 400; - src: url('../fonts/plus-jakarta-sans-v8-latin-italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-500 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 500; - src: url('../fonts/plus-jakarta-sans-v8-latin-500.woff2') format('woff2'); -} - -/* plus-jakarta-sans-500italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 500; - src: url('../fonts/plus-jakarta-sans-v8-latin-500italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-600 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 600; - src: url('../fonts/plus-jakarta-sans-v8-latin-600.woff2') format('woff2'); -} - -/* plus-jakarta-sans-600italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 600; - src: url('../fonts/plus-jakarta-sans-v8-latin-600italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-700 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 700; - src: url('../fonts/plus-jakarta-sans-v8-latin-700.woff2') format('woff2'); -} - -/* plus-jakarta-sans-700italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 700; - src: url('../fonts/plus-jakarta-sans-v8-latin-700italic.woff2') format('woff2'); -} - -/* plus-jakarta-sans-800 - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: normal; - font-weight: 800; - src: url('../fonts/plus-jakarta-sans-v8-latin-800.woff2') format('woff2'); -} - -/* plus-jakarta-sans-800italic - latin */ -@font-face { - font-display: swap; - font-family: 'Plus Jakarta Sans'; - font-style: italic; - font-weight: 800; - src: url('../fonts/plus-jakarta-sans-v8-latin-800italic.woff2') format('woff2'); -} - -body { - margin-top: 0; - font-family: 'Plus Jakarta Sans'; - min-width:480px; -} - -.content { - position: relative; -} - -.eshop-banner { - display: flex; - justify-content: center; -} - -.eshop-banner img { - position: absolute; - width: 100%; - max-width: 1920px; -} - -.eshop-header { - position: relative; - max-width: 120rem; - margin: auto; -} - -.eshop-header.home .eshop-header-container { - height: 38rem; - margin-bottom: 0; -} - -.eshop-header .eshop-header-container { - margin-bottom: 4rem; -} - -.eshop-header-hero { - overflow: hidden; - position: absolute; - max-width: 100%; - left: 0; - top: 0; -} - -.eshop-header-container { - position: relative; - margin: auto; - margin: 0 10rem; -} - -.eshop-header-intro { - position: absolute; - max-width: 48rem; - bottom: 3rem; -} - -.eshop-header-intro h1 { - color: #000; - font-size: 3.5rem; - font-style: normal; - font-weight: 700; - line-height: 100%; - margin: 0; -} - -.eshop-header-intro p { - color: #000; - font-size: 2rem; - font-style: normal; - font-weight: 700; - line-height: 125%; - margin: 0; -} - -.eshop-header .logo-header { - color: black; - margin-right: auto; -} - -.eshop-header-navbar { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: baseline; - margin-top: 1.25rem; - gap: 1.5rem; -} - -.eshop-footer { - margin-top: 3.5rem; - background-color: #000; - width: 100%; -} - -.eshop-footer-content { - max-width: 120rem; - margin: auto; -} - -.eshop-footer-row { - padding: 3.5rem 10rem; - color: white; - display: flex; - justify-content: flex-end; - align-items: baseline; -} - -.eshop-footer .logo-footer { - color: white; - margin-right: auto; -} - -.login-container { - position: relative; - display: flex; - padding: 40px; - flex-direction: column; - justify-content: flex-end; - gap: 20px; - flex: 1 0 0; - align-self: stretch; - background: #FFF; - box-shadow: 0px 3.38082px 3.38082px 0px rgba(0, 0, 0, 0.01), 0px 27px 27px 0px rgba(0, 0, 0, 0.03); -} - -.login-container h2 { - color: #000; - font-size: 36px; - font-style: normal; - font-weight: 700; - line-height: 48px; -} - -.login-container label { - color: #444; - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 20px; -} - -.login-container input { - border: 1px solid #000; - background: #FFF; - max-width: 100%; - border-radius: 0; - color: #000; -} - -.login-container input { - border: 1px solid #000; - background: #FFF; - max-width: 100%; - border-radius: 0; - color: #000; -} - -.login-container .form-check { - display: flex; - align-items: center; - gap: 8px; -} - -.login-container .form-check-input[type=checkbox] { - border-radius: 0; - width: 20px; - height: 20px; -} - -.login-container .form-check-input:checked[type=checkbox] { - background-image: url('../images/check.svg'); - background-size: contain; -} - -.login-container .btn.btn-primary { - border-radius: 0; - display: flex; - padding: 12px 24px; - justify-content: center; - align-items: flex-end; - gap: 8px; - align-self: stretch; - background: #000; -} - -.icon { - position: relative; - top: -10px; -} - -.page-consent .client-logo { - float: left; -} -.page-consent .client-logo img { - width: 80px; - height: 80px; -} -.page-consent .consent-buttons { - margin-top: 25px; -} -.page-consent .consent-form .consent-scopecheck { - display: inline-block; - margin-right: 5px; -} -.page-consent .consent-form .consent-description { - margin-left: 25px; -} -.page-consent .consent-form .consent-description label { - font-weight: normal; -} -.page-consent .consent-form .consent-remember { - padding-left: 16px; -} - -.mt-15 { - margin-top:15px; -} - -/* Wrapping element */ -/* Set some basic padding to keep content from hitting the edges */ -.body-content { - padding-left: 15px; - padding-right: 15px; -} - -/* Set widths on the form inputs since otherwise they're 100% wide */ -input, -select, -textarea { - max-width: 280px; -} - -.select-filter { - background-color: transparent; - padding: 10px; - margin: 10px; - margin-right: 20px; - color: white; - padding-top: 20px; - padding-bottom: 3px; - min-width: 140px; - border-color: #37c7ca; - max-height: 43px; - -webkit-appearance: none; -} - - .select-filter option { - background-color: #00a69c; - } - -select::-ms-expand { - display: none; -} - -.select-filter-wrapper { - z-index: 0; - display:inline-block; - margin-left: -10px; -} - -.select-filter-wrapper::before { - content: attr(data-name); - opacity: 0.5; - z-index: 1; - text-transform: uppercase; - position: absolute; - font-size: 10px; - margin-top: 15px; - margin-left: 21px; - color: white; -} - -.select-filter-arrow { - position: absolute; - margin-left: 130px; - margin-top: 40px; -} - -.btn-brand-small-filter { - margin-top: 10px; - position: absolute; - margin-left: 15px; -} - -/* Carousel */ -.carousel-caption p { - font-size: 20px; - line-height: 1.4; -} - -.layout-cart-image { - height: 36px; - margin-top: 5px; -} - -.layout-cart-badge { - position: absolute; - margin-top: 2px; - margin-left: 14px; - background-color: #83d01b; - padding: 1px; - color: white; - border-radius: 50%; - width: 18px; - height: 18px; - font-size: 12px; - cursor: pointer; -} - -/* buttons and links extension to use brackets: [ click me ] */ -.btn-bracketed:hover:before { - display: inline-block; - content: "["; - padding-right: 0.5em; - color: chartreuse; -} - -.btn-bracketed:hover:after { - display: inline-block; - content: "]"; - padding-left: 0.5em; - color: chartreuse; -} - -.btn-brand { - background-color: #83D01B; - color: white; - padding: 10px 20px 10px 20px; - border-radius: 0px; - border: none; - width: 255px; - display: inline-block; - text-align: center; - text-transform: uppercase; - height: 45px; - font-size: 16px; - font-weight: normal; -} - -.btn-brand::before { - content: '[' -} - -.btn-brand::after { - content: ']' -} - - .btn-brand:hover:before { - padding-right: 5px; - } - - .btn-brand:hover:after { - padding-left: 5px; - } - -.btn-brand-big { - width: 360px; - margin-top: 20px; -} - -.btn-brand-small { - width: 45px; -} - - .btn-brand-small::before { - content: ''; - } - - .btn-brand-small::after { - content: ''; - } - - .btn-brand-small:hover:before { - content: ''; - padding: 0; - } - - .btn-brand-small:hover:after { - content: ''; - padding: 0; - } - -.btn-brand-dark { - background-color: #00a69c; -} - -.btn-brand:hover { - color: white; - background-color: #83D01B; - text-decoration:none; -} - -.btn-brand-dark:hover { - background-color: #00a69c; -} - -.btn-cart { - float: right; - margin-top: 40px; - margin-bottom: 40px; -} - -.btn-catalog-apply { - padding:0; -} - -.form-label { - text-transform: uppercase; - font-weight: normal!important; - text-align: left; - margin-bottom: 10px !important; - color: #404040; -} - -.form-input { - border-radius: 0; - padding: 10px; - height: 45px; -} - -.form-input-small { - max-width: 100px!important; -} - -.form-select { - border-radius: 0; - padding: 10px; - height: 45px; - width: 150px; -} - -/* Make .svg files in the carousel display properly in older browsers */ -.carousel-inner .item img[src$=".svg"] { - width: 100%; -} - -.navbar-inverse { - background-color: #FFF; - border-color: #FFF; -} - - /*.navbar-inverse li { - margin-top: 10px; - }*/ - -.btn-login { - border: 1px solid #00A69C; - height: 36px!important; - margin-right: 10px; - margin-top: 10px; - background-color: white; - color: #00a69c; - text-transform:uppercase; - max-width: 140px; - width: 140px; - padding-top:8px!important; -} - -.btn-login { - font-weight:normal!important; -} - - .btn-login::before { - content: '['; - } - - .btn-login::after { - content: ']'; - } - - .btn-login:hover:before { - content: '[ '; - } - - .btn-login:hover:after { - content: ' ]'; - } - -.navbar-inverse li a { - height: 30px; - padding: 5px 20px; - color: #00A69C !important; -} - -.navbar-brand { - margin-top: 20px; - background-image: url(../images/brand.PNG); - width: 201px; - height: 44px; - margin-left: 0px !important; -} - -.nav > li > a { - color: white; -} - - .nav > li > a:hover, .nav > li > a:focus { - background-color: #00A69C; - font-weight: bolder; - } - -.container-fluid { - padding-left: 0px; - padding-right: 0px; -} - -.home-banner { - width: 100%; - margin-right: 0px; - margin-left: 0px; - background-image: url(../images/main_banner.png); - background-size: cover; - height: 258px; - background-position: center; -} - -.home-banner-text { - margin-top: 70px; -} - -.home-catalog-container { - min-height: 400px; - margin-bottom: 20px; -} - -.home-catalog-filter-container { - background-color: #00A69C; - height:63px; - line-height: 76px; -} - - .home-catalog-filter-container li a { - padding-top: 5px !important; - } - -.home-catalog-filter-brands::before { - content: 'BRAND'; - color: white; - font-size: x-small; - opacity: 0.5; - margin: 10px 0px 0px 15px; -} - -.home-catalog-filter-types::before { - content: 'TYPES'; - color: white; - font-size: x-small; - opacity: 0.5; - margin: 10px 0px 0px 15px; -} - -.home-catalog-item { - margin-top: 10px; - margin-bottom: 10px; -} - -.home-catalog-item-image { - width: 100%; - object-fit: cover; - /* max-width: 320px; */ - text-align: center; -} - -.home-catalog-item-image-addCart { - background-color: #83D01B; - color: white; - display: inline-block; - height: 43px; - padding: 10px 20px 10px 20px; - font-weight: bold; - text-align: center; - margin-top: 10px; - margin-left: 60px; - margin-right: 60px; - font-size: 16px; - font-weight: normal; -} - - .home-catalog-item-image-addCart:hover { - color: white; - text-decoration: none; - } - - -.home-catalog-item-image:hover:after { - cursor: pointer; -} - -.home-catalog-item-title { - text-align: center; - text-transform: uppercase; - font-weight: 300; - font-size: 16px; - margin-top: 20px; -} - -.home-catalog-item-price { - text-align: center; - font-weight: 900; - font-size: 28px; -} - - .home-catalog-item-price::before { - content: '$'; - } - -.home-catalog-noResults { - text-align:center; - margin-top: 100px; -} - -.container .nav .navbar-nav .col-sm-6 ::before { - content: 'BRAND'; -} - -.validation-summary-errors li { - list-style: none; -} - -.text { - color: #83D01B; -} - -.text:hover { - color: #83D01B; -} - -form .col-md-4 { - text-align: right; -} - -.account-login-container { - min-height: 70vh; - text-align: center; - padding-top: 40px; -} - -.account-register-container { - min-height: 70vh; - text-align: center !important; - align-content: center; -} - -.cart-index-container { - min-height: 70vh; - padding-top: 40px; - margin-bottom: 30px; - min-width: 992px; -} - -.register-container { - min-height: 70vh; - padding-top: 40px; - margin-bottom: 30px; - padding-left: 30px; -} - -.order-create-container { - min-height: 70vh; - padding-top: 40px; - margin-bottom: 30px; - padding-left: 30px; - min-width: 995px; -} - -.cart-product-column { - max-width: 120px; - text-transform: uppercase; - vertical-align: middle!important; -} - -.order-create-container .cart-product-column { - max-width: 130px; -} - -.cart-product-column-name { - width: 220px; -} - -.cart-subtotal-label { - font-size: 12px; - color: #404040; - margin-top:10px; -} - -.cart-subtotal-value { - font-size: 20px; - color: #00a69c; -} - -.cart-total-label { - font-size: 14px; - color: #404040; - margin-top:10px; -} - -.cart-total-value { - font-size: 28px; - color: #00a69c; - text-align: left; -} - -.cart-product-image { - max-width: 210px; -} - -.cart-section-total { - margin-bottom: 5px; - margin-left: 175px; - text-align: left; -} - -.cart-product-column input { - width: 70px; - text-align: center; -} - -.cart-refresh-button { - margin-top:0; - background-image: url('../images/refresh.svg'); - color: white; - font-size: 8px; - width: 40px; - height: 40px; - background-color:transparent; - border:none; - margin-top: 25px; - margin-left:15px; -} - - .cart-refresh-button:hover { - background-color:transparent; - } - -.cart-totals { - border-bottom:none!important; -} - -.input-validation-error { - border: 1px solid #fb0d0d; -} - -.text-danger { - color: #fb0d0d; - font-size: 12px; -} - -.cart { - border: none !important; -} - -.form-horizontal h4 { - margin-top: 30px; -} - -.form-horizontal .form-group { - margin-right: 0px!important; -} - -.form-input-center { - margin: auto; -} - -.order-index-container { - min-height: 70vh; - padding-top: 40px; - margin-bottom: 30px; -} - - .order-index-container .table tbody tr { - border-bottom:none; - } - - .order-index-container .table tbody tr td { - border-top:none; - padding-top:10px; - padding-bottom:10px; - } - - - - .order-index-container .table tbody tr:nth-child(even) { - background-color: #f5f5f5; - } - -.order-create-section-title { - margin-left: -15px; - text-transform: uppercase; -} - -.order-create-section-items { - margin-left: -45px; - width: 102%; -} - -.order-detail-button { - -} - - .order-detail-button a { - color: #83d01b; - } - -.order-detail-container { - min-height: 70vh; - padding-top: 40px; - margin-bottom: 30px; -} - - .order-detail-container .table tbody tr:first-child td{ - border-top:none; - } - - .order-detail-container .table tr{ - border-bottom:none; - } - -.order-detail-section { - margin-top: 50px; -} - -.order-detail-container .table { - margin-left: -7px; -} - -.order-section-total { - margin-bottom: 5px; - margin-left: 40px; - text-align: left; -} - -.fr { - float:right!important; -} - -.down-arrow { - background-image: url('../images/arrow-down.png'); - height: 7px; - width: 10px; - display: inline-block; - margin-left: 20px; -} - -.logout-icon { - background-image: url('../images/logout.PNG'); - display: inline-block; - height:19px; - width:19px; - margin-left: 15px; -} - -.myorders-icon { - background-image: url('../images/my_orders.PNG'); - display: inline-block; - height: 20px; - width: 20px; - margin-left: 15px; -} - -.login-user { - position: absolute!important; - top: 30px; - right: 65px; - cursor:pointer; -} - -.login-user-dropdown { - position: relative; - display: inline-block; -} - -.login-user-dropdown-content { - display: none; - position: absolute; - background-color: #FFFFFF; - min-width: 160px; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - /*left: 100px;*/ - right: 0px; -} - -.login-user-dropdown-content a { - color: black; - padding: 12px 16px; - text-decoration: none; - display: block; - text-align:right; - text-transform:uppercase; -} - -.login-user:hover .login-user-dropdown-content { - display: block; -} - -.down-arrow:hover > .login-user-dropdown-content { - display: block; -} - -.login-user-dropdown-content a:hover { - color: #83d01b; -} - -.es-header { - min-height: 80px!important; -} - -.es-pager-bottom { - margin-top: 40px; -} - -.es-pager-top { - margin-bottom: 20px; - margin-top: 20px; -} - -.es-pager-top ul { - list-style: none; -} - -.es-pager-bottom ul { - list-style: none; -} - -.page-item { - cursor: pointer; -} - -.next { - position: absolute; - right: 15px; - top: 0; -} - -.previous { - position: absolute; - left: 0; - top: 0; -} - -.is-disabled{ - cursor: not-allowed; - opacity: .5; - pointer-events: none; -} - -.table tr { - border-bottom:1px solid #ddd; -} - -.table th { - text-transform: uppercase; -} - - -.navbar-nav { - margin-top: 10px; - margin-bottom: 7.5px; - margin-right: -10px; - float: right; -} - -@media screen and (max-width: 1195px) { - .cart-product-column-name { - display:none; - } -} - -/* Hide/rearrange for smaller screens */ -@media screen and (max-width: 767px) { - /* Hide captions */ - .carousel-caption { - display: none; - } - - footer .text { - text-align: left; - margin-top: -15px; - } - - .cart-product-column-brand { - display:none; - } -} - -@media screen and (min-width: 992px) { - .form-input { - width: 360px; - max-width: 360px; - } -} - -@media screen and (max-width: 415px) { - .account-login-container { - margin-left: -50px; - } - - .page-consent { - margin-left: 10px; - margin-right: 80px; - padding-right: 0px; - padding-left: 0px; - } -} \ No newline at end of file diff --git a/src/Identity.API/wwwroot/favicon.ico b/src/Identity.API/wwwroot/favicon.ico deleted file mode 100644 index e499a7453653d1e8662122a9d116bcebee99882d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 WdilCo?QHo#_@5}0cb^wq4*vo1a-z%t diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.eot b/src/Identity.API/wwwroot/fonts/Montserrat-Bold.eot deleted file mode 100644 index 1c57e5d957db422b1ff66e45a812b35cd5df2162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29744 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 tAASp@`s*a{|~9TRmA`R diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.svg b/src/Identity.API/wwwroot/fonts/Montserrat-Bold.svg deleted file mode 100644 index b0cb0ae..0000000 --- a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.svg +++ /dev/null @@ -1,1933 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Sep 12 19:08:28 2016 - By ,,, -Copyright (c) 2011-2012, Julieta Ulanovsky (julieta.ulanovsky@gmail.com), with Reserved Font Names 'Montserrat' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.ttf b/src/Identity.API/wwwroot/fonts/Montserrat-Bold.ttf deleted file mode 100644 index ae33a4538132c8fc174dd53b3ce771009405d7a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29560 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 diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff b/src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff deleted file mode 100644 index 8ce1effc973d831c66ef7d2bc2533c37aac6762d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17348 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 diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff2 b/src/Identity.API/wwwroot/fonts/Montserrat-Bold.woff2 deleted file mode 100644 index 16cf34a7c109f6e51c497dbdb1b249c36b343d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12112 zcmV-WFR##dPew8T0RR91054Dg5C8xG0CQjf050$V0suk)00000000000000000000 z0000#Mn+Uk92y`Stw0C83%GaiVW#~DD%z@~r)NX3?We-(UYdI6 z-0H18r-Or^cSWlPm$+;LDGWe-D?4AcKAm|gg?b})R?A5VpTuI=85jIARDu64S^Y^4u{b>5ux4M`uyXjmu` z8MXw{VVHQi-G#Z!MCXt?|FF%zQL#B4GYf5yN&x|}2on?wW!Q6K)Tv~ zu3c2W-LBN!u7bnvoz+zIG%a1a(<+$154L6dNZC;{RMOBfbgl`prhBe@F)3W zKUHbtr!s(`od*n(bCc5BfKNqp%XW|riS$*5+W>j^e((RZEV?b#@o;}o2uGLtak!Mt zoA1PZR)>WihMWn0h9iVn~szO&+)%V9VK5=(S zPI)bQn$nOP)3!2dOolu@b6(qoCWsUwA|leiogbV1V^wZf?v{#}6QnH=|L?(d9TXwH z5aPf!$nX1UN0tCTzQ?}3om~I8Zi2aQQbbKhwDAAJS6ggxy}OqrVxYTUlpMZut>|kv zQciTo(34qz4gKHbls%Tx&cl>uGS7>9=`P#Kk?LQ&>(dsk)!KUB_HT>Z$2u;Z#?I$% zRF~P^*E8?!>l^pK8n_N>hQ33|aABl5Iz3t%uN=e1J0|XvzzGz#G2d8ad;+&MX*UI? z+NNyNY13shYcsalklB*Cy*b;wR;|Fi)4bn&oB1B|Gv;?JU>0K*OBSy!H7$!QTP?dS zPg-8HGPUAc6**UGsFBR9i2HPZBpv^pogBBYVq-zZr)5~nI z5C!dctpZfkEl9H*mS~iZ4h+kgR-16cvFZ>N*2fvh@+#4=s48j8@`^*1>fk+2XVi&^`+9ZH}@{FL`*43R9n|AN%{7OSU0v!j_x1tQ*@c&|vbu`GlugHsP>(Kz|1j&xu+- zQI>wcLR1BbmhINZeL2(^*V;(~G?P}eIXX7o=;=e3ejkLxPzZ`TMg8>kDfqs4&a3z( zaSa+`6AcR*<)P~h=^pYXE-SWJSPcz;0unp{r|{MTg^JM*yv|=ZITViAsq;?4yjZx; z>>-UfH(&&CYEany;UTIl;;|P|^FyxH`eItFaI_t;Zyi$dYjw&Yop1=iqV97#e2>*E z2Kfw&IEemzu7}XH7!hXHK8P`jLX=XJIV(IXaqC@+I%PPnMf2!HB@Q}_BX-&egplWI z)HJMdLl+PrAbt#vdzyz^rf?jnUZB8LnD#tWI7%)!ZIe!KQNbkURy;MWYAM<--I%ul z_4L4*3Ham1akVf0#)?0Wa7^KF8QJurdKNR@=`f( zYBz26+K=}=n(ztB)2KZuIj#{lmU88`YIGuW^uW{;PlcH-q>X@8D!l$u#w%hK$*e9l z@b4xS{hMZto$g<(YhO%#?!R}|U)uGl=cDHD9WyB2Ju_^fQBf2AJ3l)Z z)_RDWs!jd*V8%u>KnbBw7gft#+^fY;%oTNtYRlJye^vn#!%**nn{nSSJcO{nDvHgbR3Hv{B)7 zsUhEkzL}`fb?ZWb6y;#FqilrPFqJ7({yE6G)h!j{dSPo=N5J{Ib4|r;725GOANt|l z_Hzc+x@U*YG^&~|QNXV4$80rDPAxttt(eG)aa5r5m;#8ZI@!TIpWR%pn8C0cW&<($ zNW@|$WZ}!OqC2xZuA7Ru}IJ(ShW;yp- zx6RKlXfbVHcCHv#-LI3JWMv*N01bGa@6#IlK0e`Qsl&Z#3TZ_dMo5l}XKo~ooKHnP zZVBlz-JY;mFA%Ow5YrdCHVC(Gsa358{UV%_593k3rz?x*C5N)6l+PQhdPypmxegzy z(WYn=`>^1IP&W;O!nsj2$>ei(C1)0wSX}87TCZHPN^(*`a;l}J(dm}( zcr7ktIsH9-vOSWGIR&UxwASXh-9rVA7h-j^ZTYSXoadfIU(4~40bR;zE0%JJ_`L0| zsfXqF0)#zuMSGVgYAi!_AVMN%%>{X>^!;s%3q{v5u_)At)ZBrl8>ZBu#SCR9blPW0 zDG_j|eY(C=c?`(Zl}v$pX`$-~??X#~19ZdVqR&cY$-nBo#DY>T>sk7ejx6p}V6r*o zcfOZXRD4z^2pr^)RF}pxn&?dV#baa7(@?Ec35w*`&IBA0eH1veS8x33X%q%eA|)Q4 zN0$Y~7QEYye8HLL`5;pQyyhpco9N>jS-RwHo$VPVV~0ehMsW^FyfDZlWnak*bWX7B zvuQ2c+eD6My0EIy?aZ(yPSFovIXglbzOajgRl#>rJzg|k9qTO9lXL5PHHj0x!?s-I z;4N+yK+V&Zy8se+J=9TJE%!LO6(OGGikrTsfWipjJft?06FZFUD5lfcUIgmLH@4Yt zP*%BIaPj1b`e7cqSuNzwjY)u%H-j3ytP=U9)dECuR?tNumB?uQPUn}(bvyqBoft>} zByu2d6U<2DYz(zXXx02!6di7*Tx@cQ4kJ5?Oq9`SWG`mhFPc>~2aJQ1+gKtT?E&Q%K~_d2OB`!czox@)KV z^ma2Clpa0W%VgSbZ0w--CJvkSXUADto%MhJcb*MmAYO8H&0HVqJns+}q`YMi$DZy; zjQP=Xq@R(cwN z=Xefrs#-1}#Moz9Z<~L;5|EID1sO&X!%J1V%jt5j9$RY3MY$xG;UKrd6}TtdHs?$l zX6!Bkvygd~;bt=O=VJc=j4gF%M{Ws7P@sW@7G}7qOm|r*x9YK_7F?K% zb6k$6C7yB`lg{iP>B53Jxf<1evO$k-Evi(KN``y?DzQyic4%V zXUGiWtYH_HvK4#7M%mC&>!7tY#Zl{&0katt5Q;KAGp*M7-_*8_uAaVup^>qPDW)P( zXaIv15*85^6PJ*b!b!`>%E^Of%$hTA!J;M0cq>+|Str=AY0EZIK~YIrMO6)490Vj3 zGz=^pJOUyTG774AG;|CJm{`~naU@BWB2^kL9zFr!Jq?<)=+S4$CSx`mx5b1hTTR<$ zyPbB}Ww*Wd+vk882OTo+up{0nk|C4O2WyQgkn6irqN({nzyB3aJ=IN8KmGCBQ~w-R z0r<|Gb<*Yg>u$jR#43FRydtM`#Z}Kd_u3mTyfmAp9{_*(=CdzprQ=UBue|k1omT6$ zY1W}rmv+4rfKRCm8gR<8#|qu|z(Zx8c;p^6X-FVlC=>DynE6AHg?|VDD*>s@FM8Eh zCD(FwRW2^Sx25BO@t!}O(cvgsem0O&N+T?Iz?@+!J{nGTzvp?>)EMZab1gJ;OXijA z&P>|VxMb|?v6BRBDt@2br2Y$)Fg3L+tr6GwV`1yWn22M;gnDYc;Mdggy3MNvLGeyfOol9C`y;X*} zOjRvN{eYnmHqte$fyaLtD)Q3F)x~P(H&l|4A3LPNZMOl5Ard|)QD=*iHO4u3Sb!nwX_3dKw)TP_sBBjgw|C@!iFQ;>Nbx}O8Ck2^_*O=ptM z!kyW4=+YxJc?OTUaO?3nP+nk$5u@2PXyl}&s8o?L=+R@xovGS!x-hSKG|iV24HLPRZpS*O`*V{ISw8cwsCVc@=Q7 zh=a<47%s-5j1wb_9w#s%Bd8{jOx4DlL_tu)6GHEc&&WA?Bc1Uo(C339zsH5`Q=KD< z>4#V4pegs*Bw9*4gFX z)vfY5<3%g{e~_L`MzbY&(KH@@#s?K&?Do=oMeZ=(X5R`N#J_Xi$8_Zj3mg8~ie zBy{nhj|YTxa;f-9C3NW^*o`0iKGy4C>G#N{+Sgmg<2op|VMkiQN^1QM{iB_>5I*hNX+O+rUQ8e{$voAK$EvgwPU_!SBG-w60 z#X*r@cVHCKkNvj`TcDWVLA8L-;*4z&CBBXnP<)aB7tSJ=&!f%8k4QveL?s8>rD}&d z;1F=~*3{t8aZvHX!!ryDgNS2}G@RT8MQmqYR*;x1%{+_$s-m7QRvGCYMk2JGUUeJ* zcx~I#Z_?&u-{?RlYMwEQO%(B-qzqCuP(ZM!R@qVhl*%^e$^#-+c_7;GW*UH3%B^4m zUyR2g2c5e(@W*^EM3!lltFnYGou?v$4tvgWNDY()v6{jn`2NorD}@OxbOw(oVo=kL zSI8pAgnDX?ge|2OC$I*obS3297>qS&JC2vZk0?&jNTyB4Jy!z=Vxu}atv`|#lua5- z7t_d|I1L|<-Omx>FhEk?()$)7)M>|&c4yG8?I7ZSfdUG37UGXY%R$F(u?jMU0D_4o z^Qh@uBKD+^AR!xT5#T72wKA4Yf!(F3o}#!XdNF_ym zjdSVoZ6(@{?~|z&9*Em8dB8wf^L!97o^<%_*5vboFLz8V8kpvyOw%Q)T=#6lLKfPw zf=fR}BP8dg5t0N^gK-Uj+{Q5ovC}-YXV=xaF!KUofCBR#2uYzrmFmMR_F)|x%ss6} zA%rF8P0S?EK&KE_zUIEG6@B}%HukKQZub3EOW8q#%E)QZ?S@~ox>OWE^WD>%%}yu# z3U2k57v);JCkbSmB71;ZTtb}!$vTGcDVb)j|4`aA$YF3rf>ySCVHUN>m2GPl!7car zmsEu*lcn1G+W%o&o7FQ)`Q>RbXMiG!ZNDYloH#lYM+U|q|9i8EH6_hM#k|{f^m=(nEx-fILZXZv|J8U zGHk~d(eGv4R177wTO^MlHvt6mpfiIuoA*13l`kX#FV}z6U+ic;vI#)pIC_Zts<}s|7J5_pG*(h4!DpV)?FbNH6Jl3M>ZC z=O-3QOZBMAP~544lzHBhoqsLxrPI_DenfXQbSsfzJ@coUiMcMiZTw**X_H*w))pF& zX_sr=E;5F;Cr{%y#hp~Zyn+H>&7fdX$%!HTkdmU`+S~-cXL{q`!wBCE(lh#tj z=*SXki28QS0#P=;<5MnM40PKgcStl;Yh(!=Qh7d4vGTK3qI#F?#muSIr8*ceRPy(l zF@q|P1wuw^W(AV=Y~6FRfXPpxh71VBD1akF09(38Efd}Jfi@9LH3C-a&}oJjWKKt; zww1txVpmef3*6SynS}*!90K;Ha?mJ+;*`4^JNu{u5;-MQZ^z0{KI=9)clX@@X$x>I zd6l>Ic{do#tJI*}x$dJya#o0vY~KYA~bSh8(PV0Xxaxe)07Eu@zE zsvI|ai1tQ#b5^-lE#<1;Hb{AFDA%9&ym2iF>l4z}m6#_MRU{=qmu2rsy4{fA+YrJ*rF$bHWBB+PLVojh3?TI&ri7RBhsZw{DdM<43mp zSGxH5&c$JvR#P;c9G=5!2`8ZPtaGVBmB_gx=cp(R8|zV*lxDOaW_AY9#AN(AO$)@Z zj(kn0{N_GQQ+(YNyB{Gi6&*ewscy(AX;Je7T=$;|}U(@Ot5Sh&;rl$V>rK4pqBN&{s=F<~eDshWP<3VzKsSeCqW&*+j} zR@CRWr)I|&Hr}RqQXizo1qxAXV5kJZL&DKa9X!kf$FHrv-dZif=Z0O2v_s>#(DU|v~}<2SxKwq~idrt{;7J0gpxmjom_F5e*K zW$@un+&|aZM>&n`C=ln#N>5<;`EVdpFPusv@!-d!Gx_R@km21?P0yb8z{W)71`uHP zqWncw8vuTnys)9+P7h8Gz+dhocwo&Ds7K-7g1v)>^#$dH^O6jXduYLNq;%?z!|20| zo?bg;4(E@UHLngrcV^s!tWv zCp(oLy5Lb68(4lO7|slY^8zvKKqSDz6l;QI+-FYt6SDR->)cMz7&vc=$#hmdL((uS zZrH$#i0n9=O*m}LFdqIUWe`Q!D?-Gr;-OcPlYyeC7|Ri4mdX)V&O?_j_irn%<>uj% z#O#Wq|4K@L&fMt(=o5#}e3<`Hi<_w6I*Qzb9SD}57XYZoM?W2r5duT)uBTTE3DYmji)LXaO^pL?dV zraYr6g-gwkL70ulm}&3dH2&C+h>#opHNC#5> zQ_cTKDyWiS14)T*a)AGFex7)Hif4PeXT{8hO;m0IXI)e={LMhJ=0j20z5GDywaGgF zUB8a?-_L!Zn%CRZoOkPaPvI<~PEcoZ~4z)^($Lq?H3k&#MFU{CsqPfhm zAo+B=NQ7?jizF9vkUUTs6s!tfXmD=;A?xdiTt=;`p>JYLdvcSqK~>8DtiQVtP1(-X zQDIZS&%L~BQ(0GY*VLCeN#8T&Gszd>#c+S_&~56QoFf~a^*lTDI^zywzU~rOud@6! zKBdr5XiR+?2fm`bGyDcsfdfu>4Q0qd9*g9GJGj!?9b7`CFv%*##QRBsb>D8*$tmVk5ttCsZ`qr*gtp z?4TY4_g%XBKK70tjUi(c&lS4S$XFJZmQAA75?Dek6JRR{k$AQsOZ0iX@5f}nB%;*s z5-DQ{@4P0GL2P0Wz!9Co$d6rpC!>+NeGyCy`S3Lo*IU+OnZjowuqAO4z6~q>AM3r} zFE61sib&7^3dHg3Vj?aiw(l5^*(n zaxR8sS%D@mcD8@m(02^SmR`pOmP8CbjF$&j; zB%e4KxTmmJjHT4y8za+OqX=LNGX_wxNb$8bmP3Xk!Q#Eb9afI-K78T!5^PW7MfHb! z0R%g{C|zM9RvawWMPaXqjz&>~Xp#7b*&!im#RVdavIqnZEPHvk;V1-hx~Skb{tZXY z;b|qoQirFP95;GkboiU)_2|gAy?}cz-KzK9!>1z2dWz+uS&>LI!{biqZ0!HitD2F< zh*B;q-+iX#P!wSp%)6KGSsp79Q z2rYwoyIl>zVnXgX!^@zGj*A{PzGc2Po@YB0P(bJ!s2Bih@CPk@(Ai7hOX{RWBjCeb zs$j0Y>ZPl-DHLifq&yb<++F9GRk|W;*I6O|HIquXg?y9xu4Q?Tz@(U4lwph~kTTj; zHp)la2H64{Q(#ix;D^lcL**F(*FSlxDpjks{Ga@wm0Cs3s;DZ+YQ|KG6TjL;ErYf( zpSbN_adbvXDw_>+>Hoq`Oi86Dcp;{IkxW){YH|wPx%X;vN^+_JzW_t6!cYn@lqw*4 zum`$_TQnaxz1eZvaq4)Sn7a$Qi@U34Q_UVg=}W9nl<#EMvw>MQDd;`QOzN0LC1zxJ z{O*!vWOhh%>FL?5et+A-Jwakdyr(~YF#%4KWv0btL7MPFdMvuk)0OK_aP@caD0TBs z1F1bR(74!jWFoptp z;Oj#XPYIknT~Zxve0lV~bnpC~B9K`O$^l(HC;n;nT8k@LjBIBk$FKY`ZzhIpbJ}K` zp?EES-7YZ8ru;C1{wA$8bwwCv=Af!;L}|?d--$5%O(IOsNfAzyx6fihqU(vFu>`hi zWN>l}k0rtaXao#Pq5t{q54cH#3fi#4B)`NF-u=hlKgu_=9iu||Q#Oj_Eb00M6l{+? z9eG?@djJaGDx(_PgX(<;Y8ZyAH&(F05cnb-XkZ*Qc?Uc(dJ|H$d!O$QNow*Nht>|# z^HuXIMtsbJf>@Z85R}(1c z<*vF?9gcCT_k-{q)MHsoDHNDr;|+kb$k#-rbInH^r!7jgsO%6{Sn8>m;;M}k&r*ni z5Fn^jfbYB$hf;|(c?T+GW6^dBdxesZ34eonaDj21Q&@Ci!C+4a6!u^xKElYn`5xe5 zR9V;eqO0*{M^mPKP}pDsluBZSyjL=-|Gb-{B};1d1Pt;)bIv_$m8( zDUDgfUOC_YnT$kFfDp4FL)0UhjWJ#6mUvBm!Hi1Yb7f;GZMT0vxaju0{5e4ASo6Ko z+F)%ZF;aBN=t$Y>g*A-!n5HaRL&@myzG*zY{6N7s-782ORj8Kr$Z=4OC)r>OL9Unv z#=y6KvhpUNlQq9hhDmp$RM!Gp%zJU&rN8%ge}5Jg9{5f%sra>@(KYBYnR@ox7THC? zaPytU__6%r74c%0m^Z|xa#Xy*AF zcs4N>(=7Wu<5ofIK@|QDuTQrHLf=nv*sdY*tO_$?0T2J~@m7CR#TVt!xT4OHUZa8mA8afb2cmWv)57 zGfW=VmDP+_UO4R;uCo$XTU@ojxSA2QFA7ACkU0te4rx@{59QwIk9azn{;GYc9!S=S zs{!NG;c3Nqa?RG}#`IW_s;heKRr~E1>_i*ogzbeI+ghbF1$}Fgf!g`qCNncpu5-nFsZ1q_Fi?#1otUs<`3l?r9HMwj?MTE)efEPI=Q8Gi!Y!_jtcSxpc`c7 zXC57>9XQ#2a;O$i)Fo8vTNzmN&^smY-0t6W28+K;nIcRxMCZ)=z)m;y=>`U7zs+v_ zItzTt8N3yRlZ`Tka4owS%N7)PX1-$l(F=9|s86eC0fB-Ta#BWWYc#rWqHbkAkHOG& z*8{8QvEo=s7Bj0MMm*lizd8=zGA@3Yas*ZXHym&}hdg)Mx|rY7oLNV;6SQrX6kU)M zZ5Fgq?dmd{dy4ti!2Epa@PQru;pt1F2wYZU+XcCBUp_xErI?Q9CBkw#U459VlVcE$ z*5Kx>_v{PrSwaA$iwuq}jwO30kG&KF)d^{~ZLL9N4y(25UE;sqCg9iqy!<(^ajU*A z7Tnpr(VX5j((xbodXksGPvG-tT;Z4?haN`p-M*dT8%7u8jPZo@zivn2Xo%I8@Pq5> zSHsc6?luR*djbEp>xTxT2$9LGEzIO6C^fZrb0$p~+l`oT*0_^IAq>-!S3pbK10dT3 z%p#<>1Z(0RtD(`Bo=}K%zP{_2fN1y;vXyiKh?$aUqm=E~TA^&xgL6%$hw5u{8_SoC zyK_MFFFH2%Y+Uw227G_Y;d)l{u$J^ydzbc(w@xBqkCd8^!wr|*XM~P7CMfp)yU%0) zO``s$LH*`IjRw9oG0#PVFLo2SFf3KR@Zp@Z>pPCcf!K5d?=i6`0VbgKmqAheN%z1NQ z0>p@%xW$W+5#2nBszBm$>;q!En!Ec$1$B^qx!pihd{>H8lsF1^-xJndfmoHmXguqO z3C-PY%OfF=b%Qh@q3RtBqA*tTBl=tT>D`1OcTJ-NGw$3#Y}B=2GnQ@FfQP41-(ysc z@V-vcEbGiK+nQNA@Q+PEHX@7hG$!99BKjq)XI$p$B(cCO^e)W$G6j{){{mD$#?OIn z8^2K7B0DH@`!N4~HK25c%RH552cyQ>H3_gqMjQ*|#2hQzitDH-HurUG-{(Q<|es^L9ZvvAk8Vj?rd&i(905d?@S|= zG&KJwz^~hYKqq+G-gCCYHva}`uFkBACDK~fHR;k9Yb>@S8q0Aa5SegQk!Oy724FL| ztK9(8C!%9J&>k!XIzJ-)$6-&bE<<`@ZU(irA?a>14@b1$Onb>DCwt9;`3S#@U+mQhjmP^|OP;0k7Pw+4^cves6t{i! z%V*+~i!DzK60ucabO5Be6E@Pdg$EQwu-mORcdlO;p$8tmu`$SXwrJ%sTP@!L+cKr} z*|u@nDt4r{SJvzP8DokfS;>G z(AMp^X#i&rMr`8@UXyii&1+%oEP9Pb;GhbJLu(7}`&Lle)K9{Jt@zwB0CE@Pn|in6;tN zy!oO7JQ8VrKvF$zN8gVxc%K#Brr9rxnFIBOG77iDl{(o0eNml{aYDZBVerR2z= z=TE$w_)ikBbBg8MWPccGe(51*zWM`AYsKI1UI>OZ{;}+`X|Y2APeP9w{C<3)6bp~E zafxI9EFF@K5>~P;%L3z^C<&fF@qO4J{@Zw<7mNbK?p^`!cP|_!J)8C>c}0Y@KU{YEe1_BKaI`qSg*%tU$jwb^q>1a88Ypguf7|z-C3vY zz$eft-FX?#IOnnpF1qBEOpC6#YNsq8b-7{5b=lr{r-@JwkvzG?M&v70ph&S25~ZYG zTdRyrxk?pgjH*_p#yW4kHzQ}sE(j%X7hPP+Biv0ZhD4xPQ0pmj?e&4F1=kW4b2RMMT4$LkddCR&gB`3fUw&{ z%oZ=u%uUaiXp?z$jU+=`thc6l4QT|ua|AH;n;RCH+(Wy_8Z@zXkxn#ej)>waEG`q;w?3*l#D5!vlf`Edcpa=+v#u&31W7MdLPF80$ z$&A?(V>T1BM-$_in8g^gjB%n-qehMU#_jia>fS~cGkMgjQaJGiior1zB#_kwnWSR7desJ4JuLnmI=h17=A2&9ZHM1tx z&e~WVYsGIh-ZSRNit%|So5vb)2g5RNRw`Sxu?E@0$YNO}i^gvZz74!7oMC;Spef<$ zj6XKaX~cxlqtrWd3-M}~n_Dt=`pNVWj8#V9v+t-8BXfBi)8jMYZX8uOenQyTwz2qJ z&zS2cqb5wuZhWA9HDhz5>HF~$qGJE`Ze=D0c?6%QO`lWU^63}v9cN7M#+YvD%<8rl z+;>9%K)l+`Y`kTL&sE(EjM=}&*r?0(b=9@kQyoU4zc0Q|sK*V%r#9%rOYk|ceop&> zNfilO@%b_c@NR6LUj5;Ly(x_K`zNH~G^ct&3om3z_0*FjhVd?LTg5t!t^*ue=BS*Q32b@p&wEpE?Z^NNBrnS zAz#A)Lo64Q@i||8sgAL+yZ~btFn_+8rHdpM z%?Gh;{u9gNUMySWGheZprSjX@U@?}(ifk4l(pZql!TUy*CK6brSj3V6)69d=CzOpA zg>0B;!FPqMfL~{Ux@F8PjsVM#ShYCF;&hI9U4^Rx*9Cm;$EtY}-iNRu;sd-Uuxj0R zxJKa0V{zgI?R7uC>tLbiH$(>$74I;ejTdtePq2Za#d29Z#iICh-0#nP@fyaLGY|1K z%hP4?G|&+yHnJj-34AxQC@~9d?*gn3m&p?NG<;`bNxC$aBR@X_es5$6QWj4^7Asi-XebtUu~M-C{Y`8X zWE9RFK;uG|gudCjsm!F?i0dAVf1SmPAHZ+oIlXqfY@93?NCuMsBm?c@NtQoI26(-K zSDns-d0Y8UGU$GRu4wrgG9WovFDZkU0CNTSM*P0XrQ3@8St|cY2G$F_KL!~<4wi$s zE{hWAmzDn{gYFk}RDLEIbiYUjBx8DA3Rxss&I8s-f-9!59MUg*mNJ%dUW@zL%#UX> z52BUEvk7PMxFQAV8ZO8@OnVI%3&C5+pY)7mEuMsJJjphRKvpaKSS=sTTKFxjkbMW8 zFtDj;8z+u4KjF=a#kX+M`eRss)W%izV?0JfODz$`qB$MATb#7FQFUdF5W zV*a4`RQyNxfzi$AZS*q+7=w+`#uVcS;|u-){=oqvKp!wLz$L&tz%O8EKwiMKfV!Yv z*M!9am;}|xo?tKW5I{BaM4riuc`2X9Zv)g%#C||^HF_C+jYbJIxffLDZcu9hl>@5I za>??m|)3IvHr}SIe@2*Y#?S^XXe6OAv<^G!91B48-!rO2a+Ak{MZoi z-JbU{A3p*+1DP_AmA{dzL-Vo`crC$X;eIvCZri_9}awy~f^P zTiKiJ9kz|V%id$ZBT%YiGuSM4nk|4fwIF!9$U4|;_}yjfF{ZFKF1U`>v-#{YyT-1v z!_30wutgaA8TK~2lhq=$>SRBHomUW)-Nw$~o4eRO>|ypL`-=U_j~Xe( z{ltD@bJ+p*Gdsu@vP0~@>_3cc<(7Lk+uVpBOzi#k0L>tB!Dh#s>iwvs_j~SjZ>@!@o z^Ri2`tF>EV_lDg*yHovK`i1vP=r^O^(tiK!x3k~z{x4LKj66mI|m$gv~!GbOmQrC zT(cJB-etSX8P{Of3fB(TH(Y;kRosHz%H0;YJ?6I0y}x^gdx!g0_v;?n9xFXQ z@Hpe?=UM2v%JWIjH$1=aJnI$iRpqtB>lv>v2Z=!mgUSazH0ZrShrJ!WM|d}SulL^T zeci{;C(~z~&s{#x`Rw+&?(60o;hXDQ<-5rDN#9+A9R?>1o;LW7!7mN|+ONM~fnST? zgMJ_R?e#n2cYTQCkcc6u*XN+I^2l^-Y z=lYlWKj^>J|Ca#YfH?TX+JM%8WdXYa6jO$&%Cx|=&h(^dujx91zcH4}>}RnXHa-B6 zx7l51(zyi3CB%BT>Bp_~EA$JEh)9o!5WDYG9_9_5FVctf2=p7vcknR8fI5mhUE|H} zW?W;(Wsc)JF5(AzCSdDKybjnt@CJ;V3}%DLU`mu%qB+ro%WRMr?wiGi#=*CG%=c~f zUF+N8JJX|faH~i2;O4<=2e%AqIkVPpEq`rO(?ZEAWBKTVr3hK>bUwu*GbbiVL4 zm~m|5gF_NMJmVvITtXr+^6)eShq#;lxSQVKp26erLFnDkfcxAxXLL!~+=g4KGn;C% zvd8M$8W+uoPKrpIV-8Kq8|^rC(rCwzd?vrxWE*R?%c+R6f5)fdQct=-IYrv z*qwqYZwAB|17d`|ys1||G%u;DTvFxSIZ|wUDJ?84Eljy6?|djf5dAThQ(~j!u?e1) z*#-p1$0bJccoLzzo58~~A<U4 zSaQm&y!6rhweX~2p-Iu9AvD=QFWBQ!FQitCmHL4Dv6fr;P{_%iF&7MPk^(a8pD0Y3 zA5&BmGe3ntf8HI{%G&5woic6R0*0Ap6_bEqg!*dPv?tx8^(1;=MYa* zq9G(PB+)a(Y)JGpc=DpDb|dVj2F#cdP-Pfls0x@llfRVN+LoDOj!hjtcWy>XtQjz( z*+arkG!c%8@uqmvXtTS?{q+0qm%so1L+@3+^G?-!gj=@dVMJUjF&nZ(X(|J`DKR)Z zB5jyYT1rq@mT~CNw4u}MU8!vzyU5q^sWb;C#{0YH@q&vD4HCv>z__2RCqXs0fb5|e z5fK@I8AI_34dTq#vO>h@hEiX|E++nYtunq=H}v{6*j6fZZl2V+fs&)K;8K8aN-%mj z>5VT=*j!Y!dB-a5w`!I03;*u;n$;&)E2VtQjvdMyJ0$GEfawE%VO{8Ib~ZVi1}iPA z#5QPJvHU(3w(AA>?)U`IrT{}o1}Bx$59I#t{_%-?Vp?WQY4X&_=9iZw<^PkXD*=1? zoy8@olM_egHcv~a8T<6y+HWPS5X&Xe4`X?fr|@?-_;G*fM>BPgwHxPJmxT7snkUb5H;n#i{W z=nWa%3KDjom=Nn}h~(sI2s*E+oXiJRC0E^kU;Q(gfsvu(4ppRjj%_I#*D)?nR4tzE z8*|&9#SfM4UlU$DYLc5#xt=q7?8w>qz&jH3dV^j&m3PnrlY1mTsqDXt`(Nf~KWpfG zNfcHQjXIVLoN~lxh|MHcE+ElB5|ch5IL<{9s&})#e!pvJe%+emYwGgftgo2dGP!a_ ze*TPn@!6~=GBVrC7cMMs&&+tD(~{bhme#~YdRbap8I2>D8RJA-X%C7`NOa^T@^!MW_y056=M{{s=|eiVA<`SM2_aY>=BEE(&1?WgT~;DAYsr(=LbhVH z8SZa29rPUy8~qu5`y)o}Zlz9I_t6pQ!+g?Vtr9>sOg1HQdc8Zh?SjD(r_K{LVv{<< z1-aYecNqUp*@)%CxWzxTZm@rG((6fDqkjejb3sWVBC3BG(dm)ta%R2wun>I`~! zq0Q4ga;~d!v}bgI+2)r1^S8A4ySn*%8eB>vhYgP$_I-M2h;j6wF)>jgWp&k)(n7u5 zhIra}gen(?rbpnPD$l!gW!TdgifEi>5b`2W8^|<-{*YiXW15}aV6T`qjCv0xRgQ?PK%=*6QK zALNCnPruN3Pfo_2%lEE{_RmqC%AGQ1ip z6FI>sZqK*pF6MFcFE{%3+c#_=ueD(gH!24qfok+wjXv5u9LAmffjmuxj$Aq(gC2$o zDu!}rNzPEt*D7Cdr%^KpMaQ{1x@3)wO;uih=#Gr6hu_K?`M2l9wt&G2BZ@;E4R(%Y z*`t%P_@k3zBa|Uw$(1D2IM~8A_(?c>vII}Pk=RGZZ<5--F@17$L9_DlSKsoHbMj-$ z(q^q$Jv(gJxLbGgq%Ri~M+e{cEw(v@#QQr*D|DT~i4%T2&fi2>iUGT}?>csd4^)2d zxcl~d#kMza}{V{iuf75=QMS-${k5^vdcPj9}&2KeqYeplj zy%}%&L1U>krT~A#cRWGa)xp2!V(bTVl!IbhlZ0)h5vz1=b|;nSPGW4L7}+s>>*Js> zvUYgbgv42ER(_hpOHR)r5+|3NeD3@C-l5hppHXo%JDZ*TabZ;F>JC1oqeJ-@2>Oag zb&lkI$}d)$81V%2AI(wK9UUZUmEIwit9&=U1Gg}zIIF%KYMBu4ynvT1s$N){Ga@T8 zOBBsg%nKKmR%T^naGG~XKVDIB08DP~$4xqeJ7Dw7hm@my@XBK|FpBa#pQwDH%;&L9 z+tu-?p9lJ3zLdDTqsMTd^Ez!jt8jJbh}AJOLuNjlXhSglUB}jMzIn6beD*m&9nIgw z1RJ3E@L#R`ID|fs0X667Vdi2^#~n(0M+bk1h~X8j^X%;J<}7dd=j~%=wI=5bf2?pw#{KmC&qWaBE~m1 zqRnK>6+t==Jq;w~gcpU2kgq)QpVK-vDc3i3)VECIcPk4Xe(I@*`7-6UY3K)?7jL1T zo-uzoKIjwQxI{U+dkUn5X2?9+h-sR%T)W`XVNQe^Qa-?F*FacfSAroyv9Y#-CO`;u%UA#)(4P7PKY5 zSQz@-tNpPug7{q_>^y`?XMj^f&viO#?*@dIVSN(mQ+pL7#u~TO}FsvXXERFasSP@{)#U4AY zGNt_ngb;h26NHR11N8j+M;`vHu%#t?M8%StX-g}F@4AbRO)eBil&|WPC#t7CT31JO zMFP%X;D~$~W_tugSR_lkg$?uc=8aFEnUFnl<;)p>%g(O0d-(jL6N=I**UlJ`R|6cP z(04p=aG*U~580XAIOq)4kl69iW8Y@Av}DX*QM06?V(B!yM=q}`=YgHxg_A#?R{h9~ z8Il%)lPPiVfcE0FC#V?E=UMxaQ4^h|a9xDAzqDpO`H zTlP)1@>S7&6HAvB2{$GB{`>PMrWTivh)P=b)4ECHmCvSD+&8rbC<4bK43sKc*o$N!jhkX#1 zXon9f{krGDV_1fy9~&}QGDw@ycwnGcNM7Z|;$h=Eh#$!lMN2}v$`rTin56o8jVq&b zmHj-hU=+A>gTKCA{FU%My7AX%YGOD35~v&O1%Jsds(_!m-q2P{Hqt^o+&UkeI`zS+ z+<0c=#xol$svoPaer(5vBO5k=GLlV^B?GqU+ub%v#O{A#o60G%ukwa%l6_^szBD+h zeUS@u)?3Z%lZPMKm)+7*ct*3X$1bj`tLzNtE|a&zx?tc^Uc3n~FfU+bI+zn489dQ5 zfY(nbX=(APjN>}~eB+eE!fkeJCXzzv<8Qf)c*>Xdt^&ztsjKt&xRBrw>?lbqf{wbo zdHU%*J^1dX(v;hx6DlVKN6fOb+0?eRI6SK$G}hZCD>lj}VZxN~;7PeApHQQY4{I1x zmM~%H;KAMw{hXZKTmmr`=4RL`#puujI6@dcmZ;>X<%<5t&^-Uh)YWx4IV~&s+sfJC zVW#o%(@VI0`O{CA6R!D?Q@n5^IR{DSBW+a9sR%^)4v=US^m%UVJSpYObCsXSjL;wR z7S?NS<(HM~%9&SQ;RCrX z`t-9zh(z>(KlW4&G(Jua3FotJbgJ2uANAdW4I36Hif8HG_$mGgMn~bUEa1yJm&K)_ ze*^|TBV1%GPgAU%VKezgwdy%si=9I)P23mrqujX|j3CPce>~tc z1JbcWIu!dVwa#aNaKqgaDE!v`~I&pl^nx$mlOHam0wx)sZ3 zWX>I(ot~PVnmwU${^(K33)}729$f19=I3NV!iRSYjiZ@RlRX*aSQRSn`%n22_ zQ*&O(smi^yvZ7*T#UpuJb0_DPMGPy?Ez5g#^pxDn@bJpqNmc7AE7t*M_z&?sY#TTy zn&U%Y(>gQwiNEe9gCxQfZ<_I*&D%>qyYpSc_S?U_`z_r&@80&_-UR(*K0$e(XDKgE z)+bC}M9DMYJ;j2Yn2hsiZv|SV!!-pvD*PorN_k63p}%NnMy!@7=cqWegEkW>A(%?A z+wCW?o1yMH(vBa#i^n1WUJZPp*#{AV>4AAu;zmXW<~3(F#ix8eBXdM#LZ%S5;IeE-Po*tDEkri(59>PPzb3$XrjgBpHa?TAJSzS|5G{P93Tr@7a z(B8PQ#u!wXsM4@Wl<^;dh$@?=?pgAz;-az~f6lM5pG6$)D(OJh5Ea!Fo zvDZd(66}>>cb8V*E>3bA#+az48M*>EUH`qx*I)1D5zoA-T-^Ew?;kMYrS=6|lB45l z^YiCK^7G2ReS3NMKE;*m-`=KNdHcgrbG9_4rAFk;9wXz|ROJ5L<$eZ5*of=knc)e# z!q*$oD|e3?Qf8h$BGEtCGs4^umy+Zg6U4vv4~hsJ-7jX4ziCR2d!UOe!YPtt63gWO zMU9Cqc}7mlx-w<|i^3F)TcOLQ!8P@q4NV-GBGp{ND5x z0b~8{m$oS;V~&+;15OK?CgpSS@}xYjV5 z?oBE|Kjb8MIIogxbLIlg?^mM=oE#uQkVw_COcbH>kR0`NM zd7I)LIaV~K6ado{ULX3A*hiE07;O@F{x?WPf0Jd6NP|ys297XbQVsf*VN0;7V*wvp z*;4N1kyz{&A|fWXUw>SuzkZeftPA!_k^M&@yZ#fu5AtCyS_C~xZUb|pw)@LjIAZ4$ zXiamnbuoa*)PUI6<3z^PKyTL&WU(9qN4e$B3r_Y(?(b9MLd>29Y>Coeek++#;{^HljMa$HM+bgg)+I?F>LT+W*hUSKkrsAV zFq?oRP9dgAjL%b64q=BRLWS8bVGfdU z1Yic-K5K?!3_3Gt-~WtxFkGhLJJ~8;xH&iWhZMx2J=~ z&^qrX_}^4j#e!b+yxK>1yA#L1>!Zkm#iKfHKm4!E>LNc*_9U}9iDqakC0jFei3#y8 zs*xvr@jtfW`SF|W#rJa$<@VOScvuUB{DW>ObfZ7zxUfAL;t%1v+H*vbiF^}}yK9v4 z$_VU!zqDZfE41-IyWiLYSBm%mxyYHg& z<7B29j30EjN*J)U?zouYzyY!+I@$FLtFedD6C=^QG%1PDvC=kQ!b8N=9bN!=ER&p# zF*}>}y&!+=T{*y?kBJKRnKsZbU)OU4ek3X)B`+%CF0Gyk{A-kBxS$@X`zXDq-d=;~ zOs2TNz@;=32lX1^*FN(y@t4LK01ttjB6d>^ny4_ZLt5m7$*TDy*-<=7lUd}jtc?ri zul4hb88SrIIDD$Hvlxtj*;qBabEA~r2Se~p%n+>IFMwe`z=sT^$QCn<^*0{n6CA5& zo$d?k&VHxTIq?DBG;i?J*s%X#=GG>u4hU3~kBRRTdq>C|1!hP!M=_Agw4mJKkWMX< zci++HGHFr&kW=mrN9TXv=3W_$cKwikxm~Vrxbr7Gyepxh?&D5|9_wfxqg^svD+S0k z@P9#ZxwDl3q$Vy*i}`m~c7psI?YC2ZIS+QD-#G~C+dZqnhtkYqO>Lw|)$QtkE7o|J zW#Ax5U3;KlQk4}M;;saV?pCO3iWLntmo!=G(m;yvd#jIUH;Vq-Es9%w1ETn&yW%8R zK|{WOKr-J+{!m;C{utnbzXDtI$Z`-jWTHdzfsg8Hhc;xs$b>XXs*z2&Kokqh6;L@5 zwyL9C8O=JbD$Qu>a>Fbog&0{!*2ohz+Mr>*X(MccyV=7lz^W%L8h)@a@iX+)9xDrq z7?7?~lUG5=UCDSKv%B~BGw)Cai(8Pux_T8UEFRpzBPff-gOkp@-|*%wR+%5t&Brz+7QY1_I`UPvoL}Yb&1)^8xP9z`YZWw8#HCJKHpzt$b|I(gW6i7n( zp?4;wJ3N}h!N1ap%Wn`2mNo2j!GGdtKYgPQn*A7HAWnXxzG<$Z@Ho zSA|PHcOb33`{3D!w>{HH%Kly)?mbd?7nf}`9+U6YDiD~q#?jU~m@wtk*_E^6q1{x> zt|#YvXxjt5L_oDV4+>i`L#`&M#K(Z;E7r8!=egm}J~#aN=QE#wE|YJ2KJ!_;!@p-U zr4FpnxuKqh_U413VKOI#y?|SEriy27X!bm9KaGYCiq(Jq`=kM?O9Cu|2M>k4A6!`?^_KEhhen zgR*d}l4ZLNjE7H>xge>7hcV9}7;?XeBC}Uo|++(IdP^&eN z6;A3#np}&;^ILM`lM6CB1~_{KdnT-@@fub?X3UaX!#whf3UfRi_;VwtWLH%vk$h)f zYFtpL!{AW=wA`6lcJ(8wT54kEC!;c7r{$J@llmL*m)Rv9DcGN6n4F+zeX~q_2L+G+ z_v66T{mD2n5W>yIAz@g@IUwl?`fGYL7x*VbJ)x>+-_bk(wJT?-#kGC$n3G+al~p=iW-yCnh}#_vepg9GM#=Eb zmt;PZ|EdMLuplWH-74fBhT!>t=x*6SqgH;@wf%%-5t4(pzy;+`ltB$djBT*hty0?f zl;P#b6Dpmf3-2lEXscCIsuvUTeq61H#g(r8kXPl)$Fxqe<-SKU$02_>ZQ9iJW4tKK zI%dq>ZPSdtj_$~`9?Ke$O3%+lA!haiPDbqP_E`T@;cEAUDPn2Pu->aI{bd=hyjM<>Jvm8XbG;sj!ddBEQ zEiL`DK+di6q&T4YE1KsxGO?0&L=4uft(9^b#jYEfZ(_9WB#n^60zayKHDSK;B5mfu z6e-CndD{G!<)Jd0&{agRI(TAba+Mf0H85ym>g3IL9bCO~`lz5&V{aRafBf~~6H^n? zbg7BHri6s#_g}sBk)_|<8>C#FFkxN^ZAGg5K%V;tth`KE6HpA_GZUNGJLp8Zw<}|} zx2HFinegtJ+7nh^s?+kdWIJ6ky;{txce7?~`3i_DuzTuOT1s25{Ot``6uW}g)=Y>M zjt&OWBLn;^tfG4sn186+gqlM>AZ3O)zBe3gCE5d&^13Sg?%>2IsRUNMe$e#454=8; zR1e5s^yFpt0r-1XKH6w}RP{`)9PT~os9V=vTz#gS)@|#--0u3P*!1ACPTSkQ!>Z5L zx_7Hy8?edob+@YC&uN?cHMt|pSId{=D(DyS6>ETHw_It zQQ@6{odDiVGTEebJ+j#|p>*eaf#RE?cve^k01KJ7o59k;`R>W_H&wms4N=5tx~Jl& z>ILG>KAyKP_1(R$Yj-B}(2MoGNFbjfbKuAqI8j|upDZ}V_PsOVOTdgi*>GJRnIZWg zS&wl9(2&QXT1UzTN68HZ=M0gUAgdnb2Hk(xte#(-?x;7kwCMT;xW*<&RaPu3Efv1& zPd^&xVAoH%pnFF7RcG&O@2d=NxWA!(%}i*3nzOggOMQ5QLHThR*!&2ST~FyvYa zwL)%yA+bOQffi(MHY^7*n3q=XB>htNnkOvPx~jCS9t87aI|~cmT7KHN&M9eqXr4Pk%{gG z+ANL7lRk4ge*BRSSMtY?N6zBq5e*|AX!*&j0bA%?^{R4huJwUdqep#9ett`FF`B>Q z(cqz+J?+_my++_fYxzSsF{7WXbb>3^_6sSP?W&@F2yTKDw`*UpM*2(8BU0gSr0=~+ zj6xo#dsy-U!1Relcz+2i9+T2};7z+;-S_ILK-!EQuTkWyp-hOaM+sYlIpOZMU2?8&SIa4Z1M&7{@RsU4NjP1Z z^lp{d#G}5|*!_u9Ju9;LyWkUGTJ*wN+x=%Sbx_2zl zC>u;Wc&+X{?)zi%}VEDNhkLB|AbEDSrczkcpjkIZ!gUFlbQ{O z1Kv{jfdS-WdsgCwm?X$<1$k37Sl#OKUew@FEqk7Bu^R34t!CG1SR#3%22^C{?4PrI z?xx%GXSF4d$lO17RYT4_C}^Lp*Bn<(_{7M#sasoHsjfXTuAHjc%Y6eM(#BJ30S`d? zK*3*E17f3z*z*@ff$P<=|7UHWw(5iGsdeL^S^CiKmE%^<^(Y`u)Cjv#NB)9F3+7GK z#vOo#y;@t5$B4gn;gN4l_dBjr9}s!$$MuiO_v>BA&*Ql{W)9 z9&N@0h|?ZRjSU_()HY_M!$^1gwsmnSzIjo$9;+Qzo113DmjuQI@T$u7vgkN6XhWs) zFwJuu=Xp#P0yv@`QClByqehUn7UZl}T;?BuAJj(UcdpjvvWh6R$>wj1eN+d?P{C39KyqN5 z(S3MKaH>~8QgmS?W()9PsyM`-*VU7xkXrAR5FXzvjyPnEA@E!Z>Z|tQ+!O2idkAG; z9)laoBi~>4K+H4>3e`Dj59U1h9$7b{R*CC{!Ia>Vh*CN?2-B~uMA)>qJZcl>-Ru)4 zoPvkhmALbHxn;FVA>TY*xiq4P^QzD|7ZYp)FpJqQsOAX5*z)<_V&3sfPL8~PNZj4+ zzKA)LosIh@eucd#J|r2rsx<@P$x`3IgdmsHbTQi{-4u}MJrST~+w*Aqj%=&$rQ<>4 z(LP$+F;2s~x5aY`FXH?Oz@@4-6diSIYwMh$HWf5J&z0k2m3spNdT^t^*z40yWhBx3?UPf6e;SD%9df#|wrPm6_N=vDgCXVMNGx#y_ zE_?;*iMlGLoWFSPxmlYxelf{)?Pee_Uu_rO`A5& zdX6tUQH+9$0mUb%KgnYv+r}rM9<7_rOe~mHP%w)d=x+hd-P!Qfx5($ZWi()24Vptg70b>2YLU!6C= zuXR6spiv$*;E0%i+binf16R5oK5&1x_uviH_xZ@WB(1v7TGuBF`c&Ri?NX51CQ(){ zz1~%^Ta#y-TI7DBy=@8^}@Ht0T7^i)V?0`M$77-?YZjGw)ko zm|Ecx8dU3-<~T5;{HM9GBS+3Jv=iClmavu2-rkV9YWM7LpSn?59`^QQbCd@%n{x}Z zyvJZnitq8{D`bTksUP>}I$Isz&f_|RdE64d5an;AH=VBu{v64cRbUR?p>qQdnJqo^ ziA(HQq^w>f8useuU%yXBo2_UUgmw?39awMcAK#B-#`Xtz@o?uV9;F-*MM@2~$C(B@ z_LlJ{_}|LrDod0O^o!;t!j5kt-JvJ2qh*QYmMRI;%Tg1nNP1bS9H!* zzFqbRPn@od)j3{o=HHP0j$*~S!Tc?(MTW>)GpgRCt%DGHt{rZUc$&d&iIu1_54NTF z8#9%M=qQ*{H8vy4Xg2$rS5!?YNG*$wE>m6&2p<}lmOqIX2M!GnFi*cTUQoRQxg_`Up*;GU{$O#gwAV;N&#_2yfe2 zMVUbb8_!zM^ZC#g*Ld{_eX5hqQJ>Ps zqxDoMYkgLK6g|IIfIflNKGvu3b?74kwI}gqAM4}zoy)Xmx2E6}wkW=r^eYkSJB9D{ z=dUVbK?mv+!ORKRr*Osk4|(sKJ%2{e;HZj7Nq zd(PZ&+J^dGFh@M9q`ud&5vbo)-`lW2epY*L%e)1hmqKv#IOA@j_TIp%aPFXb-;M?7 z{IvJ|@V-QQKY$x?-ksXUk;U1jqyD^^wczZnRve8w6Q_H%Gb7|M9o9mJq(-wC{0`IJ z#bSrfi1W$lVATdzhql%DJQ1I&apG4qP77;evjK}B%<9o9Qhw^$Dih<)LC*&CkHm=0 z_!K5bn2&qyz{QBjvraqQwFB>JaVHn;=*U+i&PS_85BlDS+45#b!D8abX~qek4KwT8 zjiJ-SjIq%%F~jgDHo`b&USmUDd$n<5V|7z=N89XMjG?pCTaojuw=!qWscvYDoZdVq zEW$Xyp}pQ%T-R3D+EG_)%x!LJH;%&*scpuPv3QT$t<~)q@Md_h8!eb5soUAK#dR|= zUMuUx*1k+l0hu=gPWM$oA+4-Y)kRc_@y5_8L_XTw3`n2DZf|rO)`j8!I77FzuC=Y9 zxycwC86Ayf$p7;YH|uDGHjs=-*V>_{)zE`FsX49CHY4<52LArFRwDm@gDPV~o3Yy1 z-dbH-H>bLFwy}9eUyVSAzlLgM`3*(-f9+KQjaMnXq2m)Ib?sO?&_Tv^pi^x@_BS1$ zo1}G+UChIK;!7*ulkHI32{=u#0I%a=;ncRf^%V4gKz7|*yfLs!x{T}wW_klTQ1HyEW#@t&`b(Tex@B*rC<*v3N%cY{-*`^+Aty=(@Z|08Fy#m z`|;?Hg-1y}geDDdLi3FF`PHp;B*n&t>2*zQFv)pMwRNq=_WC;GgwX}Y@hx>tYU2X6 zL4?t&q%n~(kwytj>noL^1EyYG(^#h(dbKe(tH@a0o?@(TZ*NJ7ifWtQ+R)P87TE@e z(A+vRYJ4s*`hOzhe*qLUfiPxy9VUH~ACAZpvx$%=G3t;#`2X*zl~3WE$9r({>oJ8@&cY|xrnnIUu2)LPjQxI z4fJLWwEo}FxSebl+rxIV&)F9^M{)-HMxHwPGW6#R&XC;4_Ofpwt`j)t@;=N>4e%Uu zpkqyJBeZNTG_e(0HxK&P0b4tc6EGKI9=jE%ST4dTnNP6Wac=7!>`t6dd5XQwZRClS z-*E%CN#|Z3Wt(tH?SI*iIJxpah(o@| z$(4_@EjWks4fZD6jFHy_2Rod04E z;sng6aVq9IoQU}r`+$9DGj3u*fygPgsjsPS)sJp(XsoT%H^>*!Fw1_-^oG{y^XANG ztXp6|>&AP#+0*N48yXv{9cIsLt*dLobXVIj-KMd&xm`c5diuQfI(?J+QY>E_iZKJu zsji+5Lu+?v?e;-mJiWTLxk=wDUu;IsYi%a|q!VOmH;t1D@1FCD-0InNI^;F^na%^J zZya%9mkK`upLI9`ltZKGliIUC)?X2fH&(YdVO2xlFu}hBJnLzeVL1vL7{HF< zJ9}nt`JK61?qY71H`ySx7-G4^f-PU8g6K3W!SfW$EW6nj%Ncgoau$^X11uMrJ9B z{db}rXO8&ffKm5i)RS`5DTsNiutHg8`2tpH2OBWrl-Yska~j(1hJFF)=Y@XAL}3h1 zjO&HV7gsRGj{+`0?Y zT>!-Yg1U=&DDXQ2etic>=fJDOp!;j^>Ra&X2%ugB)C<7xH1InD z{N97lu><|b;Juu|8Am{LMGH6F2}bKIK*`34=OHIN@r7@0LEr262CD&#)F0HHK(9YQ z-FZ-U4pf~4Mdv`xALxAwz5igXfJW`l%D?9z6&H-|iqYLH+d<7qjI|$6SnF}tuoJ7p z=UXIpdok_~jCKsR;)v1QB+QF|d8P~3^SEop^*p{gDRJ!wyeP zJgCBV$G~k{v^a_uXVBszS{%XMQ^+hhfM)}tH!h&b9p8AMKS?eSuW@KWa8tmCRA8NE z`58Sw2d$rB^m9@NNW;s3RkAGQ1&BmJ9Qgw$O@*=f*l4m`LF zDP93|f_xs3uRyy9uipXvtfYRSpZx!B8wOoVcxu8cJ_>_cC6L6K_ zJ@qKZwHa&TEoi+Ra@&brFFjgb1jbj<>LOrXmaVqny$7VT6Igu>tiAvS2#tWd2a8WI23SKMlT_tcM+Uzm@RXP4xv@XJ>(sl`WT-7kYCOJU-bq4mAfc*)K za|zgAM(-;(=}o*Ox`{hidJi+s;<=+hBk zdI(q^fqXB5_5k=4S3vj~bUVSrodc&GEYCuto&m)7p-so3Nyh;BBzUk@)1>W?_fGKP zJ;?eUjC2k%Azu7f%47=cqypTn!Yhq(i{%ZBa1EODEHvp^Xwq{S#SxHQp)GFE`C#a2 z6gZHK&o{K`C`R}VzUsVYn@2&{HAXxghs(-W;%Oz?Oa*6Zz=>smL8D#7$OAFTDU9+V zM)?w>{D4vZ3mN_n$d>{63gq}Zpk4(2SEY1FD@g0k;vVhElOIn9+-uNEw9(1{fuyPWx{Fdbt1!Y; z+zZCMbQUuB6!?DvD4)Ui9K_u88Fo5<1;o#Q&pF72@P89fPxRu<9?t@9v)iSA zI|3|D1BpjY&$a`7ccOaztmQwT=QN_<0r+GOyj;LdSNJ*7mO{QGkeNqJY7V z82uv=dtu~382LXK*##pX#mL?m`7lPl0E<(t zmNc7e{=C$T63Ch6RW({T2ATZ|c^%U%)(sFzHbjPj~BF&XokBC zXfA+s9uQp6PmLRX#XNSRE4~Vr+DLJi@OoL1@)>+VS2DqOB z-XsqvK&M!%9NcjLh93A7jCnZ@-zFmhNx|6a4EbMJDd`m9_Zy&`0)D?CT6C4OuqQmq z8Pt(p13&S9T|g6Q?n(y46i|^0Ij6z5s!c z8D|nWf(n}V&q*qlf%7k6e~7f<73`C20gUbFgV`P0{ws9K7ps!-=)DscMP`RV<7r_3 zKCr(A>@Ndr@`#rJ^C)0m1B@f+dlJ}D9HvUHFK2Fn4<+uL!OVC0|3bbLb^b?_?={Hx ziY8x*1l0NHDDXRm>mu~i54v{&qx_0dC~iH0xs|-j1&l~@|5?a_^zj2wb4ioM50J${ zP_-ShIEm4I#At^g3yQrdLZsM(;;P>NxJQ$_b(|~c`5$0@1-;2iNGm}tdY*&jqgDXA?FNlh*La7(^CKF~$Iz2vf~)97 zGaC6SirB7z=7XU5G-y5rts@*o0U^t+t)=6BuqUrS^KsXBs zXJyn&@zi_sDA{L*G*%wN#9k20mwCHd9wXXC&5J0EOb0i;$L`#FnC@@z`iD0ThZvDVC>>hHk+Jmx9u zdQA0t>dJ-mRQ26|Xq=#x)j2>U3{Gh}MC&)2y(n%c+rA=wH?1MazHK2H7wp3JgD3L= z#!m215r`WHBIgna>@T7c&IX^{@x2qi*W*qAVhvjF(du;|Ufu9Yt5?+!i8yvU*%4xQswa__G ze+tx}1@#oIoC5Xd0aNZ^K!4P|hx1Y^e+5kPi@#uoF<^!n2z_-%TMuZACwi)TC#Rsx z-mp7x98iw3i5x$}SS12C) z{x$fYiCXYG0=uBC_@9Vw!EY{hJMToLz#9DKVVCp? - - - -Created by FontForge 20120731 at Mon Sep 12 19:08:52 2016 - By ,,, -Copyright (c) 2011-2012, Julieta Ulanovsky (julieta.ulanovsky@gmail.com), with Reserved Font Names 'Montserrat' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Regular.ttf b/src/Identity.API/wwwroot/fonts/Montserrat-Regular.ttf deleted file mode 100644 index 5b4b5afe6ee4b560b65b2f2040ad38f6c094b347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29016 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 diff --git a/src/Identity.API/wwwroot/fonts/Montserrat-Regular.woff b/src/Identity.API/wwwroot/fonts/Montserrat-Regular.woff deleted file mode 100644 index 930c783d1f154ae57aa4e582db218ffd81a903f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17284 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 aqKv)>!F(%&5iAcxnESBV|Jp&zb^rjY^6IGo diff --git a/src/Identity.API/wwwroot/fonts/Oswald-Bold.eot b/src/Identity.API/wwwroot/fonts/Oswald-Bold.eot deleted file mode 100644 index 1d59b4860cf7dff91938da92d9f2db560afcb30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102320 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 SquSpFy|BJT(G!jL`# diff --git a/src/Identity.API/wwwroot/fonts/Oswald-Bold.svg b/src/Identity.API/wwwroot/fonts/Oswald-Bold.svg deleted file mode 100644 index ca947a8..0000000 --- a/src/Identity.API/wwwroot/fonts/Oswald-Bold.svg +++ /dev/null @@ -1,3184 +0,0 @@ - - - - -Created by FontForge 20170731 at Tue Apr 30 17:14:28 2019 - By Aleksey,,, -Copyright 2016 The Oswald Project Authors (https://github.com/googlefonts/OswaldFont) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Identity.API/wwwroot/fonts/Oswald-Bold.ttf b/src/Identity.API/wwwroot/fonts/Oswald-Bold.ttf deleted file mode 100644 index b36d676e19a9d1522b81baacb822f96e8e05b0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91680 zcmc${37lM2l|TOOdsX#n>*}t3@9OHRuIhcO-nUdb>Fk}***cxQ6GI3gVF?KV0pk*6 zMo~vaAp$CmY>pBLxQ!wSny?G9xQ)xq=&-14gNP2P{(sNCuU=R6g8V-J&+qdS37y;L z-FNP}=bm%!*`CBCNpj&2gH*A2;n1Ref7#b9vBq~KiG5`8IjhzjSy^|Z#G0>^q^2tu zuUR+v;pKZvCAJN}H~xLqnx@v{U6<{bq<1gEEZf(toxk?->-R2|*sizm_u8HN#xJ_b z@>l%)?$eTF{>aWlmsXTq9~+aHrwhOT$hjBo-girf=V^%<*GiJZyLYxO2Syop7`N!cyQ zjLD;tEVFF}{KQsCl4>#<0H!#NCV$-lXWUs8cg9z>fFzj+IL^rC?CR%Ud-sk zjH+an>a#UgW{}tl?1sz?@_CrQVc4i(_C~f+k}PI`sZOWUWC_+CaA(|!bV7A!6z`2s zeDQ1H%Odsb>uBPyf1UYQ-{hp2+mJC~MWCT7Kg>MROOp9snH_)Wczc}=q3RHi%mHz; z4)JmxLe}S)Y?hq{Z4N0dKf~PoZTY#BX>XgF>y?>v5j6}i>u>wx91zdw5PzBjqEd%A zlZTjwM~e<|dRB;~h8;S@pYssYRvi!!SoMnp0UGnw&qCv=xn7+)7gilJ{Hy-9*Jg!q z8h))qygmm+yAJW>91t!Y;-Q%kw3AA$fRMDc=v*?zN2l^nPNQg_KKB!IK$PhaPt6XY z{6vR%d?rNhT{&5R-}CIWB=!s1Q?qJ24A{r=vx-$q^5p+u)_aw5sZ?@FgV}j5oP3;J2n4eXnP8So2D53m#F(^= zA7sg3FmAJ`veDRR#A$Yx;lWazX8NDi60O_G;@*Te!~c!9)5&fxVdHGe-G>j~o%_K@ zhxTk!%CC6%sy|+S*Ig`lc5+g@pP%orcD}z?c)lTi`ha0Aq>D!?mujT$Y=@001}p~wsmx5T75pR zH^J9ZX)<}89-oh|s69jLWy#HZ>+AP!-ngsw9%CRH39FWHC=xK;Q?tvy;PTZhx%TqG z-t&hRjRfkWt$zllbD$zR#4zWpoDVabGVe(}cKFE<_NxH8b3WaG(t zkG99k&y-q2N~*%aP^A~-LB1Z~qWsKIsgM7h#(|@XKS)QGVx67YHn6G6Bm3yC0{ci!4ZCEF zZJV)#{~Xi!G-#k*!x|tR&akSYvnNX>z&iSW8S88&^W@$`P0a_-izjQ6R$Em%+0w!e zt!6uBVEu>HI@WZ$1lA{uu@(@@cc%7+9haBsd-ENoC%-rBJ{req#GbLcIsY_e>#;Wnbb