diff --git a/Identity.sln b/Identity.sln
index ea4da8e8c..80ba807e1 100644
--- a/Identity.sln
+++ b/Identity.sln
@@ -33,48 +33,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNet.Identity.A
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Specification.Tests", "src\Specification.Tests\Microsoft.AspNetCore.Identity.Specification.Tests.csproj", "{5608E828-DD54-4E2A-B73C-FC22268BE797}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.Identity.Service", "src\Service.Diagnostics\Microsoft.AspNetCore.Diagnostics.Identity.Service.csproj", "{CD787C9A-58B7-4CBC-B8E3-66698EE58C11}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service", "src\Service\Microsoft.AspNetCore.Identity.Service.csproj", "{B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Abstractions", "src\Service.Abstractions\Microsoft.AspNetCore.Identity.Service.Abstractions.csproj", "{F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Core", "src\Service.Core\Microsoft.AspNetCore.Identity.Service.Core.csproj", "{590697C1-EA60-4412-8A21-4EF35142381F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore", "src\Service.EF\Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore.csproj", "{CD360545-3395-4C44-AD27-C32EECDD9572}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.IntegratedWebClient", "src\Service.IntegratedWebClient\Microsoft.AspNetCore.Identity.Service.IntegratedWebClient.csproj", "{CA19785B-CE2F-480D-BB57-93A43A2DFDAB}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Mvc", "src\Service.Mvc\Microsoft.AspNetCore.Identity.Service.Mvc.csproj", "{B3AE446B-859B-4C2C-98FD-A084C854941E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Abstractions.Test", "test\Service.Abstractions.Test\Microsoft.AspNetCore.Identity.Service.Abstractions.Test.csproj", "{27D28F0E-08F6-4EEA-8705-E0B559C87F3B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Core.Test", "test\Service.Core.Test\Microsoft.AspNetCore.Identity.Service.Core.Test.csproj", "{444F07E7-CF65-4717-BEF3-BA29F60DDE6E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Test", "test\Service.Test\Microsoft.AspNetCore.Identity.Service.Test.csproj", "{204163F9-E9BB-4940-9659-77F617C00D97}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.Specification.Tests", "src\Service.Specification.Tests\Microsoft.AspNetCore.Identity.Service.Specification.Tests.csproj", "{C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore.InMemory.Test", "test\Service.EF.InMemory.Test\Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore.InMemory.Test.csproj", "{7423EB30-FFE9-4707-A44B-571E89A7CA15}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore.Test", "test\Service.EF.Test\Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore.Test.csproj", "{4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.InMemory.Test", "test\Service.InMemory.Test\Microsoft.AspNetCore.Identity.Service.InMemory.Test.csproj", "{94EC586A-2AE6-4AF2-894A-B0973C65BD68}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Identity.Core", "src\Core\Microsoft.Extensions.Identity.Core.csproj", "{D5905D78-A32E-44B8-8F21-EDAEDC95D9B8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Identity.Stores", "src\Stores\Microsoft.Extensions.Identity.Stores.csproj", "{FADA11FC-DC06-4832-A569-7B2374A6CD42}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.Service.AzureKeyVault", "src\Service.AzureKeyVault\Microsoft.AspNetCore.Identity.Service.AzureKeyVault.csproj", "{174180AE-00AD-4C2D-9F96-2EE2C5E60457}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IdentityOIDCWebApplicationSample", "samples\IdentityOIDCWebApplicationSample\IdentityOIDCWebApplicationSample.csproj", "{D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebSites", "WebSites", "{1F83D453-E094-4D28-BCFA-9E537ABB5AD6}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Identity.OpenIdConnect.WebSite", "test\WebSites\Identity.OpenIdConnect.WebSite\Identity.OpenIdConnect.WebSite.csproj", "{D6FF6433-336F-42E0-8F3A-60F3787A0261}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspnetCore.Identity.Service.FunctionalTests", "test\Service.FunctionalTests\Microsoft.AspnetCore.Identity.Service.FunctionalTests.csproj", "{6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{42F5B772-1D61-4C18-9457-412DE8E170A5}"
ProjectSection(SolutionItems) = preProject
Directory.Build.props = Directory.Build.props
@@ -326,342 +290,6 @@ Global
{5608E828-DD54-4E2A-B73C-FC22268BE797}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
{5608E828-DD54-4E2A-B73C-FC22268BE797}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
{5608E828-DD54-4E2A-B73C-FC22268BE797}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|x64.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Debug|x86.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|Any CPU.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|x64.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|x64.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|x86.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.Release|x86.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|x64.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Debug|x86.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|Any CPU.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|x64.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|x64.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|x86.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.Release|x86.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|x64.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Debug|x86.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|Any CPU.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|x64.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|x64.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|x86.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.Release|x86.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|x64.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Debug|x86.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|Any CPU.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|x64.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|x64.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|x86.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.Release|x86.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {590697C1-EA60-4412-8A21-4EF35142381F}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|x64.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Debug|x86.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|Any CPU.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|x64.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|x64.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|x86.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.Release|x86.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {CD360545-3395-4C44-AD27-C32EECDD9572}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|x64.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Debug|x86.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|Any CPU.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|x64.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|x64.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|x86.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.Release|x86.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|x64.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Debug|x86.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|Any CPU.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|x64.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|x64.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|x86.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.Release|x86.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {B3AE446B-859B-4C2C-98FD-A084C854941E}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|x64.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Debug|x86.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|Any CPU.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|x64.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|x64.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|x86.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.Release|x86.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|x64.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Debug|x86.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|Any CPU.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|x64.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|x64.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|x86.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.Release|x86.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|x64.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|x64.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|x86.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Debug|x86.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|Any CPU.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|x64.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|x64.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|x86.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.Release|x86.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {204163F9-E9BB-4940-9659-77F617C00D97}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|x64.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Debug|x86.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|Any CPU.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|x64.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|x64.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|x86.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.Release|x86.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|x64.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Debug|x86.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|Any CPU.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|x64.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|x64.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|x86.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.Release|x86.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {7423EB30-FFE9-4707-A44B-571E89A7CA15}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|x64.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Debug|x86.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|x64.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|x64.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|x86.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.Release|x86.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|x64.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|x64.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|x86.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Debug|x86.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|Any CPU.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|x64.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|x64.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|x86.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.Release|x86.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
{D5905D78-A32E-44B8-8F21-EDAEDC95D9B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5905D78-A32E-44B8-8F21-EDAEDC95D9B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5905D78-A32E-44B8-8F21-EDAEDC95D9B8}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -710,102 +338,6 @@ Global
{FADA11FC-DC06-4832-A569-7B2374A6CD42}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
{FADA11FC-DC06-4832-A569-7B2374A6CD42}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
{FADA11FC-DC06-4832-A569-7B2374A6CD42}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|x64.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|x64.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|x86.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Debug|x86.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|Any CPU.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|x64.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|x64.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|x86.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.Release|x86.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|x64.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Debug|x86.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|Any CPU.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|x64.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|x64.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|x86.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.Release|x86.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|x64.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Debug|x86.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|Any CPU.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|x64.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|x64.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|x86.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.Release|x86.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {D6FF6433-336F-42E0-8F3A-60F3787A0261}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|x64.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Debug|x86.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|Any CPU.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|Any CPU.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|x64.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|x64.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|x86.ActiveCfg = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.DebugNoWPF|x86.Build.0 = Debug|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|Any CPU.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|x64.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|x64.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|x86.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.Release|x86.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|Any CPU.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|Any CPU.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|x64.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|x64.Build.0 = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|x86.ActiveCfg = Release|Any CPU
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C}.ReleaseNoWPF|x86.Build.0 = Release|Any CPU
{39AA4E4D-5E62-4213-8641-BF8012D45DE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{39AA4E4D-5E62-4213-8641-BF8012D45DE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{39AA4E4D-5E62-4213-8641-BF8012D45DE4}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -938,27 +470,9 @@ Global
{4490894C-3572-4E63-86F1-EE5105CE8A06} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
{6A74C6EA-B241-4D6B-BCE4-BF89EC1D2475} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
{5608E828-DD54-4E2A-B73C-FC22268BE797} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {CD787C9A-58B7-4CBC-B8E3-66698EE58C11} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {B44C2A7F-EA9E-4A9F-9698-1C9F9BB40E0C} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {F34C3ED8-D4A9-47CE-BE0F-1F234A33AC81} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {590697C1-EA60-4412-8A21-4EF35142381F} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {CD360545-3395-4C44-AD27-C32EECDD9572} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {CA19785B-CE2F-480D-BB57-93A43A2DFDAB} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {B3AE446B-859B-4C2C-98FD-A084C854941E} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {27D28F0E-08F6-4EEA-8705-E0B559C87F3B} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {444F07E7-CF65-4717-BEF3-BA29F60DDE6E} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {204163F9-E9BB-4940-9659-77F617C00D97} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {C05D641C-A3EE-4A56-9A39-F20F3B9C4D36} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {7423EB30-FFE9-4707-A44B-571E89A7CA15} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {4F5D777E-3CFA-4EDF-BA89-4FE04BBF7A66} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {94EC586A-2AE6-4AF2-894A-B0973C65BD68} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
{D5905D78-A32E-44B8-8F21-EDAEDC95D9B8} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
{FADA11FC-DC06-4832-A569-7B2374A6CD42} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {174180AE-00AD-4C2D-9F96-2EE2C5E60457} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
- {D7CE9BDF-84E5-405D-8A4E-12E41DAC6935} = {58D94A0E-C2B7-43A7-8826-99ECBB1E0A50}
{1F83D453-E094-4D28-BCFA-9E537ABB5AD6} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
- {D6FF6433-336F-42E0-8F3A-60F3787A0261} = {1F83D453-E094-4D28-BCFA-9E537ABB5AD6}
- {6E3E1BE7-CEAF-4565-AA0A-F5BE3FA7F39C} = {52D59F18-62D2-4D17-8CF2-BE192445AF8E}
{39AA4E4D-5E62-4213-8641-BF8012D45DE4} = {58D94A0E-C2B7-43A7-8826-99ECBB1E0A50}
{ACC75F4F-EA7D-49E0-A64C-9D4A3DFD5B8A} = {58D94A0E-C2B7-43A7-8826-99ECBB1E0A50}
{894E102D-56D4-4B02-8F13-8781F4324C3E} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
diff --git a/build/dependencies.props b/build/dependencies.props
index cb00803ae..f66bb3ca1 100644
--- a/build/dependencies.props
+++ b/build/dependencies.props
@@ -33,7 +33,6 @@
2.2.0-preview3-35425
2.2.0-preview3-35425
2.2.1
- 2.3.2
2.2.0-preview3-35425
2.2.0-preview3-35425
2.2.0-preview3-35425
@@ -57,8 +56,6 @@
2.2.0-preview3-35425
2.2.0-preview3-35425
2.2.0-preview3-35425
- 3.14.2
- 5.2.0
2.0.9
2.1.3
2.2.0-preview3-27001-02
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/AccountController.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/AccountController.cs
deleted file mode 100644
index c2968d673..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/AccountController.cs
+++ /dev/null
@@ -1,444 +0,0 @@
-using System;
-using System.Linq;
-using System.Security.Claims;
-using System.Threading.Tasks;
-using IdentityOIDCWebApplicationSample.Identity.Models;
-using IdentityOIDCWebApplicationSample.Identity.Models.AccountViewModels;
-using IdentityOIDCWebApplicationSample.Identity.Services;
-using Microsoft.AspNetCore.Authentication;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.AspNetCore.Mvc.Rendering;
-using Microsoft.Extensions.Logging;
-using Microsoft.Net.Http.Headers;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Controllers
-{
- [Area("Identity")]
- [Route("tfp/Identity/[controller]/[action]")]
- [Authorize(IdentityServiceOptions.LoginPolicyName)]
- [AllowAnonymous]
- public class AccountController : Controller
- {
- private readonly UserManager _userManager;
- private readonly SignInManager _signInManager;
- private readonly IEmailSender _emailSender;
- private readonly ISmsSender _smsSender;
- private readonly ILogger _logger;
-
- public AccountController(
- UserManager userManager,
- SignInManager signInManager,
- IEmailSender emailSender,
- ISmsSender smsSender,
- ILoggerFactory loggerFactory)
- {
- _userManager = userManager;
- _signInManager = signInManager;
- _emailSender = emailSender;
- _smsSender = smsSender;
- _logger = loggerFactory.CreateLogger();
- }
-
- [HttpGet]
- [MsalFilter]
- public async Task Login(string returnUrl = null)
- {
- // Clear the existing external cookie to ensure a clean login process
- await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
-
- ViewData["ReturnUrl"] = returnUrl;
- return View();
- }
-
- [AttributeUsage(System.AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
- sealed class MsalFilterAttribute : Attribute, IResultFilter
- {
- public void OnResultExecuted(ResultExecutedContext context)
- {
- }
-
- public void OnResultExecuting(ResultExecutingContext context)
- {
- if(context.HttpContext.Request.Headers.TryGetValue(HeaderNames.UserAgent, out var header) &&
- header.Count() == 1 &&
- header[0].Contains("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0") &&
- context.Result is ViewResult view &&
- view.ViewName == null)
- {
- view.ViewName = "Login.MSAL";
- }
- }
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task Login(LoginViewModel model, string returnUrl = null)
- {
- ViewData["ReturnUrl"] = returnUrl;
- if (ModelState.IsValid)
- {
- // This doesn't count login failures towards account lockout
- // To enable password failures to trigger account lockout, set lockoutOnFailure: true
- var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
- if (result.Succeeded)
- {
- _logger.LogInformation(1, "User logged in.");
- return RedirectToLocal(returnUrl);
- }
- if (result.RequiresTwoFactor)
- {
- return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
- }
- if (result.IsLockedOut)
- {
- _logger.LogWarning(2, "User account locked out.");
- return View("Lockout");
- }
- else
- {
- ModelState.AddModelError(string.Empty, "Invalid login attempt.");
- return View(model);
- }
- }
-
- // If we got this far, something failed, redisplay form
- return View(model);
- }
-
- [HttpGet]
- public IActionResult Register(string returnUrl = null)
- {
- ViewData["ReturnUrl"] = returnUrl;
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task Register(RegisterViewModel model, string returnUrl = null)
- {
- ViewData["ReturnUrl"] = returnUrl;
- if (ModelState.IsValid)
- {
- var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
- var result = await _userManager.CreateAsync(user, model.Password);
- if (result.Succeeded)
- {
- // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=532713
- // Send an email with this link
- //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
- //var callbackUrl = Url.Action(nameof(ConfirmEmail), "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
- //await _emailSender.SendEmailAsync(model.Email, "Confirm your account",
- // $"Please confirm your account by clicking this link: link");
- await _signInManager.SignInAsync(user, isPersistent: false);
- _logger.LogInformation(3, "User created a new account with password.");
- return RedirectToLocal(returnUrl);
- }
- AddErrors(result);
- }
-
- // If we got this far, something failed, redisplay form
- return View(model);
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task Logout()
- {
- await _signInManager.SignOutAsync();
- _logger.LogInformation(4, "User logged out.");
- return Redirect("/");
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public IActionResult ExternalLogin(string provider, string returnUrl = null)
- {
- // Request a redirect to the external login provider.
- var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { ReturnUrl = returnUrl });
- var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
- return Challenge(properties, provider);
- }
-
- [HttpGet]
- public async Task ExternalLoginCallback(string returnUrl = null, string remoteError = null)
- {
- if (remoteError != null)
- {
- ModelState.AddModelError(string.Empty, $"Error from external provider: {remoteError}");
- return View(nameof(Login));
- }
- var info = await _signInManager.GetExternalLoginInfoAsync();
- if (info == null)
- {
- return RedirectToAction(nameof(Login));
- }
-
- // Sign in the user with this external login provider if the user already has a login.
- var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
- if (result.Succeeded)
- {
- _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider);
- return RedirectToLocal(returnUrl);
- }
- if (result.RequiresTwoFactor)
- {
- return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl });
- }
- if (result.IsLockedOut)
- {
- return View("Lockout");
- }
- else
- {
- // If the user does not have an account, then ask the user to create an account.
- ViewData["ReturnUrl"] = returnUrl;
- ViewData["ProviderDisplayName"] = info.ProviderDisplayName;
- var email = info.Principal.FindFirstValue(ClaimTypes.Email);
- return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email });
- }
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null)
- {
- if (ModelState.IsValid)
- {
- // Get the information about the user from the external login provider
- var info = await _signInManager.GetExternalLoginInfoAsync();
- if (info == null)
- {
- return View("ExternalLoginFailure");
- }
- var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
- var result = await _userManager.CreateAsync(user);
- if (result.Succeeded)
- {
- result = await _userManager.AddLoginAsync(user, info);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider);
- return RedirectToLocal(returnUrl);
- }
- }
- AddErrors(result);
- }
-
- ViewData["ReturnUrl"] = returnUrl;
- return View(model);
- }
-
- [HttpGet]
- public async Task ConfirmEmail(string userId, string code)
- {
- if (userId == null || code == null)
- {
- return View("Error");
- }
- var user = await _userManager.FindByIdAsync(userId);
- if (user == null)
- {
- return View("Error");
- }
- var result = await _userManager.ConfirmEmailAsync(user, code);
- return View(result.Succeeded ? "ConfirmEmail" : "Error");
- }
-
- [HttpGet]
- public IActionResult ForgotPassword()
- {
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task ForgotPassword(ForgotPasswordViewModel model)
- {
- if (ModelState.IsValid)
- {
- var user = await _userManager.FindByEmailAsync(model.Email);
- if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
- {
- // Don't reveal that the user does not exist or is not confirmed
- return View("ForgotPasswordConfirmation");
- }
-
- // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=532713
- // Send an email with this link
- //var code = await _userManager.GeneratePasswordResetTokenAsync(user);
- //var callbackUrl = Url.Action(nameof(ResetPassword), "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
- //await _emailSender.SendEmailAsync(model.Email, "Reset Password",
- // $"Please reset your password by clicking here: link");
- //return View("ForgotPasswordConfirmation");
- }
-
- // If we got this far, something failed, redisplay form
- return View(model);
- }
-
- [HttpGet]
- public IActionResult ForgotPasswordConfirmation()
- {
- return View();
- }
-
- [HttpGet]
- public IActionResult ResetPassword(string code = null)
- {
- return code == null ? View("Error") : View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task ResetPassword(ResetPasswordViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- var user = await _userManager.FindByEmailAsync(model.Email);
- if (user == null)
- {
- // Don't reveal that the user does not exist
- return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account");
- }
- var result = await _userManager.ResetPasswordAsync(user, model.Code, model.Password);
- if (result.Succeeded)
- {
- return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account");
- }
- AddErrors(result);
- return View();
- }
-
- [HttpGet]
- public IActionResult ResetPasswordConfirmation()
- {
- return View();
- }
-
- [HttpGet]
- public async Task SendCode(string returnUrl = null, bool rememberMe = false)
- {
- var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user);
- var factorOptions = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList();
- return View(new SendCodeViewModel { Providers = factorOptions, ReturnUrl = returnUrl, RememberMe = rememberMe });
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task SendCode(SendCodeViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View();
- }
-
- var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();
- if (user == null)
- {
- return View("Error");
- }
-
- // Generate the token and send it
- var code = await _userManager.GenerateTwoFactorTokenAsync(user, model.SelectedProvider);
- if (string.IsNullOrWhiteSpace(code))
- {
- return View("Error");
- }
-
- var message = "Your security code is: " + code;
- if (model.SelectedProvider == "Email")
- {
- await _emailSender.SendEmailAsync(await _userManager.GetEmailAsync(user), "Security Code", message);
- }
- else if (model.SelectedProvider == "Phone")
- {
- await _smsSender.SendSmsAsync(await _userManager.GetPhoneNumberAsync(user), message);
- }
-
- return RedirectToAction(nameof(VerifyCode), new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe });
- }
-
- [HttpGet]
- public async Task VerifyCode(string provider, bool rememberMe, string returnUrl = null)
- {
- // Require that the user has already logged in via username/password or external login
- var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe });
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task VerifyCode(VerifyCodeViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
-
- // The following code protects for brute force attacks against the two factor codes.
- // If a user enters incorrect codes for a specified amount of time then the user account
- // will be locked out for a specified amount of time.
- var result = await _signInManager.TwoFactorSignInAsync(model.Provider, model.Code, model.RememberMe, model.RememberBrowser);
- if (result.Succeeded)
- {
- return RedirectToLocal(model.ReturnUrl);
- }
- if (result.IsLockedOut)
- {
- _logger.LogWarning(7, "User account locked out.");
- return View("Lockout");
- }
- else
- {
- ModelState.AddModelError(string.Empty, "Invalid code.");
- return View(model);
- }
- }
-
- [HttpGet]
- public IActionResult AccessDenied()
- {
- return View();
- }
-
- #region Helpers
-
- private void AddErrors(IdentityResult result)
- {
- foreach (var error in result.Errors)
- {
- ModelState.AddModelError(string.Empty, error.Description);
- }
- }
-
- private IActionResult RedirectToLocal(string returnUrl)
- {
- if (Url.IsLocalUrl(returnUrl))
- {
- return Redirect(returnUrl);
- }
- else
- {
- return Redirect("/");
- }
- }
-
- #endregion
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ApplicationsController.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ApplicationsController.cs
deleted file mode 100644
index 0848d07e1..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ApplicationsController.cs
+++ /dev/null
@@ -1,628 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using IdentityOIDCWebApplicationSample.Identity.Models;
-using IdentityOIDCWebApplicationSample.Identity.Models.ApplicationViewModels;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Controllers
-{
- [Authorize(IdentityServiceOptions.ManagementPolicyName)]
- [Area("Identity")]
- public class ApplicationsController : Controller
- {
- private readonly UserManager _userManager;
- private readonly ApplicationManager _applicationManager;
-
- public ApplicationsController(
- UserManager userManager,
- ApplicationManager applicationManager)
- {
- _userManager = userManager;
- _applicationManager = applicationManager;
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications")]
- public async Task Index()
- {
- var id = _userManager.GetUserId(User);
- var applications = await _applicationManager.Applications.ToListAsync();
- return View(applications);
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/Create")]
- public IActionResult Create()
- {
- return View();
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/Create")]
- public async Task Create(CreateApplicationViewModel model)
- {
- var application = new IdentityServiceApplication
- {
- Name = model.Name,
- ClientId = Guid.NewGuid().ToString()
- };
-
- await _applicationManager.CreateAsync(application);
- await _applicationManager.AddScopeAsync(application, OpenIdConnectScope.OpenId);
- await _applicationManager.AddScopeAsync(application, "offline_access");
-
- return RedirectToAction(nameof(CreateScope), new { id = application.Id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/Scopes/Create")]
- public async Task CreateScope([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var scopes = await _applicationManager.FindScopesAsync(application);
-
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/Scopes/Create")]
- [ValidateAntiForgeryToken]
- public async Task CreateScope(
- [FromRoute] string id,
- [FromForm] CreateScopeViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var scopes = await _applicationManager.FindScopesAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- var result = await _applicationManager.AddScopeAsync(application, model.NewScope);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- return RedirectToAction(nameof(CreateScope), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RedirectUris/Create")]
- public async Task CreateRedirectUri([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var redirectUris = await _applicationManager.FindRegisteredUrisAsync(application);
-
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RedirectUris/Create")]
- [ValidateAntiForgeryToken]
- public async Task CreateRedirectUri(
- [FromRoute] string id,
- [FromForm] CreateRedirectUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var redirectUris = await _applicationManager.FindRegisteredUrisAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- var result = await _applicationManager.RegisterRedirectUriAsync(application, model.NewRedirectUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- return RedirectToAction(nameof(CreateRedirectUri), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/LogoutUris/Create")]
- public async Task CreateLogoutUri([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var logoutUris = await _applicationManager.FindRegisteredLogoutUrisAsync(application);
-
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/LogoutUris/Create")]
- [ValidateAntiForgeryToken]
- public async Task CreateLogoutUri(
- [FromRoute] string id,
- [FromForm] CreateLogoutUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var logoutUris = await _applicationManager.FindRegisteredLogoutUrisAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- var result = await _applicationManager.RegisterLogoutUriAsync(application, model.NewLogoutUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- return RedirectToAction(nameof(CreateLogoutUri), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/Remove")]
- public async Task RemoveApplication([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new RemoveApplicationViewModel(applicationName));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/Remove")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RemoveApplicationViewModel))]
- public async Task RemoveApplicationConfirmed([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new RemoveApplicationViewModel(applicationName));
- }
-
- var result = await _applicationManager.DeleteAsync(application);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new RemoveApplicationViewModel(applicationName));
- }
-
- return RedirectToAction(nameof(Index));
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}")]
- public async Task Details([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- var applicationClientId = await _applicationManager.GetApplicationClientIdAsync(application);
- var hasClientSecret = await _applicationManager.HasClientSecretAsync(application);
- var redirectUris = await _applicationManager.FindRegisteredUrisAsync(application);
- var logoutUris = await _applicationManager.FindRegisteredLogoutUrisAsync(application);
- var scopes = await _applicationManager.FindScopesAsync(application);
-
- return View(new ApplicationDetailsViewModel
- {
- Name = applicationName,
- ClientId = applicationClientId,
- HasClientSecret = hasClientSecret,
- RedirectUris = redirectUris,
- LogoutUris = logoutUris,
- Scopes = scopes
- });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/ChangeName")]
- public async Task ChangeName([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new ChangeApplicationNameViewModel(applicationName));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/ChangeName")]
- [ValidateAntiForgeryToken]
- public async Task ChangeName([FromRoute]string id, [FromForm] ChangeApplicationNameViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new ChangeApplicationNameViewModel(applicationName));
- }
-
- var changeNameResult = await _applicationManager.SetApplicationNameAsync(application, model.Name);
- if (!changeNameResult.Succeeded)
- {
- MapErrorsToModelState("", changeNameResult);
- return View(new ChangeApplicationNameViewModel(applicationName));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/GenerateClientSecret")]
- public async Task GenerateClientSecret([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
- return View(model: name);
- }
-
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/GenerateClientSecret")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(GenerateClientSecret))]
- public async Task GenerateClientSecretConfirmed([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
-
- var clientSecret = await _applicationManager.GenerateClientSecretAsync();
- var addSecretResult = await _applicationManager.AddClientSecretAsync(application, clientSecret);
- if (!addSecretResult.Succeeded)
- {
- MapErrorsToModelState("", addSecretResult);
- return View(model: name);
- }
-
- return View("GeneratedClientSecret", new GeneratedClientSecretViewModel(name, clientSecret));
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RemoveClientSecret")]
- public async Task RemoveClientSecret([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
- return View(model: name);
- }
-
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RemoveClientSecret")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RemoveClientSecret))]
- public async Task RemoveClientSecretConfirmed([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
-
- var removeSecretResult = await _applicationManager.RemoveClientSecretAsync(application);
- if (!removeSecretResult.Succeeded)
- {
- MapErrorsToModelState("", removeSecretResult);
- return View(model: name);
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RegenerateClientSecret")]
- public async Task RegenerateClientSecret([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
- return View(model: name);
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RegenerateClientSecret")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RegenerateClientSecret))]
- public async Task RegenerateClientSecretConfirmed([FromRoute]string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var name = await _applicationManager.GetApplicationNameAsync(application);
- var clientSecret = await _applicationManager.GenerateClientSecretAsync();
- var changeSecretResult = await _applicationManager.ChangeClientSecretAsync(application, clientSecret);
- if (!changeSecretResult.Succeeded)
- {
- MapErrorsToModelState("", changeSecretResult);
- return View(model: name);
- }
-
- return View("GeneratedClientSecret", new GeneratedClientSecretViewModel(name, clientSecret));
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/Scopes/Add")]
- public async Task AddScope([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var scopes = await _applicationManager.FindScopesAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/Scopes/Add")]
- [ValidateAntiForgeryToken]
- public async Task AddScope(
- [FromRoute] string id,
- [FromForm] CreateScopeViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var scopes = await _applicationManager.FindScopesAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- var result = await _applicationManager.AddScopeAsync(application, model.NewScope);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateScopeViewModel(applicationName, scopes));
- }
-
- return RedirectToAction(nameof(AddScope), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/Scopes/Edit/{scope}")]
- public async Task EditScope([FromRoute] string id, [FromRoute] string scope)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new EditScopeViewModel(applicationName, scope));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/Scopes/Edit/{scope}")]
- [ValidateAntiForgeryToken]
- public async Task EditScope(
- [FromRoute] string id,
- [FromRoute] string scope,
- [FromForm] EditScopeViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new EditScopeViewModel(applicationName, scope));
- }
-
- var result = await _applicationManager.UpdateScopeAsync(application, scope, model.Scope);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new EditScopeViewModel(applicationName, scope));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RedirectUri/Edit")]
- public async Task EditRedirectUri([FromRoute] string id, [FromQuery] string redirectUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new EditRedirectUriViewModel(applicationName, redirectUri));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RedirectUri/Edit")]
- [ValidateAntiForgeryToken]
- public async Task EditRedirectUri(
- [FromRoute] string id,
- [FromQuery] string redirectUri,
- [FromForm] EditRedirectUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new EditRedirectUriViewModel(applicationName, redirectUri));
- }
-
- var result = await _applicationManager.UpdateRedirectUriAsync(application, redirectUri, model.RedirectUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new EditRedirectUriViewModel(applicationName, redirectUri));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/LogoutUri/Edit")]
- public async Task EditLogoutUri([FromRoute] string id, [FromQuery] string logoutUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new EditLogoutUriViewModel(applicationName, logoutUri));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/LogoutUri/Edit")]
- [ValidateAntiForgeryToken]
- public async Task EditLogoutUri(
- [FromRoute] string id,
- [FromQuery] string logoutUri,
- [FromForm] EditLogoutUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new EditLogoutUriViewModel(applicationName, logoutUri));
- }
-
- var result = await _applicationManager.UpdateLogoutUriAsync(application, logoutUri, model.LogoutUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new EditLogoutUriViewModel(applicationName, logoutUri));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/Scopes/Remove/{scope}")]
- public async Task RemoveScope([FromRoute] string id, [FromRoute] string scope)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new RemoveScopeViewModel(applicationName, scope));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/Scopes/Remove/{scope}")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RemoveScope))]
- public async Task RemoveScopeConfirmed([FromRoute] string id, [FromRoute] string scope)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new RemoveScopeViewModel(applicationName, scope));
- }
-
- var result = await _applicationManager.RemoveScopeAsync(application, scope);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new RemoveScopeViewModel(applicationName, scope));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RedirectUri/Remove")]
- public async Task RemoveRedirectUri([FromRoute] string id, [FromQuery] string redirectUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new RemoveRedirectUriViewModel(applicationName, redirectUri));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RedirectUri/Remove")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RemoveRedirectUri))]
- public async Task RemoveRedirectUriConfirmed([FromRoute] string id, [FromQuery] string redirectUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new RemoveRedirectUriViewModel(applicationName, redirectUri));
- }
-
- var result = await _applicationManager.UnregisterRedirectUriAsync(application, redirectUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new RemoveRedirectUriViewModel(applicationName, redirectUri));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/LogoutUri/Remove")]
- public async Task RemoveLogoutUri([FromRoute] string id, [FromQuery] string logoutUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new RemoveLogoutUriViewModel(applicationName, logoutUri));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/LogoutUri/Remove")]
- [ValidateAntiForgeryToken]
- [ActionName(nameof(RemoveLogoutUri))]
- public async Task RemoveLogoutUriConfirmed([FromRoute] string id, [FromQuery] string logoutUri)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new RemoveLogoutUriViewModel(applicationName, logoutUri));
- }
-
- var result = await _applicationManager.UnregisterLogoutUriAsync(application, logoutUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new RemoveLogoutUriViewModel(applicationName, logoutUri));
- }
-
- return RedirectToAction(nameof(Details), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/RedirectUris/Add")]
- public async Task AddRedirectUri([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var redirectUris = await _applicationManager.FindRegisteredUrisAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/RedirectUris/Add")]
- [ValidateAntiForgeryToken]
- public async Task AddRedirectUri(
- [FromRoute] string id,
- [FromForm] CreateRedirectUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var redirectUris = await _applicationManager.FindRegisteredUrisAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- var result = await _applicationManager.RegisterRedirectUriAsync(application, model.NewRedirectUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateRedirectUriViewModel(applicationName, redirectUris));
- }
-
- return RedirectToAction(nameof(AddRedirectUri), new { id });
- }
-
- [HttpGet("tfp/Identity/signinsignup/Applications/{id}/LogoutUris/Add")]
- public async Task AddLogoutUri([FromRoute] string id)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var logoutUris = await _applicationManager.FindRegisteredLogoutUrisAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
-
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- [HttpPost("tfp/Identity/signinsignup/Applications/{id}/LogoutUris/Add")]
- [ValidateAntiForgeryToken]
- public async Task AddLogoutUri(
- [FromRoute] string id,
- [FromForm] CreateLogoutUriViewModel model)
- {
- var application = await _applicationManager.FindByIdAsync(id);
- var logoutUris = await _applicationManager.FindRegisteredLogoutUrisAsync(application);
- var applicationName = await _applicationManager.GetApplicationNameAsync(application);
- if (!ModelState.IsValid)
- {
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- var result = await _applicationManager.RegisterLogoutUriAsync(application, model.NewLogoutUri);
- if (!result.Succeeded)
- {
- MapErrorsToModelState("", result);
- return View(new CreateLogoutUriViewModel(id, applicationName, logoutUris));
- }
-
- return RedirectToAction(nameof(AddLogoutUri), new { id });
- }
-
- private void MapErrorsToModelState(string key, IdentityServiceResult result)
- {
- foreach (var error in result.Errors)
- {
- ModelState.AddModelError(key, error.Description);
- }
- }
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceConfigurationController.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceConfigurationController.cs
deleted file mode 100644
index 7cbb347f9..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceConfigurationController.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Mvc;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Controllers
-{
- [Area("Identity")]
- public class IdentityServiceConfigurationController : Controller
- {
- private readonly IConfigurationManager _configurationProvider;
- private readonly IKeySetMetadataProvider _keySetProvider;
-
- public IdentityServiceConfigurationController(
- IConfigurationManager configurationProvider,
- IKeySetMetadataProvider keySetProvider)
- {
- _configurationProvider = configurationProvider;
- _keySetProvider = keySetProvider;
- }
-
- [HttpGet("tfp/Identity/signinsignup/v2.0/.well-known/openid-configuration")]
- [Produces("application/json")]
- public async Task Metadata()
- {
- var configurationContext = new ConfigurationContext
- {
- Id = "IdentityService:signinsignup",
- HttpContext = HttpContext,
- AuthorizationEndpoint = EndpointLink("Authorize", "IdentityService"),
- TokenEndpoint = EndpointLink("Token", "IdentityService"),
- JwksUriEndpoint = EndpointLink("Keys", "IdentityServiceConfiguration"),
- EndSessionEndpoint = EndpointLink("Logout", "IdentityService"),
- };
-
- return Ok(await _configurationProvider.GetConfigurationAsync(configurationContext));
- }
-
- [HttpGet("tfp/Identity/signinsignup/discovery/v2.0/keys")]
- [Produces("application/json")]
- public async Task Keys()
- {
- return Ok(await _keySetProvider.GetKeysAsync());
- }
-
- private string EndpointLink(string action, string controller) =>
- Url.Action(action, controller, null, Request.Scheme, Request.Host.Value);
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceController.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceController.cs
deleted file mode 100644
index 49d4aa169..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/IdentityServiceController.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System.Security.Claims;
-using System.Threading.Tasks;
-using IdentityOIDCWebApplicationSample.Identity.Models;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Identity.Service.IntegratedWebClient;
-using Microsoft.AspNetCore.Identity.Service.Mvc;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Controllers
-{
- [Area("Identity")]
- public class IdentityServiceController : Controller
- {
- private readonly IOptions _options;
- private readonly ITokenManager _tokenManager;
- private readonly SessionManager _sessionManager;
- private readonly IAuthorizationResponseFactory _authorizationResponseFactory;
- private readonly ITokenResponseFactory _tokenResponseFactory;
-
- public IdentityServiceController(
- IOptions options,
- ITokenManager tokenManager,
- SessionManager sessionManager,
- IAuthorizationResponseFactory authorizationResponseFactory,
- ITokenResponseFactory tokenResponseFactory)
- {
- _options = options;
- _tokenManager = tokenManager;
- _sessionManager = sessionManager;
- _authorizationResponseFactory = authorizationResponseFactory;
- _tokenResponseFactory = tokenResponseFactory;
- }
-
- [HttpGet("tfp/Identity/signinsignup/oauth2/v2.0/authorize/")]
- public async Task Authorize(
- [EnableIntegratedWebClient, ModelBinder(typeof(AuthorizationRequestModelBinder))] AuthorizationRequest authorization)
- {
- if (!authorization.IsValid)
- {
- return this.InvalidAuthorization(authorization.Error);
- }
-
- var authorizationResult = await _sessionManager.IsAuthorizedAsync(authorization);
- if (authorizationResult.Status == AuthorizationStatus.Forbidden)
- {
- return this.InvalidAuthorization(authorizationResult.Error);
- }
-
- if (authorizationResult.Status == AuthorizationStatus.LoginRequired)
- {
- return RedirectToLogin(nameof(AccountController.Login), "Account", authorization.Message);
- }
-
- var context = authorization.CreateTokenGeneratingContext(
- authorizationResult.User,
- authorizationResult.Application);
-
- context.AmbientClaims.Add(new Claim("policy", "signinsignup"));
- context.AmbientClaims.Add(new Claim("version", "1.0"));
- context.AmbientClaims.Add(new Claim("tenantId", "CDF07358 -BA97-470F-93CD-FC46E1B57F99"));
-
- await _tokenManager.IssueTokensAsync(context);
- var response = await _authorizationResponseFactory.CreateAuthorizationResponseAsync(context);
-
- await _sessionManager.StartSessionAsync(authorizationResult.User, authorizationResult.Application);
-
- return this.ValidAuthorization(response);
- }
-
- [HttpPost("tfp/Identity/signinsignup/oauth2/v2.0/token")]
- [Produces("application/json")]
- public async Task Token(
- [ModelBinder(typeof(TokenRequestModelBinder))] TokenRequest request)
- {
- if (!request.IsValid)
- {
- return BadRequest(request.Error.Parameters);
- }
-
- var session = await _sessionManager.CreateSessionAsync(request.UserId, request.ClientId);
-
- var context = request.CreateTokenGeneratingContext(session.User, session.Application);
-
- context.AmbientClaims.Add(new Claim("policy", "signinsignup"));
- context.AmbientClaims.Add(new Claim("version", "1.0"));
- context.AmbientClaims.Add(new Claim("tenantId", "CDF07358 -BA97-470F-93CD-FC46E1B57F99"));
-
- await _tokenManager.IssueTokensAsync(context);
- var response = await _tokenResponseFactory.CreateTokenResponseAsync(context);
- return Ok(response.Parameters);
- }
-
- [HttpGet("tfp/Identity/signinsignup/oauth2/v2.0/logout")]
- public async Task Logout(
- [EnableIntegratedWebClient, ModelBinder(typeof(LogoutRequestModelBinder))] LogoutRequest request)
- {
- if (!request.IsValid)
- {
- return View("InvalidLogoutRedirect", request.Message);
- }
-
- var endSessionResult = await _sessionManager.EndSessionAsync(request);
- if (endSessionResult.Status == LogoutStatus.RedirectToLogoutUri)
- {
- return Redirect(endSessionResult.LogoutRedirect);
- }
- else
- {
- return View("LoggedOut", request);
- }
- }
-
- private IActionResult RedirectToLogin(string action, string controller, OpenIdConnectMessage message)
- {
- var messageCopy = message.Clone();
- messageCopy.Prompt = null;
-
- var parameters = new
- {
- ReturnUrl = Url.Action("Authorize", "IdentityService", messageCopy.Parameters)
- };
-
- return RedirectToAction(action, controller, parameters);
- }
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ManageController.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ManageController.cs
deleted file mode 100644
index b2e6db653..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Controllers/ManageController.cs
+++ /dev/null
@@ -1,342 +0,0 @@
-using System.Linq;
-using System.Threading.Tasks;
-using IdentityOIDCWebApplicationSample.Identity.Models;
-using IdentityOIDCWebApplicationSample.Identity.Models.ManageViewModels;
-using IdentityOIDCWebApplicationSample.Identity.Services;
-using Microsoft.AspNetCore.Authentication;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Logging;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Controllers
-{
- [Authorize(IdentityServiceOptions.LoginPolicyName)]
- [Area("Identity")]
- [Route("tfp/Identity/[controller]/[action]")]
- public class ManageController : Controller
- {
- private readonly UserManager _userManager;
- private readonly SignInManager _signInManager;
- private readonly IEmailSender _emailSender;
- private readonly ISmsSender _smsSender;
- private readonly ILogger _logger;
-
- public ManageController(
- UserManager userManager,
- SignInManager signInManager,
- IEmailSender emailSender,
- ISmsSender smsSender,
- ILoggerFactory loggerFactory)
- {
- _userManager = userManager;
- _signInManager = signInManager;
- _emailSender = emailSender;
- _smsSender = smsSender;
- _logger = loggerFactory.CreateLogger();
- }
-
- [HttpGet]
- public async Task Index(ManageMessageId? message = null)
- {
- ViewData["StatusMessage"] =
- message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
- : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
- : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
- : message == ManageMessageId.Error ? "An error has occurred."
- : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
- : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
- : "";
-
- var user = await GetCurrentUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var model = new IndexViewModel
- {
- HasPassword = await _userManager.HasPasswordAsync(user),
- PhoneNumber = await _userManager.GetPhoneNumberAsync(user),
- TwoFactor = await _userManager.GetTwoFactorEnabledAsync(user),
- Logins = await _userManager.GetLoginsAsync(user),
- BrowserRemembered = await _signInManager.IsTwoFactorClientRememberedAsync(user)
- };
- return View(model);
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task RemoveLogin(RemoveLoginViewModel account)
- {
- ManageMessageId? message = ManageMessageId.Error;
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- var result = await _userManager.RemoveLoginAsync(user, account.LoginProvider, account.ProviderKey);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- message = ManageMessageId.RemoveLoginSuccess;
- }
- }
- return RedirectToAction(nameof(ManageLogins), new { Message = message });
- }
-
- [HttpGet]
- public IActionResult AddPhoneNumber()
- {
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task AddPhoneNumber(AddPhoneNumberViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- // Generate the token and send it
- var user = await GetCurrentUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var code = await _userManager.GenerateChangePhoneNumberTokenAsync(user, model.PhoneNumber);
- await _smsSender.SendSmsAsync(model.PhoneNumber, "Your security code is: " + code);
- return RedirectToAction(nameof(VerifyPhoneNumber), new { PhoneNumber = model.PhoneNumber });
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task EnableTwoFactorAuthentication()
- {
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- await _userManager.SetTwoFactorEnabledAsync(user, true);
- await _signInManager.SignInAsync(user, isPersistent: false);
- _logger.LogInformation(1, "User enabled two-factor authentication.");
- }
- return RedirectToAction(nameof(Index), "Manage");
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task DisableTwoFactorAuthentication()
- {
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- await _userManager.SetTwoFactorEnabledAsync(user, false);
- await _signInManager.SignInAsync(user, isPersistent: false);
- _logger.LogInformation(2, "User disabled two-factor authentication.");
- }
- return RedirectToAction(nameof(Index), "Manage");
- }
-
- [HttpGet]
- public async Task VerifyPhoneNumber(string phoneNumber)
- {
- var user = await GetCurrentUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var code = await _userManager.GenerateChangePhoneNumberTokenAsync(user, phoneNumber);
- // Send an SMS to verify the phone number
- return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- var result = await _userManager.ChangePhoneNumberAsync(user, model.PhoneNumber, model.Code);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.AddPhoneSuccess });
- }
- }
- // If we got this far, something failed, redisplay the form
- ModelState.AddModelError(string.Empty, "Failed to verify phone number");
- return View(model);
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task RemovePhoneNumber()
- {
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- var result = await _userManager.SetPhoneNumberAsync(user, null);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.RemovePhoneSuccess });
- }
- }
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
- }
-
- [HttpGet]
- public IActionResult ChangePassword()
- {
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task ChangePassword(ChangePasswordViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- var result = await _userManager.ChangePasswordAsync(user, model.OldPassword, model.NewPassword);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- _logger.LogInformation(3, "User changed their password successfully.");
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.ChangePasswordSuccess });
- }
- AddErrors(result);
- return View(model);
- }
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
- }
-
- [HttpGet]
- public IActionResult SetPassword()
- {
- return View();
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task SetPassword(SetPasswordViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
-
- var user = await GetCurrentUserAsync();
- if (user != null)
- {
- var result = await _userManager.AddPasswordAsync(user, model.NewPassword);
- if (result.Succeeded)
- {
- await _signInManager.SignInAsync(user, isPersistent: false);
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.SetPasswordSuccess });
- }
- AddErrors(result);
- return View(model);
- }
- return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
- }
-
- [HttpGet]
- public async Task ManageLogins(ManageMessageId? message = null)
- {
- ViewData["StatusMessage"] =
- message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
- : message == ManageMessageId.AddLoginSuccess ? "The external login was added."
- : message == ManageMessageId.Error ? "An error has occurred."
- : "";
- var user = await GetCurrentUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var userLogins = await _userManager.GetLoginsAsync(user);
- var schemes = await _signInManager.GetExternalAuthenticationSchemesAsync();
- var otherLogins = schemes.Where(auth => userLogins.All(ul => auth.Name != ul.LoginProvider)).ToList();
- ViewData["ShowRemoveButton"] = user.PasswordHash != null || userLogins.Count > 1;
- return View(new ManageLoginsViewModel
- {
- CurrentLogins = userLogins,
- OtherLogins = otherLogins
- });
- }
-
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task LinkLogin(string provider)
- {
- // Clear the existing external cookie to ensure a clean login process
- await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
-
- // Request a redirect to the external login provider to link a login for the current user
- var redirectUrl = Url.Action(nameof(LinkLoginCallback), "Manage");
- var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User));
- return Challenge(properties, provider);
- }
-
- [HttpGet]
- public async Task LinkLoginCallback()
- {
- var user = await GetCurrentUserAsync();
- if (user == null)
- {
- return View("Error");
- }
- var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user));
- if (info == null)
- {
- return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error });
- }
- var result = await _userManager.AddLoginAsync(user, info);
- var message = ManageMessageId.Error;
- if (result.Succeeded)
- {
- message = ManageMessageId.AddLoginSuccess;
- // Clear the existing external cookie to ensure a clean login process
- await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
- }
- return RedirectToAction(nameof(ManageLogins), new { Message = message });
- }
-
- #region Helpers
-
- private void AddErrors(IdentityResult result)
- {
- foreach (var error in result.Errors)
- {
- ModelState.AddModelError(string.Empty, error.Description);
- }
- }
-
- public enum ManageMessageId
- {
- AddPhoneSuccess,
- AddLoginSuccess,
- ChangePasswordSuccess,
- SetTwoFactorSuccess,
- SetPasswordSuccess,
- RemoveLoginSuccess,
- RemovePhoneSuccess,
- Error
- }
-
- private Task GetCurrentUserAsync()
- {
- return _userManager.GetUserAsync(HttpContext.User);
- }
-
- #endregion
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContext.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContext.cs
deleted file mode 100644
index 6c9e9de15..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContext.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore;
-using IdentityOIDCWebApplicationSample.Identity.Models;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Data
-{
- public class IdentityServiceDbContext : IdentityServiceDbContext
- {
- public IdentityServiceDbContext(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/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContextFactory.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContextFactory.cs
deleted file mode 100644
index b88304ae4..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/IdentityServiceDbContextFactory.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-using Microsoft.EntityFrameworkCore.Design;
-using Microsoft.Extensions.DependencyInjection;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Data
-{
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs
deleted file mode 100644
index cf75294f2..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs
+++ /dev/null
@@ -1,353 +0,0 @@
-//
-using System;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Metadata;
-using Microsoft.EntityFrameworkCore.Migrations;
-using IdentityOIDCWebApplicationSample.Identity.Data;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Data.Migrations
-{
- [DbContext(typeof(IdentityServiceDbContext))]
- [Migration("00000000000000_CreateIdentitySchema")]
- partial class CreateIdentitySchema
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
- modelBuilder
- .HasAnnotation("ProductVersion", "2.0.0-preview1-24567");
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken();
-
- b.Property("Name")
- .HasMaxLength(256);
-
- b.Property("NormalizedName")
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedName")
- .IsUnique()
- .HasName("RoleNameIndex");
-
- b.ToTable("AspNetRoles");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClaimType");
-
- b.Property("ClaimValue");
-
- b.Property("RoleId")
- .IsRequired();
-
- b.HasKey("Id");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetRoleClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClaimType");
-
- b.Property("ClaimValue");
-
- b.Property("UserId")
- .IsRequired();
-
- b.HasKey("Id");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b =>
- {
- b.Property("LoginProvider");
-
- b.Property("ProviderKey");
-
- b.Property("ProviderDisplayName");
-
- b.Property("UserId")
- .IsRequired();
-
- b.HasKey("LoginProvider", "ProviderKey");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserLogins");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b =>
- {
- b.Property("UserId");
-
- b.Property("RoleId");
-
- b.HasKey("UserId", "RoleId");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetUserRoles");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b =>
- {
- b.Property("UserId");
-
- b.Property("LoginProvider");
-
- b.Property("Name");
-
- b.Property("Value");
-
- b.HasKey("UserId", "LoginProvider", "Name");
-
- b.ToTable("AspNetUserTokens");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClientId")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("ClientSecretHash");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken();
-
- b.Property("Name")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("UserId");
-
- b.HasKey("Id");
-
- b.HasIndex("ClientId")
- .IsUnique()
- .HasName("ClientIdIndex");
-
- b.HasIndex("Name")
- .IsUnique()
- .HasName("NameIndex");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetApplications");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplicationClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ApplicationId")
- .IsRequired();
-
- b.Property("ClaimType")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("ClaimValue")
- .IsRequired()
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("ApplicationId");
-
- b.ToTable("AspNetApplicationClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceRedirectUri", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ApplicationId")
- .IsRequired();
-
- b.Property("IsLogout");
-
- b.Property("Value")
- .IsRequired()
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("ApplicationId");
-
- b.ToTable("AspNetRedirectUris");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceScope", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ApplicationId")
- .IsRequired();
-
- b.Property("Value")
- .IsRequired()
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("ApplicationId");
-
- b.ToTable("AspNetScopes");
- });
-
- modelBuilder.Entity("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("AccessFailedCount");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken();
-
- b.Property("Email")
- .HasMaxLength(256);
-
- b.Property("EmailConfirmed");
-
- b.Property("LockoutEnabled");
-
- b.Property("LockoutEnd");
-
- b.Property("NormalizedEmail")
- .HasMaxLength(256);
-
- b.Property("NormalizedUserName")
- .HasMaxLength(256);
-
- b.Property("PasswordHash");
-
- b.Property("PhoneNumber");
-
- b.Property("PhoneNumberConfirmed");
-
- b.Property("SecurityStamp");
-
- b.Property("TwoFactorEnabled");
-
- b.Property("UserName")
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedEmail")
- .HasName("EmailIndex");
-
- b.HasIndex("NormalizedUserName")
- .IsUnique()
-
- .HasName("UserNameIndex");
-
- b.ToTable("AspNetUsers");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b =>
- {
- b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole")
- .WithMany("Claims")
- .HasForeignKey("RoleId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b =>
- {
- b.HasOne("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser")
- .WithMany("Claims")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b =>
- {
- b.HasOne("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser")
- .WithMany("Logins")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b =>
- {
- b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole")
- .WithMany("Users")
- .HasForeignKey("RoleId")
- .OnDelete(DeleteBehavior.Cascade);
-
- b.HasOne("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser")
- .WithMany("Roles")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b =>
- {
- b.HasOne("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser")
- .WithMany("Tokens")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication", b =>
- {
- b.HasOne("IdentityOIDCWebApplicationSample.Identity.Models.ApplicationUser")
- .WithMany()
- .HasForeignKey("UserId");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplicationClaim", b =>
- {
- b.HasOne("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication")
- .WithMany("Claims")
- .HasForeignKey("ApplicationId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceRedirectUri", b =>
- {
- b.HasOne("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication")
- .WithMany("RedirectUris")
- .HasForeignKey("ApplicationId")
- .OnDelete(DeleteBehavior.Cascade);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceScope", b =>
- {
- b.HasOne("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication")
- .WithMany("Scopes")
- .HasForeignKey("ApplicationId")
- .OnDelete(DeleteBehavior.Cascade);
- });
- }
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.cs
deleted file mode 100644
index 64879b5c1..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/00000000000000_CreateIdentitySchema.cs
+++ /dev/null
@@ -1,436 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.AspNetCore.Identity.Service;
-using Microsoft.EntityFrameworkCore.Migrations;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Data.Migrations
-{
- public partial class CreateIdentitySchema : Migration
- {
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.CreateTable(
- name: "AspNetRoles",
- columns: table => new
- {
- Id = table.Column(nullable: false),
- ConcurrencyStamp = table.Column(nullable: true),
- Name = table.Column(maxLength: 256, nullable: true),
- NormalizedName = table.Column(maxLength: 256, nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetRoles", x => x.Id);
- });
-
- migrationBuilder.CreateTable(
- name: "AspNetUsers",
- columns: table => new
- {
- Id = table.Column(nullable: false),
- AccessFailedCount = table.Column(nullable: false),
- ConcurrencyStamp = table.Column(nullable: true),
- Email = table.Column(maxLength: 256, nullable: true),
- EmailConfirmed = table.Column(nullable: false),
- LockoutEnabled = table.Column(nullable: false),
- LockoutEnd = table.Column(nullable: true),
- NormalizedEmail = table.Column(maxLength: 256, nullable: true),
- NormalizedUserName = table.Column(maxLength: 256, nullable: true),
- PasswordHash = table.Column(nullable: true),
- PhoneNumber = table.Column(nullable: true),
- PhoneNumberConfirmed = table.Column(nullable: false),
- SecurityStamp = table.Column(nullable: true),
- TwoFactorEnabled = table.Column(nullable: false),
- UserName = table.Column(maxLength: 256, nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetUsers", x => x.Id);
- });
-
- migrationBuilder.CreateTable(
- name: "AspNetRoleClaims",
- columns: table => new
- {
- Id = table.Column(nullable: false)
- .Annotation("Sqlite:Autoincrement", true),
- ClaimType = table.Column(nullable: true),
- ClaimValue = table.Column(nullable: true),
- RoleId = table.Column(nullable: false)
- },
- 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(nullable: false)
- .Annotation("Sqlite:Autoincrement", true),
- ClaimType = table.Column(nullable: true),
- ClaimValue = table.Column(nullable: true),
- UserId = table.Column(nullable: false)
- },
- 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(nullable: false),
- ProviderKey = table.Column(nullable: false),
- ProviderDisplayName = table.Column(nullable: true),
- UserId = table.Column(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(nullable: false),
- RoleId = table.Column(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(nullable: false),
- LoginProvider = table.Column(nullable: false),
- Name = table.Column(nullable: false),
- Value = table.Column(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.CreateTable(
- name: "AspNetApplications",
- columns: table => new
- {
- Id = table.Column(nullable: false),
- ClientId = table.Column(maxLength: 256, nullable: false),
- ClientSecretHash = table.Column(nullable: true),
- ConcurrencyStamp = table.Column(nullable: true),
- Name = table.Column(maxLength: 256, nullable: false),
- UserId = table.Column(nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetApplications", x => x.Id);
- table.ForeignKey(
- name: "FK_AspNetApplications_AspNetUsers_UserId",
- column: x => x.UserId,
- principalTable: "AspNetUsers",
- principalColumn: "Id",
- onDelete: ReferentialAction.Restrict);
- });
-
- migrationBuilder.CreateTable(
- name: "AspNetApplicationClaims",
- columns: table => new
- {
- Id = table.Column(nullable: false)
- .Annotation("Sqlite:Autoincrement", true),
- ApplicationId = table.Column(nullable: false),
- ClaimType = table.Column(maxLength: 256, nullable: false),
- ClaimValue = table.Column(maxLength: 256, nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetApplicationClaims", x => x.Id);
- table.ForeignKey(
- name: "FK_AspNetApplicationClaims_AspNetApplications_ApplicationId",
- column: x => x.ApplicationId,
- principalTable: "AspNetApplications",
- principalColumn: "Id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.CreateTable(
- name: "AspNetRedirectUris",
- columns: table => new
- {
- Id = table.Column(nullable: false),
- ApplicationId = table.Column(nullable: false),
- IsLogout = table.Column(nullable: false),
- Value = table.Column(maxLength: 256, nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetRedirectUris", x => x.Id);
- table.ForeignKey(
- name: "FK_AspNetRedirectUris_AspNetApplications_ApplicationId",
- column: x => x.ApplicationId,
- principalTable: "AspNetApplications",
- principalColumn: "Id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.CreateTable(
- name: "AspNetScopes",
- columns: table => new
- {
- Id = table.Column(nullable: false),
- ApplicationId = table.Column(nullable: false),
- Value = table.Column(maxLength: 256, nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_AspNetScopes", x => x.Id);
- table.ForeignKey(
- name: "FK_AspNetScopes_AspNetApplications_ApplicationId",
- column: x => x.ApplicationId,
- principalTable: "AspNetApplications",
- principalColumn: "Id",
- onDelete: ReferentialAction.Cascade);
- });
-
- migrationBuilder.CreateIndex(
- name: "RoleNameIndex",
- table: "AspNetRoles",
- column: "NormalizedName",
- unique: true);
-
- migrationBuilder.CreateIndex(
- name: "IX_AspNetRoleClaims_RoleId",
- table: "AspNetRoleClaims",
- column: "RoleId");
-
- 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: "ClientIdIndex",
- table: "AspNetApplications",
- column: "ClientId",
- unique: true);
-
- migrationBuilder.CreateIndex(
- name: "NameIndex",
- table: "AspNetApplications",
- column: "Name",
- unique: true);
-
- migrationBuilder.CreateIndex(
- name: "IX_AspNetApplications_UserId",
- table: "AspNetApplications",
- column: "UserId");
-
- migrationBuilder.CreateIndex(
- name: "IX_AspNetApplicationClaims_ApplicationId",
- table: "AspNetApplicationClaims",
- column: "ApplicationId");
-
- migrationBuilder.CreateIndex(
- name: "IX_AspNetRedirectUris_ApplicationId",
- table: "AspNetRedirectUris",
- column: "ApplicationId");
-
- migrationBuilder.CreateIndex(
- name: "IX_AspNetScopes_ApplicationId",
- table: "AspNetScopes",
- column: "ApplicationId");
-
- migrationBuilder.CreateIndex(
- name: "EmailIndex",
- table: "AspNetUsers",
- column: "NormalizedEmail");
-
- migrationBuilder.CreateIndex(
- name: "UserNameIndex",
- table: "AspNetUsers",
- column: "NormalizedUserName",
- unique: true);
-
- // Seed client applications
- var integratedClientClientId = "56A33E6A-ADFE-47EA-BBFE-40F4AE4C55BA";
- RegisterApplication(migrationBuilder,
- integratedClientClientId,
- "IdentityOIDCWebApplicationSample",
- new[] { ApplicationScope.OpenId.Scope },
- new[] { "urn:self:aspnet:identity:integrated" },
- new[] { "urn:self:aspnet:identity:integrated" });
-
- var mobileAppId = "06D7C2FB-A66A-41AD-9509-77BDDFAB111B";
- RegisterApplication(migrationBuilder,
- mobileAppId,
- "MobileApplication",
- new[] { ApplicationScope.OpenId.Scope, ApplicationScope.OfflineAccess.Scope },
- new[] { "urn:ietf:wg:oauth:2.0:oob" },
- new[] { "urn:ietf:wg:oauth:2.0:oob" });
-
- var protectedApi = "6EA3533F-DD7B-4C34-AAAD-3C493B72D7A5";
- RegisterApplication(migrationBuilder,
- protectedApi,
- "ProtectedApi",
- new[] { "read" },
- new string[] { },
- new string[] { });
-
- var spaClientId = "CDA53D17-6683-4EA7-B6D7-B6DB23E60DED";
- RegisterApplication(migrationBuilder,
- spaClientId,
- "SPA",
- new[] { ApplicationScope.OpenId.Scope },
- new[] { "https://localhost:44324/Spa.html" },
- new[] { "https://localhost:44324/Spa.html" });
- }
-
- private void RegisterApplication(
- MigrationBuilder migrationBuilder,
- string clientId,
- string name,
- string[] scopes,
- string[] redirectUris,
- string[] logoutRedirectUris)
- {
- var clientAppId = Guid.NewGuid().ToString();
- migrationBuilder.InsertData(
- table: "AspNetApplications",
- columns: new[] { "Id", "ClientId", "Name" },
- values: new object[,]
- {
- { clientAppId, clientId, name }
- });
-
- var scopeValues = new object[scopes.Length, 3];
-
- for (int i = 0; i < scopes.Length; i++)
- {
- scopeValues.SetValue(Guid.NewGuid().ToString(), i, 0);
- scopeValues.SetValue(clientAppId, i, 1);
- scopeValues.SetValue(scopes[i], i, 2);
- }
-
- migrationBuilder.InsertData(
- table: "AspNetScopes",
- columns: new[] { "Id", "ApplicationId", "Value" },
- values: scopeValues);
-
- var redirectUriValues = new object[redirectUris.Length + logoutRedirectUris.Length, 4];
-
- for (var i = 0; i < redirectUris.Length; i++)
- {
- var clientRedirectUriId = Guid.NewGuid().ToString();
- redirectUriValues.SetValue(clientRedirectUriId, i, 0);
- redirectUriValues.SetValue(clientAppId, i, 1);
- redirectUriValues.SetValue(false, i, 2);
- redirectUriValues.SetValue(redirectUris[i], i, 3);
- }
-
- for (var i = redirectUris.Length; i < redirectUris.Length + logoutRedirectUris.Length; i++)
- {
- var clientLogoutUriId = Guid.NewGuid().ToString();
- redirectUriValues.SetValue(clientLogoutUriId, i, 0);
- redirectUriValues.SetValue(clientAppId, i, 1);
- redirectUriValues.SetValue(true, i, 2);
- redirectUriValues.SetValue(logoutRedirectUris[i - redirectUris.Length], i, 3);
- }
-
- migrationBuilder.InsertData(
- table: "AspNetRedirectUris",
- columns: new[] { "Id", "ApplicationId", "IsLogout", "Value" },
- values: redirectUriValues);
- }
-
- 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: "AspNetApplicationClaims");
-
- migrationBuilder.DropTable(
- name: "AspNetRedirectUris");
-
- migrationBuilder.DropTable(
- name: "AspNetScopes");
-
- migrationBuilder.DropTable(
- name: "AspNetRoles");
-
- migrationBuilder.DropTable(
- name: "AspNetApplications");
-
- migrationBuilder.DropTable(
- name: "AspNetUsers");
- }
- }
-}
diff --git a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/IdentityServiceDbContextModelSnapshot.cs b/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/IdentityServiceDbContextModelSnapshot.cs
deleted file mode 100644
index aa65bf8f3..000000000
--- a/samples/IdentityOIDCWebApplicationSample/Areas/Identity/Data/Migrations/IdentityServiceDbContextModelSnapshot.cs
+++ /dev/null
@@ -1,351 +0,0 @@
-//
-using System;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Metadata;
-using Microsoft.EntityFrameworkCore.Migrations;
-using IdentityOIDCWebApplicationSample.Identity.Data;
-
-namespace IdentityOIDCWebApplicationSample.Identity.Data.Migrations
-{
- [DbContext(typeof(IdentityServiceDbContext))]
- partial class IdentityServiceDbContextModelSnapshot : ModelSnapshot
- {
- protected override void BuildModel(ModelBuilder modelBuilder)
- {
- modelBuilder
- .HasAnnotation("ProductVersion", "2.0.0-preview1");
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken();
-
- b.Property("Name")
- .HasMaxLength(256);
-
- b.Property("NormalizedName")
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedName")
- .IsUnique()
- .HasName("RoleNameIndex");
-
- b.ToTable("AspNetRoles");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClaimType");
-
- b.Property("ClaimValue");
-
- b.Property("RoleId")
- .IsRequired();
-
- b.HasKey("Id");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetRoleClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClaimType");
-
- b.Property("ClaimValue");
-
- b.Property("UserId")
- .IsRequired();
-
- b.HasKey("Id");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b =>
- {
- b.Property("LoginProvider");
-
- b.Property("ProviderKey");
-
- b.Property("ProviderDisplayName");
-
- b.Property("UserId")
- .IsRequired();
-
- b.HasKey("LoginProvider", "ProviderKey");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserLogins");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b =>
- {
- b.Property("UserId");
-
- b.Property("RoleId");
-
- b.HasKey("UserId", "RoleId");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetUserRoles");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b =>
- {
- b.Property("UserId");
-
- b.Property("LoginProvider");
-
- b.Property("Name");
-
- b.Property("Value");
-
- b.HasKey("UserId", "LoginProvider", "Name");
-
- b.ToTable("AspNetUserTokens");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplication", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ClientId")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("ClientSecretHash");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken();
-
- b.Property("Name")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("UserId");
-
- b.HasKey("Id");
-
- b.HasIndex("ClientId")
- .IsUnique()
- .HasName("ClientIdIndex");
-
- b.HasIndex("Name")
- .IsUnique()
- .HasName("NameIndex");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetApplications");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceApplicationClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ApplicationId")
- .IsRequired();
-
- b.Property("ClaimType")
- .IsRequired()
- .HasMaxLength(256);
-
- b.Property("ClaimValue")
- .IsRequired()
- .HasMaxLength(256);
-
- b.HasKey("Id");
-
- b.HasIndex("ApplicationId");
-
- b.ToTable("AspNetApplicationClaims");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.Service.IdentityServiceRedirectUri", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd();
-
- b.Property("ApplicationId")
- .IsRequired();
-
- b.Property