+ support for response_mode=form_post and

new Hook in OAuthAuthorizationServerProvider: OnAuthorizationEndpointResponse
This commit is contained in:
manfredsteyer 2014-04-21 17:19:24 +02:00 коммит произвёл Chris Ross
Родитель d0fbf8fc45
Коммит d9ed49eb5c
11 изменённых файлов: 1768 добавлений и 1421 удалений

Просмотреть файл

@ -1,439 +1,439 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2013
VisualStudioVersion = 12.0.21005.1 VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Build", ".Build", "{D425FDFA-90FC-4276-8CBD-2850E8D78656}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Build", ".Build", "{D425FDFA-90FC-4276-8CBD-2850E8D78656}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
LICENSE.txt = LICENSE.txt LICENSE.txt = LICENSE.txt
NOTICE.txt = NOTICE.txt NOTICE.txt = NOTICE.txt
README.md = README.md README.md = README.md
Settings.StyleCop = Settings.StyleCop Settings.StyleCop = Settings.StyleCop
EndProjectSection EndProjectSection
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{69D0ABFE-1C8A-4CFD-AF3A-D71445AEE6BF}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{69D0ABFE-1C8A-4CFD-AF3A-D71445AEE6BF}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
build\_apply-net45-changes.shade = build\_apply-net45-changes.shade build\_apply-net45-changes.shade = build\_apply-net45-changes.shade
build.cmd = build.cmd build.cmd = build.cmd
build.sh = build.sh build.sh = build.sh
build\CodeAnalysis.ruleset = build\CodeAnalysis.ruleset build\CodeAnalysis.ruleset = build\CodeAnalysis.ruleset
build\Common.targets = build\Common.targets build\Common.targets = build\Common.targets
build\CommonAssemblyInfo.cs = build\CommonAssemblyInfo.cs build\CommonAssemblyInfo.cs = build\CommonAssemblyInfo.cs
build\CustomDictionary.xml = build\CustomDictionary.xml build\CustomDictionary.xml = build\CustomDictionary.xml
build\DevAssemblyInfo.cs = build\DevAssemblyInfo.cs build\DevAssemblyInfo.cs = build\DevAssemblyInfo.cs
build\Katana.version.targets = build\Katana.version.targets build\Katana.version.targets = build\Katana.version.targets
build\Sakefile.shade = build\Sakefile.shade build\Sakefile.shade = build\Sakefile.shade
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Hosting.Tests", "tests\Microsoft.Owin.Hosting.Tests\Microsoft.Owin.Hosting.Tests.csproj", "{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Hosting.Tests", "tests\Microsoft.Owin.Hosting.Tests\Microsoft.Owin.Hosting.Tests.csproj", "{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.HttpListener.Tests", "tests\Microsoft.Owin.Host.HttpListener.Tests\Microsoft.Owin.Host.HttpListener.Tests.csproj", "{A8FB7DCB-3370-4D2F-B41A-63C89D281A51}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.HttpListener.Tests", "tests\Microsoft.Owin.Host.HttpListener.Tests\Microsoft.Owin.Host.HttpListener.Tests.csproj", "{A8FB7DCB-3370-4D2F-B41A-63C89D281A51}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Container", "Container", "{6F8D172A-4830-4ACB-BF0A-C82A5668A2CC}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Container", "Container", "{6F8D172A-4830-4ACB-BF0A-C82A5668A2CC}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Capability", "Capability", "{4EC1647A-7297-45BB-8E4A-9D9D8C301B57}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Capability", "Capability", "{4EC1647A-7297-45BB-8E4A-9D9D8C301B57}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Boot.AspNet", "src\Katana.Boot.AspNet\Katana.Boot.AspNet.csproj", "{EE2FDC70-DA4E-448D-9852-E305516DF2DD}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Boot.AspNet", "src\Katana.Boot.AspNet\Katana.Boot.AspNet.csproj", "{EE2FDC70-DA4E-448D-9852-E305516DF2DD}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Middleware", "Middleware", "{ABC8FD67-E4C3-4236-AC51-280551470522}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Middleware", "Middleware", "{ABC8FD67-E4C3-4236-AC51-280551470522}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Performance", "Performance", "{923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Performance", "Performance", "{923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp", "tests\Katana.Performance.ReferenceApp\Katana.Performance.ReferenceApp.csproj", "{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp", "tests\Katana.Performance.ReferenceApp\Katana.Performance.ReferenceApp.csproj", "{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Tests", "tests\Katana.Performance.ReferenceApp.Tests\Katana.Performance.ReferenceApp.Tests.csproj", "{E38930BA-9F12-4609-B97C-55F08200A392}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Tests", "tests\Katana.Performance.ReferenceApp.Tests\Katana.Performance.ReferenceApp.Tests.csproj", "{E38930BA-9F12-4609-B97C-55F08200A392}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.SystemWeb", "src\Microsoft.Owin.Host.SystemWeb\Microsoft.Owin.Host.SystemWeb.csproj", "{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.SystemWeb", "src\Microsoft.Owin.Host.SystemWeb\Microsoft.Owin.Host.SystemWeb.csproj", "{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.HttpListener", "src\Microsoft.Owin.Host.HttpListener\Microsoft.Owin.Host.HttpListener.csproj", "{9F0C72D8-E43F-4F01-9DEB-919191911919}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.HttpListener", "src\Microsoft.Owin.Host.HttpListener\Microsoft.Owin.Host.HttpListener.csproj", "{9F0C72D8-E43F-4F01-9DEB-919191911919}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.SystemWeb.Tests", "tests\Microsoft.Owin.Host.SystemWeb.Tests\Microsoft.Owin.Host.SystemWeb.Tests.csproj", "{9F0C72D8-E43F-4F01-9DEB-919191919191}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.SystemWeb.Tests", "tests\Microsoft.Owin.Host.SystemWeb.Tests\Microsoft.Owin.Host.SystemWeb.Tests.csproj", "{9F0C72D8-E43F-4F01-9DEB-919191919191}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.IntegrationTests", "tests\Microsoft.Owin.Host.IntegrationTests\Microsoft.Owin.Host.IntegrationTests.csproj", "{9F0C72D8-E43F-4F01-9DEB-123412341234}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Host.IntegrationTests", "tests\Microsoft.Owin.Host.IntegrationTests\Microsoft.Owin.Host.IntegrationTests.csproj", "{9F0C72D8-E43F-4F01-9DEB-123412341234}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CertInstaller", "src\Tools\CertificateInstaller\CertInstaller\CertInstaller.csproj", "{558F65BE-E09D-4A9B-9DA8-C0983445726F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CertInstaller", "src\Tools\CertificateInstaller\CertInstaller\CertInstaller.csproj", "{558F65BE-E09D-4A9B-9DA8-C0983445726F}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{47488541-F6D1-4385-AE49-7E3C72042521}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{47488541-F6D1-4385-AE49-7E3C72042521}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Selfhost", "tests\Katana.Performance.ReferenceApp.Selfhost\Katana.Performance.ReferenceApp.Selfhost.csproj", "{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Selfhost", "tests\Katana.Performance.ReferenceApp.Selfhost\Katana.Performance.ReferenceApp.Selfhost.csproj", "{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.StaticFiles", "src\Microsoft.Owin.StaticFiles\Microsoft.Owin.StaticFiles.csproj", "{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.StaticFiles", "src\Microsoft.Owin.StaticFiles\Microsoft.Owin.StaticFiles.csproj", "{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.StaticFiles.Tests", "tests\Microsoft.Owin.StaticFiles.Tests\Microsoft.Owin.StaticFiles.Tests.csproj", "{473F6EEE-455F-4553-953D-5D0736D62D11}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.StaticFiles.Tests", "tests\Microsoft.Owin.StaticFiles.Tests\Microsoft.Owin.StaticFiles.Tests.csproj", "{473F6EEE-455F-4553-953D-5D0736D62D11}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Auth", "src\Microsoft.Owin.Auth\Microsoft.Owin.Auth.csproj", "{970E6B61-1204-422D-A258-BFAB2955243D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Auth", "src\Microsoft.Owin.Auth\Microsoft.Owin.Auth.csproj", "{970E6B61-1204-422D-A258-BFAB2955243D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Auth.Tests", "tests\Microsoft.Owin.Auth.Tests\Microsoft.Owin.Auth.Tests.csproj", "{08B04766-9926-40DD-AEE9-6AA1F185272A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Auth.Tests", "tests\Microsoft.Owin.Auth.Tests\Microsoft.Owin.Auth.Tests.csproj", "{08B04766-9926-40DD-AEE9-6AA1F185272A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Razor.Owin", "src\Microsoft.AspNet.Razor.Owin\Microsoft.AspNet.Razor.Owin.csproj", "{292742D5-D564-49B4-A682-948C3362F655}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Razor.Owin", "src\Microsoft.AspNet.Razor.Owin\Microsoft.AspNet.Razor.Owin.csproj", "{292742D5-D564-49B4-A682-948C3362F655}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Razor.Owin.Tests", "tests\Microsoft.AspNet.Razor.Owin.Tests\Microsoft.AspNet.Razor.Owin.Tests.csproj", "{F2882FE3-6F09-4B52-8592-EE1D127D12F4}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Razor.Owin.Tests", "tests\Microsoft.AspNet.Razor.Owin.Tests\Microsoft.AspNet.Razor.Owin.Tests.csproj", "{F2882FE3-6F09-4B52-8592-EE1D127D12F4}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Testing", "src\Microsoft.Owin.Testing\Microsoft.Owin.Testing.csproj", "{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Testing", "src\Microsoft.Owin.Testing\Microsoft.Owin.Testing.csproj", "{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Diagnostics", "src\Microsoft.Owin.Diagnostics\Microsoft.Owin.Diagnostics.csproj", "{670915F7-F111-42FF-B004-39379A9D5951}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Diagnostics", "src\Microsoft.Owin.Diagnostics\Microsoft.Owin.Diagnostics.csproj", "{670915F7-F111-42FF-B004-39379A9D5951}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Compression", "src\Microsoft.Owin.Compression\Microsoft.Owin.Compression.csproj", "{75BCA849-0F1B-459E-9D63-DD875978EFD0}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Compression", "src\Microsoft.Owin.Compression\Microsoft.Owin.Compression.csproj", "{75BCA849-0F1B-459E-9D63-DD875978EFD0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Compression.Tests", "tests\Microsoft.Owin.Compression.Tests\Microsoft.Owin.Compression.Tests.csproj", "{5634B41F-719D-4210-991C-D29B097376FB}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Compression.Tests", "tests\Microsoft.Owin.Compression.Tests\Microsoft.Owin.Compression.Tests.csproj", "{5634B41F-719D-4210-991C-D29B097376FB}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.FileSystems", "src\Microsoft.Owin.FileSystems\Microsoft.Owin.FileSystems.csproj", "{63988A9B-FA70-4BBA-8C7E-784145384F7C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.FileSystems", "src\Microsoft.Owin.FileSystems\Microsoft.Owin.FileSystems.csproj", "{63988A9B-FA70-4BBA-8C7E-784145384F7C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.FileSystems.Tests", "tests\Microsoft.Owin.FileSystems.Tests\Microsoft.Owin.FileSystems.Tests.csproj", "{5737FA14-B873-496B-8141-49D5B273AC3A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.FileSystems.Tests", "tests\Microsoft.Owin.FileSystems.Tests\Microsoft.Owin.FileSystems.Tests.csproj", "{5737FA14-B873-496B-8141-49D5B273AC3A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Loader.Roslyn", "src\Katana.Loader.Roslyn\Katana.Loader.Roslyn.csproj", "{B8A42E18-F9E8-469B-86CC-30780B1F349C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Loader.Roslyn", "src\Katana.Loader.Roslyn\Katana.Loader.Roslyn.csproj", "{B8A42E18-F9E8-469B-86CC-30780B1F349C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Loader.Roslyn.Tests", "tests\Katana.Loader.Roslyn.Tests\Katana.Loader.Roslyn.Tests.csproj", "{56028FDD-DBD0-4A92-BE58-282105FA3C2A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Loader.Roslyn.Tests", "tests\Katana.Loader.Roslyn.Tests\Katana.Loader.Roslyn.Tests.csproj", "{56028FDD-DBD0-4A92-BE58-282105FA3C2A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Throttling", "src\Microsoft.Owin.Throttling\Microsoft.Owin.Throttling.csproj", "{0619D466-A21B-4B64-AC35-89299787DF12}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Throttling", "src\Microsoft.Owin.Throttling\Microsoft.Owin.Throttling.csproj", "{0619D466-A21B-4B64-AC35-89299787DF12}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Throttling.Tests", "tests\Microsoft.Owin.Throttling.Tests\Microsoft.Owin.Throttling.Tests.csproj", "{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Throttling.Tests", "tests\Microsoft.Owin.Throttling.Tests\Microsoft.Owin.Throttling.Tests.csproj", "{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Prerelease", ".Prerelease", "{A7292674-B84F-4D30-9E2D-C4885AF20608}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Prerelease", ".Prerelease", "{A7292674-B84F-4D30-9E2D-C4885AF20608}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hosting", "Hosting", "{B9AC3489-752E-4C4E-84E4-1C82227435BA}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hosting", "Hosting", "{B9AC3489-752E-4C4E-84E4-1C82227435BA}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Development", "Development", "{E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Development", "Development", "{E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Security", "Security", "{10A4935F-4C17-44ED-BB00-D044FC7C77B8}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Security", "Security", "{10A4935F-4C17-44ED-BB00-D044FC7C77B8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Cookies", "src\Microsoft.Owin.Security.Cookies\Microsoft.Owin.Security.Cookies.csproj", "{2FB9342F-CA85-4903-8667-45ED64AD25A6}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Cookies", "src\Microsoft.Owin.Security.Cookies\Microsoft.Owin.Security.Cookies.csproj", "{2FB9342F-CA85-4903-8667-45ED64AD25A6}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security", "src\Microsoft.Owin.Security\Microsoft.Owin.Security.csproj", "{AAAF8157-1E33-4D6C-8319-3B304D018005}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security", "src\Microsoft.Owin.Security\Microsoft.Owin.Security.csproj", "{AAAF8157-1E33-4D6C-8319-3B304D018005}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Tests", "tests\Microsoft.Owin.Security.Tests\Microsoft.Owin.Security.Tests.csproj", "{E3B9A023-2146-4D9D-A806-1479683078AE}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Tests", "tests\Microsoft.Owin.Security.Tests\Microsoft.Owin.Security.Tests.csproj", "{E3B9A023-2146-4D9D-A806-1479683078AE}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Facebook", "src\Microsoft.Owin.Security.Facebook\Microsoft.Owin.Security.Facebook.csproj", "{F6F1D34F-3AF6-41DD-B493-60899F959BBA}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Facebook", "src\Microsoft.Owin.Security.Facebook\Microsoft.Owin.Security.Facebook.csproj", "{F6F1D34F-3AF6-41DD-B493-60899F959BBA}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Google", "src\Microsoft.Owin.Security.Google\Microsoft.Owin.Security.Google.csproj", "{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Google", "src\Microsoft.Owin.Security.Google\Microsoft.Owin.Security.Google.csproj", "{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.OAuth", "src\Microsoft.Owin.Security.OAuth\Microsoft.Owin.Security.OAuth.csproj", "{F71E48D0-115A-4105-B332-FCCB2139DC23}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.OAuth", "src\Microsoft.Owin.Security.OAuth\Microsoft.Owin.Security.OAuth.csproj", "{F71E48D0-115A-4105-B332-FCCB2139DC23}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sandbox", "Sandbox", "{D067FB54-B69D-4502-8E2F-676271AC4B86}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sandbox", "Sandbox", "{D067FB54-B69D-4502-8E2F-676271AC4B86}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Sandbox.WebServer", "tests\Katana.Sandbox.WebServer\Katana.Sandbox.WebServer.csproj", "{1069B86E-F2C1-498B-9DD8-76C7257C6A2A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Sandbox.WebServer", "tests\Katana.Sandbox.WebServer\Katana.Sandbox.WebServer.csproj", "{1069B86E-F2C1-498B-9DD8-76C7257C6A2A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Sandbox.WebClient", "tests\Katana.Sandbox.WebClient\Katana.Sandbox.WebClient.csproj", "{3AE67011-EBB1-4ADE-8F42-8E90EB884219}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Sandbox.WebClient", "tests\Katana.Sandbox.WebClient\Katana.Sandbox.WebClient.csproj", "{3AE67011-EBB1-4ADE-8F42-8E90EB884219}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OwinHost", "src\OwinHost\OwinHost.csproj", "{D56B8357-F044-45DE-85E9-41AA7C84751E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OwinHost", "src\OwinHost\OwinHost.csproj", "{D56B8357-F044-45DE-85E9-41AA7C84751E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OwinHost.Tests", "tests\OwinHost.Tests\OwinHost.Tests.csproj", "{62ACEFEA-39F8-405E-BC25-0633F1770A4B}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OwinHost.Tests", "tests\OwinHost.Tests\OwinHost.Tests.csproj", "{62ACEFEA-39F8-405E-BC25-0633F1770A4B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin", "src\Microsoft.Owin\Microsoft.Owin.csproj", "{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin", "src\Microsoft.Owin\Microsoft.Owin.csproj", "{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Owin.Loader", "src\Owin.Loader\Owin.Loader.csproj", "{DF967ED4-C320-421C-859C-81034EFF615E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Owin.Loader", "src\Owin.Loader\Owin.Loader.csproj", "{DF967ED4-C320-421C-859C-81034EFF615E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Tests", "tests\Microsoft.Owin.Tests\Microsoft.Owin.Tests.csproj", "{0AF835A6-8181-46DB-A17E-C765FA07A5A0}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Tests", "tests\Microsoft.Owin.Tests\Microsoft.Owin.Tests.csproj", "{0AF835A6-8181-46DB-A17E-C765FA07A5A0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Owin.Loader.Tests", "tests\Owin.Loader.Tests\Owin.Loader.Tests.csproj", "{13785347-FC73-4D0E-9DCA-300DD87C308E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Owin.Loader.Tests", "tests\Owin.Loader.Tests\Owin.Loader.Tests.csproj", "{13785347-FC73-4D0E-9DCA-300DD87C308E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Twitter", "src\Microsoft.Owin.Security.Twitter\Microsoft.Owin.Security.Twitter.csproj", "{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Twitter", "src\Microsoft.Owin.Security.Twitter\Microsoft.Owin.Security.Twitter.csproj", "{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.MicrosoftAccount", "src\Microsoft.Owin.Security.MicrosoftAccount\Microsoft.Owin.Security.MicrosoftAccount.csproj", "{52F6930F-FBC0-404B-B135-6B6756F5713A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.MicrosoftAccount", "src\Microsoft.Owin.Security.MicrosoftAccount\Microsoft.Owin.Security.MicrosoftAccount.csproj", "{52F6930F-FBC0-404B-B135-6B6756F5713A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Owin.SelfHost", "Microsoft.Owin.SelfHost", "{9298DB20-54F3-4078-8F7F-D95B3CFA1312}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft.Owin.SelfHost", "Microsoft.Owin.SelfHost", "{9298DB20-54F3-4078-8F7F-D95B3CFA1312}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
src\Microsoft.Owin.SelfHost\Microsoft.Owin.SelfHost.nuspec = src\Microsoft.Owin.SelfHost\Microsoft.Owin.SelfHost.nuspec src\Microsoft.Owin.SelfHost\Microsoft.Owin.SelfHost.nuspec = src\Microsoft.Owin.SelfHost\Microsoft.Owin.SelfHost.nuspec
src\Microsoft.Owin.SelfHost\ReadMe.txt = src\Microsoft.Owin.SelfHost\ReadMe.txt src\Microsoft.Owin.SelfHost\ReadMe.txt = src\Microsoft.Owin.SelfHost\ReadMe.txt
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Hosting", "src\Microsoft.Owin.Hosting\Microsoft.Owin.Hosting.csproj", "{C225EB2F-E7A7-463F-B058-1705F204978E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Hosting", "src\Microsoft.Owin.Hosting\Microsoft.Owin.Hosting.csproj", "{C225EB2F-E7A7-463F-B058-1705F204978E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Testing.Tests", "tests\Microsoft.Owin.Testing.Tests\Microsoft.Owin.Testing.Tests.csproj", "{628A8C89-5E59-4747-8D6A-AA22267552ED}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Testing.Tests", "tests\Microsoft.Owin.Testing.Tests\Microsoft.Owin.Testing.Tests.csproj", "{628A8C89-5E59-4747-8D6A-AA22267552ED}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Middleware", "Middleware", "{C5F4B293-90EC-48B8-97FA-CD23C44C9C30}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Middleware", "Middleware", "{C5F4B293-90EC-48B8-97FA-CD23C44C9C30}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Cors", "src\Microsoft.Owin.Cors\Microsoft.Owin.Cors.csproj", "{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Cors", "src\Microsoft.Owin.Cors\Microsoft.Owin.Cors.csproj", "{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Cors.Tests", "tests\Microsoft.Owin.Cors.Tests\Microsoft.Owin.Cors.Tests.csproj", "{3DDAC01B-2567-4C0C-88E1-0A716729203E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Cors.Tests", "tests\Microsoft.Owin.Cors.Tests\Microsoft.Owin.Cors.Tests.csproj", "{3DDAC01B-2567-4C0C-88E1-0A716729203E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Client", "tests\Katana.Performance.ReferenceApp.Client\Katana.Performance.ReferenceApp.Client.csproj", "{0D370C5B-7518-4D60-9D47-1AD59794F38F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katana.Performance.ReferenceApp.Client", "tests\Katana.Performance.ReferenceApp.Client\Katana.Performance.ReferenceApp.Client.csproj", "{0D370C5B-7518-4D60-9D47-1AD59794F38F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Jwt", "src\Microsoft.Owin.Security.Jwt\Microsoft.Owin.Security.Jwt.csproj", "{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.Jwt", "src\Microsoft.Owin.Security.Jwt\Microsoft.Owin.Security.Jwt.csproj", "{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.ActiveDirectory", "src\Microsoft.Owin.Security.ActiveDirectory\Microsoft.Owin.Security.ActiveDirectory.csproj", "{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.ActiveDirectory", "src\Microsoft.Owin.Security.ActiveDirectory\Microsoft.Owin.Security.ActiveDirectory.csproj", "{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Nuget", ".Nuget", "{5230439B-C2AD-4A08-8927-526BA3BF9BF6}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Nuget", ".Nuget", "{5230439B-C2AD-4A08-8927-526BA3BF9BF6}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.nuget\NuGet.Config = .nuget\NuGet.Config .nuget\NuGet.Config = .nuget\NuGet.Config
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.WsFederation", "src\Microsoft.Owin.Security.WsFederation\Microsoft.Owin.Security.WsFederation.csproj", "{23D90C94-647A-416C-9227-9A0779401EBC}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.WsFederation", "src\Microsoft.Owin.Security.WsFederation\Microsoft.Owin.Security.WsFederation.csproj", "{23D90C94-647A-416C-9227-9A0779401EBC}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.OpenIdConnect", "src\Microsoft.Owin.Security.OpenIdConnect\Microsoft.Owin.Security.OpenIdConnect.csproj", "{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Owin.Security.OpenIdConnect", "src\Microsoft.Owin.Security.OpenIdConnect\Microsoft.Owin.Security.OpenIdConnect.csproj", "{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Debug|Any CPU.Build.0 = Debug|Any CPU {D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Release|Any CPU.ActiveCfg = Release|Any CPU {D74769C3-CC85-440E-BDB8-9B20BFBFDDAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8FB7DCB-3370-4D2F-B41A-63C89D281A51}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Release|Any CPU.Build.0 = Release|Any CPU {EE2FDC70-DA4E-448D-9852-E305516DF2DD}.Release|Any CPU.Build.0 = Release|Any CPU
{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Debug|Any CPU.Build.0 = Debug|Any CPU {C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Release|Any CPU.ActiveCfg = Release|Any CPU {C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Release|Any CPU.Build.0 = Release|Any CPU {C232AB29-2F3C-4E18-9234-67B1C70CDAD5}.Release|Any CPU.Build.0 = Release|Any CPU
{E38930BA-9F12-4609-B97C-55F08200A392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E38930BA-9F12-4609-B97C-55F08200A392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E38930BA-9F12-4609-B97C-55F08200A392}.Debug|Any CPU.Build.0 = Debug|Any CPU {E38930BA-9F12-4609-B97C-55F08200A392}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E38930BA-9F12-4609-B97C-55F08200A392}.Release|Any CPU.ActiveCfg = Release|Any CPU {E38930BA-9F12-4609-B97C-55F08200A392}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E38930BA-9F12-4609-B97C-55F08200A392}.Release|Any CPU.Build.0 = Release|Any CPU {E38930BA-9F12-4609-B97C-55F08200A392}.Release|Any CPU.Build.0 = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Release|Any CPU.Build.0 = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E}.Release|Any CPU.Build.0 = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191911919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191911919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191911919}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191911919}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191911919}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191911919}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191911919}.Release|Any CPU.Build.0 = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191911919}.Release|Any CPU.Build.0 = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191919191}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191919191}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191919191}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191919191}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-919191919191}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-919191919191}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-123412341234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-123412341234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-123412341234}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F0C72D8-E43F-4F01-9DEB-123412341234}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9F0C72D8-E43F-4F01-9DEB-123412341234}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-123412341234}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F0C72D8-E43F-4F01-9DEB-123412341234}.Release|Any CPU.Build.0 = Release|Any CPU {9F0C72D8-E43F-4F01-9DEB-123412341234}.Release|Any CPU.Build.0 = Release|Any CPU
{558F65BE-E09D-4A9B-9DA8-C0983445726F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {558F65BE-E09D-4A9B-9DA8-C0983445726F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{558F65BE-E09D-4A9B-9DA8-C0983445726F}.Debug|Any CPU.Build.0 = Debug|Any CPU {558F65BE-E09D-4A9B-9DA8-C0983445726F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{558F65BE-E09D-4A9B-9DA8-C0983445726F}.Release|Any CPU.ActiveCfg = Release|Any CPU {558F65BE-E09D-4A9B-9DA8-C0983445726F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{558F65BE-E09D-4A9B-9DA8-C0983445726F}.Release|Any CPU.Build.0 = Release|Any CPU {558F65BE-E09D-4A9B-9DA8-C0983445726F}.Release|Any CPU.Build.0 = Release|Any CPU
{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Debug|Any CPU.Build.0 = Debug|Any CPU {8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Release|Any CPU.ActiveCfg = Release|Any CPU {8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Release|Any CPU.Build.0 = Release|Any CPU {8AE2E716-258A-4EF3-ADF1-D3B75D677F29}.Release|Any CPU.Build.0 = Release|Any CPU
{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Debug|Any CPU.Build.0 = Debug|Any CPU {F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Release|Any CPU.ActiveCfg = Release|Any CPU {F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Release|Any CPU.Build.0 = Release|Any CPU {F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82}.Release|Any CPU.Build.0 = Release|Any CPU
{473F6EEE-455F-4553-953D-5D0736D62D11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {473F6EEE-455F-4553-953D-5D0736D62D11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{473F6EEE-455F-4553-953D-5D0736D62D11}.Debug|Any CPU.Build.0 = Debug|Any CPU {473F6EEE-455F-4553-953D-5D0736D62D11}.Debug|Any CPU.Build.0 = Debug|Any CPU
{473F6EEE-455F-4553-953D-5D0736D62D11}.Release|Any CPU.ActiveCfg = Release|Any CPU {473F6EEE-455F-4553-953D-5D0736D62D11}.Release|Any CPU.ActiveCfg = Release|Any CPU
{473F6EEE-455F-4553-953D-5D0736D62D11}.Release|Any CPU.Build.0 = Release|Any CPU {473F6EEE-455F-4553-953D-5D0736D62D11}.Release|Any CPU.Build.0 = Release|Any CPU
{970E6B61-1204-422D-A258-BFAB2955243D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {970E6B61-1204-422D-A258-BFAB2955243D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{970E6B61-1204-422D-A258-BFAB2955243D}.Debug|Any CPU.Build.0 = Debug|Any CPU {970E6B61-1204-422D-A258-BFAB2955243D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{970E6B61-1204-422D-A258-BFAB2955243D}.Release|Any CPU.ActiveCfg = Release|Any CPU {970E6B61-1204-422D-A258-BFAB2955243D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{970E6B61-1204-422D-A258-BFAB2955243D}.Release|Any CPU.Build.0 = Release|Any CPU {970E6B61-1204-422D-A258-BFAB2955243D}.Release|Any CPU.Build.0 = Release|Any CPU
{08B04766-9926-40DD-AEE9-6AA1F185272A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08B04766-9926-40DD-AEE9-6AA1F185272A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08B04766-9926-40DD-AEE9-6AA1F185272A}.Debug|Any CPU.Build.0 = Debug|Any CPU {08B04766-9926-40DD-AEE9-6AA1F185272A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08B04766-9926-40DD-AEE9-6AA1F185272A}.Release|Any CPU.ActiveCfg = Release|Any CPU {08B04766-9926-40DD-AEE9-6AA1F185272A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08B04766-9926-40DD-AEE9-6AA1F185272A}.Release|Any CPU.Build.0 = Release|Any CPU {08B04766-9926-40DD-AEE9-6AA1F185272A}.Release|Any CPU.Build.0 = Release|Any CPU
{292742D5-D564-49B4-A682-948C3362F655}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {292742D5-D564-49B4-A682-948C3362F655}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{292742D5-D564-49B4-A682-948C3362F655}.Debug|Any CPU.Build.0 = Debug|Any CPU {292742D5-D564-49B4-A682-948C3362F655}.Debug|Any CPU.Build.0 = Debug|Any CPU
{292742D5-D564-49B4-A682-948C3362F655}.Release|Any CPU.ActiveCfg = Release|Any CPU {292742D5-D564-49B4-A682-948C3362F655}.Release|Any CPU.ActiveCfg = Release|Any CPU
{292742D5-D564-49B4-A682-948C3362F655}.Release|Any CPU.Build.0 = Release|Any CPU {292742D5-D564-49B4-A682-948C3362F655}.Release|Any CPU.Build.0 = Release|Any CPU
{F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {F2882FE3-6F09-4B52-8592-EE1D127D12F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Debug|Any CPU.Build.0 = Debug|Any CPU {73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Release|Any CPU.ActiveCfg = Release|Any CPU {73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Release|Any CPU.Build.0 = Release|Any CPU {73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0}.Release|Any CPU.Build.0 = Release|Any CPU
{670915F7-F111-42FF-B004-39379A9D5951}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {670915F7-F111-42FF-B004-39379A9D5951}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{670915F7-F111-42FF-B004-39379A9D5951}.Debug|Any CPU.Build.0 = Debug|Any CPU {670915F7-F111-42FF-B004-39379A9D5951}.Debug|Any CPU.Build.0 = Debug|Any CPU
{670915F7-F111-42FF-B004-39379A9D5951}.Release|Any CPU.ActiveCfg = Release|Any CPU {670915F7-F111-42FF-B004-39379A9D5951}.Release|Any CPU.ActiveCfg = Release|Any CPU
{670915F7-F111-42FF-B004-39379A9D5951}.Release|Any CPU.Build.0 = Release|Any CPU {670915F7-F111-42FF-B004-39379A9D5951}.Release|Any CPU.Build.0 = Release|Any CPU
{75BCA849-0F1B-459E-9D63-DD875978EFD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75BCA849-0F1B-459E-9D63-DD875978EFD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75BCA849-0F1B-459E-9D63-DD875978EFD0}.Debug|Any CPU.Build.0 = Debug|Any CPU {75BCA849-0F1B-459E-9D63-DD875978EFD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75BCA849-0F1B-459E-9D63-DD875978EFD0}.Release|Any CPU.ActiveCfg = Release|Any CPU {75BCA849-0F1B-459E-9D63-DD875978EFD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{75BCA849-0F1B-459E-9D63-DD875978EFD0}.Release|Any CPU.Build.0 = Release|Any CPU {75BCA849-0F1B-459E-9D63-DD875978EFD0}.Release|Any CPU.Build.0 = Release|Any CPU
{5634B41F-719D-4210-991C-D29B097376FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5634B41F-719D-4210-991C-D29B097376FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5634B41F-719D-4210-991C-D29B097376FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {5634B41F-719D-4210-991C-D29B097376FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5634B41F-719D-4210-991C-D29B097376FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {5634B41F-719D-4210-991C-D29B097376FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5634B41F-719D-4210-991C-D29B097376FB}.Release|Any CPU.Build.0 = Release|Any CPU {5634B41F-719D-4210-991C-D29B097376FB}.Release|Any CPU.Build.0 = Release|Any CPU
{63988A9B-FA70-4BBA-8C7E-784145384F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63988A9B-FA70-4BBA-8C7E-784145384F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{63988A9B-FA70-4BBA-8C7E-784145384F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {63988A9B-FA70-4BBA-8C7E-784145384F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63988A9B-FA70-4BBA-8C7E-784145384F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {63988A9B-FA70-4BBA-8C7E-784145384F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63988A9B-FA70-4BBA-8C7E-784145384F7C}.Release|Any CPU.Build.0 = Release|Any CPU {63988A9B-FA70-4BBA-8C7E-784145384F7C}.Release|Any CPU.Build.0 = Release|Any CPU
{5737FA14-B873-496B-8141-49D5B273AC3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5737FA14-B873-496B-8141-49D5B273AC3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5737FA14-B873-496B-8141-49D5B273AC3A}.Debug|Any CPU.Build.0 = Debug|Any CPU {5737FA14-B873-496B-8141-49D5B273AC3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5737FA14-B873-496B-8141-49D5B273AC3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {5737FA14-B873-496B-8141-49D5B273AC3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5737FA14-B873-496B-8141-49D5B273AC3A}.Release|Any CPU.Build.0 = Release|Any CPU {5737FA14-B873-496B-8141-49D5B273AC3A}.Release|Any CPU.Build.0 = Release|Any CPU
{B8A42E18-F9E8-469B-86CC-30780B1F349C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8A42E18-F9E8-469B-86CC-30780B1F349C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8A42E18-F9E8-469B-86CC-30780B1F349C}.Debug|Any CPU.Build.0 = Debug|Any CPU {B8A42E18-F9E8-469B-86CC-30780B1F349C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8A42E18-F9E8-469B-86CC-30780B1F349C}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8A42E18-F9E8-469B-86CC-30780B1F349C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8A42E18-F9E8-469B-86CC-30780B1F349C}.Release|Any CPU.Build.0 = Release|Any CPU {B8A42E18-F9E8-469B-86CC-30780B1F349C}.Release|Any CPU.Build.0 = Release|Any CPU
{56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Debug|Any CPU.Build.0 = Debug|Any CPU {56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Release|Any CPU.ActiveCfg = Release|Any CPU {56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Release|Any CPU.Build.0 = Release|Any CPU {56028FDD-DBD0-4A92-BE58-282105FA3C2A}.Release|Any CPU.Build.0 = Release|Any CPU
{0619D466-A21B-4B64-AC35-89299787DF12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0619D466-A21B-4B64-AC35-89299787DF12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0619D466-A21B-4B64-AC35-89299787DF12}.Debug|Any CPU.Build.0 = Debug|Any CPU {0619D466-A21B-4B64-AC35-89299787DF12}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0619D466-A21B-4B64-AC35-89299787DF12}.Release|Any CPU.ActiveCfg = Release|Any CPU {0619D466-A21B-4B64-AC35-89299787DF12}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0619D466-A21B-4B64-AC35-89299787DF12}.Release|Any CPU.Build.0 = Release|Any CPU {0619D466-A21B-4B64-AC35-89299787DF12}.Release|Any CPU.Build.0 = Release|Any CPU
{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Debug|Any CPU.Build.0 = Debug|Any CPU {AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Release|Any CPU.ActiveCfg = Release|Any CPU {AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Release|Any CPU.Build.0 = Release|Any CPU {AAD8D4BF-9EA1-4662-B96D-0956BB21F718}.Release|Any CPU.Build.0 = Release|Any CPU
{2FB9342F-CA85-4903-8667-45ED64AD25A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2FB9342F-CA85-4903-8667-45ED64AD25A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2FB9342F-CA85-4903-8667-45ED64AD25A6}.Debug|Any CPU.Build.0 = Debug|Any CPU {2FB9342F-CA85-4903-8667-45ED64AD25A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2FB9342F-CA85-4903-8667-45ED64AD25A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2FB9342F-CA85-4903-8667-45ED64AD25A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2FB9342F-CA85-4903-8667-45ED64AD25A6}.Release|Any CPU.Build.0 = Release|Any CPU {2FB9342F-CA85-4903-8667-45ED64AD25A6}.Release|Any CPU.Build.0 = Release|Any CPU
{AAAF8157-1E33-4D6C-8319-3B304D018005}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AAAF8157-1E33-4D6C-8319-3B304D018005}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AAAF8157-1E33-4D6C-8319-3B304D018005}.Debug|Any CPU.Build.0 = Debug|Any CPU {AAAF8157-1E33-4D6C-8319-3B304D018005}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AAAF8157-1E33-4D6C-8319-3B304D018005}.Release|Any CPU.ActiveCfg = Release|Any CPU {AAAF8157-1E33-4D6C-8319-3B304D018005}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AAAF8157-1E33-4D6C-8319-3B304D018005}.Release|Any CPU.Build.0 = Release|Any CPU {AAAF8157-1E33-4D6C-8319-3B304D018005}.Release|Any CPU.Build.0 = Release|Any CPU
{E3B9A023-2146-4D9D-A806-1479683078AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E3B9A023-2146-4D9D-A806-1479683078AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E3B9A023-2146-4D9D-A806-1479683078AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3B9A023-2146-4D9D-A806-1479683078AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E3B9A023-2146-4D9D-A806-1479683078AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {E3B9A023-2146-4D9D-A806-1479683078AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E3B9A023-2146-4D9D-A806-1479683078AE}.Release|Any CPU.Build.0 = Release|Any CPU {E3B9A023-2146-4D9D-A806-1479683078AE}.Release|Any CPU.Build.0 = Release|Any CPU
{F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Debug|Any CPU.Build.0 = Debug|Any CPU {F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Release|Any CPU.ActiveCfg = Release|Any CPU {F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Release|Any CPU.Build.0 = Release|Any CPU {F6F1D34F-3AF6-41DD-B493-60899F959BBA}.Release|Any CPU.Build.0 = Release|Any CPU
{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Debug|Any CPU.Build.0 = Debug|Any CPU {1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Release|Any CPU.ActiveCfg = Release|Any CPU {1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Release|Any CPU.Build.0 = Release|Any CPU {1F46BC62-A011-4B63-A5C6-51AEE2EF538D}.Release|Any CPU.Build.0 = Release|Any CPU
{F71E48D0-115A-4105-B332-FCCB2139DC23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F71E48D0-115A-4105-B332-FCCB2139DC23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F71E48D0-115A-4105-B332-FCCB2139DC23}.Debug|Any CPU.Build.0 = Debug|Any CPU {F71E48D0-115A-4105-B332-FCCB2139DC23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F71E48D0-115A-4105-B332-FCCB2139DC23}.Release|Any CPU.ActiveCfg = Release|Any CPU {F71E48D0-115A-4105-B332-FCCB2139DC23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F71E48D0-115A-4105-B332-FCCB2139DC23}.Release|Any CPU.Build.0 = Release|Any CPU {F71E48D0-115A-4105-B332-FCCB2139DC23}.Release|Any CPU.Build.0 = Release|Any CPU
{1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Release|Any CPU.ActiveCfg = Release|Any CPU {1069B86E-F2C1-498B-9DD8-76C7257C6A2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Debug|Any CPU.Build.0 = Debug|Any CPU {3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Release|Any CPU.ActiveCfg = Release|Any CPU {3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Release|Any CPU.Build.0 = Release|Any CPU {3AE67011-EBB1-4ADE-8F42-8E90EB884219}.Release|Any CPU.Build.0 = Release|Any CPU
{D56B8357-F044-45DE-85E9-41AA7C84751E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D56B8357-F044-45DE-85E9-41AA7C84751E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D56B8357-F044-45DE-85E9-41AA7C84751E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D56B8357-F044-45DE-85E9-41AA7C84751E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D56B8357-F044-45DE-85E9-41AA7C84751E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D56B8357-F044-45DE-85E9-41AA7C84751E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D56B8357-F044-45DE-85E9-41AA7C84751E}.Release|Any CPU.Build.0 = Release|Any CPU {D56B8357-F044-45DE-85E9-41AA7C84751E}.Release|Any CPU.Build.0 = Release|Any CPU
{62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU {62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU {62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Release|Any CPU.Build.0 = Release|Any CPU {62ACEFEA-39F8-405E-BC25-0633F1770A4B}.Release|Any CPU.Build.0 = Release|Any CPU
{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Release|Any CPU.Build.0 = Release|Any CPU {0DB69CAE-B0BC-4688-9467-66B4C1023D3F}.Release|Any CPU.Build.0 = Release|Any CPU
{DF967ED4-C320-421C-859C-81034EFF615E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DF967ED4-C320-421C-859C-81034EFF615E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF967ED4-C320-421C-859C-81034EFF615E}.Debug|Any CPU.Build.0 = Debug|Any CPU {DF967ED4-C320-421C-859C-81034EFF615E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF967ED4-C320-421C-859C-81034EFF615E}.Release|Any CPU.ActiveCfg = Release|Any CPU {DF967ED4-C320-421C-859C-81034EFF615E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF967ED4-C320-421C-859C-81034EFF615E}.Release|Any CPU.Build.0 = Release|Any CPU {DF967ED4-C320-421C-859C-81034EFF615E}.Release|Any CPU.Build.0 = Release|Any CPU
{0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Release|Any CPU.Build.0 = Release|Any CPU {0AF835A6-8181-46DB-A17E-C765FA07A5A0}.Release|Any CPU.Build.0 = Release|Any CPU
{13785347-FC73-4D0E-9DCA-300DD87C308E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {13785347-FC73-4D0E-9DCA-300DD87C308E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{13785347-FC73-4D0E-9DCA-300DD87C308E}.Debug|Any CPU.Build.0 = Debug|Any CPU {13785347-FC73-4D0E-9DCA-300DD87C308E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13785347-FC73-4D0E-9DCA-300DD87C308E}.Release|Any CPU.ActiveCfg = Release|Any CPU {13785347-FC73-4D0E-9DCA-300DD87C308E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13785347-FC73-4D0E-9DCA-300DD87C308E}.Release|Any CPU.Build.0 = Release|Any CPU {13785347-FC73-4D0E-9DCA-300DD87C308E}.Release|Any CPU.Build.0 = Release|Any CPU
{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Debug|Any CPU.Build.0 = Debug|Any CPU {BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Release|Any CPU.ActiveCfg = Release|Any CPU {BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Release|Any CPU.Build.0 = Release|Any CPU {BBB663CB-E6A2-4E23-83C9-9C8F52325F44}.Release|Any CPU.Build.0 = Release|Any CPU
{52F6930F-FBC0-404B-B135-6B6756F5713A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {52F6930F-FBC0-404B-B135-6B6756F5713A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{52F6930F-FBC0-404B-B135-6B6756F5713A}.Debug|Any CPU.Build.0 = Debug|Any CPU {52F6930F-FBC0-404B-B135-6B6756F5713A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{52F6930F-FBC0-404B-B135-6B6756F5713A}.Release|Any CPU.ActiveCfg = Release|Any CPU {52F6930F-FBC0-404B-B135-6B6756F5713A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{52F6930F-FBC0-404B-B135-6B6756F5713A}.Release|Any CPU.Build.0 = Release|Any CPU {52F6930F-FBC0-404B-B135-6B6756F5713A}.Release|Any CPU.Build.0 = Release|Any CPU
{C225EB2F-E7A7-463F-B058-1705F204978E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C225EB2F-E7A7-463F-B058-1705F204978E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C225EB2F-E7A7-463F-B058-1705F204978E}.Debug|Any CPU.Build.0 = Debug|Any CPU {C225EB2F-E7A7-463F-B058-1705F204978E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C225EB2F-E7A7-463F-B058-1705F204978E}.Release|Any CPU.ActiveCfg = Release|Any CPU {C225EB2F-E7A7-463F-B058-1705F204978E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C225EB2F-E7A7-463F-B058-1705F204978E}.Release|Any CPU.Build.0 = Release|Any CPU {C225EB2F-E7A7-463F-B058-1705F204978E}.Release|Any CPU.Build.0 = Release|Any CPU
{628A8C89-5E59-4747-8D6A-AA22267552ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {628A8C89-5E59-4747-8D6A-AA22267552ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{628A8C89-5E59-4747-8D6A-AA22267552ED}.Debug|Any CPU.Build.0 = Debug|Any CPU {628A8C89-5E59-4747-8D6A-AA22267552ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{628A8C89-5E59-4747-8D6A-AA22267552ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {628A8C89-5E59-4747-8D6A-AA22267552ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{628A8C89-5E59-4747-8D6A-AA22267552ED}.Release|Any CPU.Build.0 = Release|Any CPU {628A8C89-5E59-4747-8D6A-AA22267552ED}.Release|Any CPU.Build.0 = Release|Any CPU
{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU {CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Release|Any CPU.Build.0 = Release|Any CPU {CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1}.Release|Any CPU.Build.0 = Release|Any CPU
{3DDAC01B-2567-4C0C-88E1-0A716729203E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DDAC01B-2567-4C0C-88E1-0A716729203E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3DDAC01B-2567-4C0C-88E1-0A716729203E}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DDAC01B-2567-4C0C-88E1-0A716729203E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3DDAC01B-2567-4C0C-88E1-0A716729203E}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DDAC01B-2567-4C0C-88E1-0A716729203E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3DDAC01B-2567-4C0C-88E1-0A716729203E}.Release|Any CPU.Build.0 = Release|Any CPU {3DDAC01B-2567-4C0C-88E1-0A716729203E}.Release|Any CPU.Build.0 = Release|Any CPU
{0D370C5B-7518-4D60-9D47-1AD59794F38F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0D370C5B-7518-4D60-9D47-1AD59794F38F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0D370C5B-7518-4D60-9D47-1AD59794F38F}.Debug|Any CPU.Build.0 = Debug|Any CPU {0D370C5B-7518-4D60-9D47-1AD59794F38F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0D370C5B-7518-4D60-9D47-1AD59794F38F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0D370C5B-7518-4D60-9D47-1AD59794F38F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0D370C5B-7518-4D60-9D47-1AD59794F38F}.Release|Any CPU.Build.0 = Release|Any CPU {0D370C5B-7518-4D60-9D47-1AD59794F38F}.Release|Any CPU.Build.0 = Release|Any CPU
{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU {CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Release|Any CPU.Build.0 = Release|Any CPU {CC7E3A76-37B0-4C3D-B666-62DC34F04ABC}.Release|Any CPU.Build.0 = Release|Any CPU
{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Debug|Any CPU.Build.0 = Debug|Any CPU {03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Debug|Any CPU.Build.0 = Debug|Any CPU
{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Release|Any CPU.ActiveCfg = Release|Any CPU {03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Release|Any CPU.ActiveCfg = Release|Any CPU
{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Release|Any CPU.Build.0 = Release|Any CPU {03F2BF9F-BE6C-4DAE-9615-46A7F05EF842}.Release|Any CPU.Build.0 = Release|Any CPU
{23D90C94-647A-416C-9227-9A0779401EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23D90C94-647A-416C-9227-9A0779401EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23D90C94-647A-416C-9227-9A0779401EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU {23D90C94-647A-416C-9227-9A0779401EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23D90C94-647A-416C-9227-9A0779401EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU {23D90C94-647A-416C-9227-9A0779401EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23D90C94-647A-416C-9227-9A0779401EBC}.Release|Any CPU.Build.0 = Release|Any CPU {23D90C94-647A-416C-9227-9A0779401EBC}.Release|Any CPU.Build.0 = Release|Any CPU
{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Release|Any CPU.Build.0 = Release|Any CPU {AA80B4A3-C885-4A7E-AF1A-FC3E89611988}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{69D0ABFE-1C8A-4CFD-AF3A-D71445AEE6BF} = {D425FDFA-90FC-4276-8CBD-2850E8D78656} {69D0ABFE-1C8A-4CFD-AF3A-D71445AEE6BF} = {D425FDFA-90FC-4276-8CBD-2850E8D78656}
{D74769C3-CC85-440E-BDB8-9B20BFBFDDAE} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {D74769C3-CC85-440E-BDB8-9B20BFBFDDAE} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{D56B8357-F044-45DE-85E9-41AA7C84751E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {D56B8357-F044-45DE-85E9-41AA7C84751E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{62ACEFEA-39F8-405E-BC25-0633F1770A4B} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {62ACEFEA-39F8-405E-BC25-0633F1770A4B} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{DF967ED4-C320-421C-859C-81034EFF615E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {DF967ED4-C320-421C-859C-81034EFF615E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{13785347-FC73-4D0E-9DCA-300DD87C308E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {13785347-FC73-4D0E-9DCA-300DD87C308E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{9298DB20-54F3-4078-8F7F-D95B3CFA1312} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {9298DB20-54F3-4078-8F7F-D95B3CFA1312} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{C225EB2F-E7A7-463F-B058-1705F204978E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA} {C225EB2F-E7A7-463F-B058-1705F204978E} = {B9AC3489-752E-4C4E-84E4-1C82227435BA}
{A8FB7DCB-3370-4D2F-B41A-63C89D281A51} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A} {A8FB7DCB-3370-4D2F-B41A-63C89D281A51} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}
{9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A} {9F0C72D8-E43F-4F01-9DEB-9E8FE0AE179E} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}
{9F0C72D8-E43F-4F01-9DEB-919191911919} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A} {9F0C72D8-E43F-4F01-9DEB-919191911919} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}
{9F0C72D8-E43F-4F01-9DEB-919191919191} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A} {9F0C72D8-E43F-4F01-9DEB-919191919191} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}
{9F0C72D8-E43F-4F01-9DEB-123412341234} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A} {9F0C72D8-E43F-4F01-9DEB-123412341234} = {E80B5DAB-7D94-4E26-8A9E-98E5A887A72A}
{4EC1647A-7297-45BB-8E4A-9D9D8C301B57} = {A7292674-B84F-4D30-9E2D-C4885AF20608} {4EC1647A-7297-45BB-8E4A-9D9D8C301B57} = {A7292674-B84F-4D30-9E2D-C4885AF20608}
{6F8D172A-4830-4ACB-BF0A-C82A5668A2CC} = {A7292674-B84F-4D30-9E2D-C4885AF20608} {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC} = {A7292674-B84F-4D30-9E2D-C4885AF20608}
{ABC8FD67-E4C3-4236-AC51-280551470522} = {A7292674-B84F-4D30-9E2D-C4885AF20608} {ABC8FD67-E4C3-4236-AC51-280551470522} = {A7292674-B84F-4D30-9E2D-C4885AF20608}
{47488541-F6D1-4385-AE49-7E3C72042521} = {A7292674-B84F-4D30-9E2D-C4885AF20608} {47488541-F6D1-4385-AE49-7E3C72042521} = {A7292674-B84F-4D30-9E2D-C4885AF20608}
{292742D5-D564-49B4-A682-948C3362F655} = {4EC1647A-7297-45BB-8E4A-9D9D8C301B57} {292742D5-D564-49B4-A682-948C3362F655} = {4EC1647A-7297-45BB-8E4A-9D9D8C301B57}
{F2882FE3-6F09-4B52-8592-EE1D127D12F4} = {4EC1647A-7297-45BB-8E4A-9D9D8C301B57} {F2882FE3-6F09-4B52-8592-EE1D127D12F4} = {4EC1647A-7297-45BB-8E4A-9D9D8C301B57}
{B8A42E18-F9E8-469B-86CC-30780B1F349C} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC} {B8A42E18-F9E8-469B-86CC-30780B1F349C} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC}
{56028FDD-DBD0-4A92-BE58-282105FA3C2A} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC} {56028FDD-DBD0-4A92-BE58-282105FA3C2A} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC}
{EE2FDC70-DA4E-448D-9852-E305516DF2DD} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC} {EE2FDC70-DA4E-448D-9852-E305516DF2DD} = {6F8D172A-4830-4ACB-BF0A-C82A5668A2CC}
{970E6B61-1204-422D-A258-BFAB2955243D} = {ABC8FD67-E4C3-4236-AC51-280551470522} {970E6B61-1204-422D-A258-BFAB2955243D} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{08B04766-9926-40DD-AEE9-6AA1F185272A} = {ABC8FD67-E4C3-4236-AC51-280551470522} {08B04766-9926-40DD-AEE9-6AA1F185272A} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{75BCA849-0F1B-459E-9D63-DD875978EFD0} = {ABC8FD67-E4C3-4236-AC51-280551470522} {75BCA849-0F1B-459E-9D63-DD875978EFD0} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{5634B41F-719D-4210-991C-D29B097376FB} = {ABC8FD67-E4C3-4236-AC51-280551470522} {5634B41F-719D-4210-991C-D29B097376FB} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{0619D466-A21B-4B64-AC35-89299787DF12} = {ABC8FD67-E4C3-4236-AC51-280551470522} {0619D466-A21B-4B64-AC35-89299787DF12} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{AAD8D4BF-9EA1-4662-B96D-0956BB21F718} = {ABC8FD67-E4C3-4236-AC51-280551470522} {AAD8D4BF-9EA1-4662-B96D-0956BB21F718} = {ABC8FD67-E4C3-4236-AC51-280551470522}
{C232AB29-2F3C-4E18-9234-67B1C70CDAD5} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B} {C232AB29-2F3C-4E18-9234-67B1C70CDAD5} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}
{E38930BA-9F12-4609-B97C-55F08200A392} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B} {E38930BA-9F12-4609-B97C-55F08200A392} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}
{8AE2E716-258A-4EF3-ADF1-D3B75D677F29} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B} {8AE2E716-258A-4EF3-ADF1-D3B75D677F29} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}
{0D370C5B-7518-4D60-9D47-1AD59794F38F} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B} {0D370C5B-7518-4D60-9D47-1AD59794F38F} = {923FBCC6-ACE8-462C-ACE1-927C3EC8E77B}
{558F65BE-E09D-4A9B-9DA8-C0983445726F} = {47488541-F6D1-4385-AE49-7E3C72042521} {558F65BE-E09D-4A9B-9DA8-C0983445726F} = {47488541-F6D1-4385-AE49-7E3C72042521}
{473F6EEE-455F-4553-953D-5D0736D62D11} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30} {473F6EEE-455F-4553-953D-5D0736D62D11} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30}
{F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30} {F31A42DB-2F57-4DAC-B2BC-106F2D6F3C82} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30}
{CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30} {CD4593FD-F70C-4485-ACAD-AC69DAD1BBB1} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30}
{3DDAC01B-2567-4C0C-88E1-0A716729203E} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30} {3DDAC01B-2567-4C0C-88E1-0A716729203E} = {C5F4B293-90EC-48B8-97FA-CD23C44C9C30}
{670915F7-F111-42FF-B004-39379A9D5951} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {670915F7-F111-42FF-B004-39379A9D5951} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{63988A9B-FA70-4BBA-8C7E-784145384F7C} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {63988A9B-FA70-4BBA-8C7E-784145384F7C} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{5737FA14-B873-496B-8141-49D5B273AC3A} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {5737FA14-B873-496B-8141-49D5B273AC3A} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {73F1A72C-BCDE-4912-8AF7-6BE33D92FCC0} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{0DB69CAE-B0BC-4688-9467-66B4C1023D3F} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {0DB69CAE-B0BC-4688-9467-66B4C1023D3F} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{0AF835A6-8181-46DB-A17E-C765FA07A5A0} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {0AF835A6-8181-46DB-A17E-C765FA07A5A0} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{628A8C89-5E59-4747-8D6A-AA22267552ED} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F} {628A8C89-5E59-4747-8D6A-AA22267552ED} = {E7D2B8A2-4586-4660-BB84-E46A58CD5F7F}
{2FB9342F-CA85-4903-8667-45ED64AD25A6} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {2FB9342F-CA85-4903-8667-45ED64AD25A6} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{AAAF8157-1E33-4D6C-8319-3B304D018005} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {AAAF8157-1E33-4D6C-8319-3B304D018005} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{E3B9A023-2146-4D9D-A806-1479683078AE} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {E3B9A023-2146-4D9D-A806-1479683078AE} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{F6F1D34F-3AF6-41DD-B493-60899F959BBA} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {F6F1D34F-3AF6-41DD-B493-60899F959BBA} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{1F46BC62-A011-4B63-A5C6-51AEE2EF538D} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {1F46BC62-A011-4B63-A5C6-51AEE2EF538D} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{F71E48D0-115A-4105-B332-FCCB2139DC23} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {F71E48D0-115A-4105-B332-FCCB2139DC23} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{BBB663CB-E6A2-4E23-83C9-9C8F52325F44} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {BBB663CB-E6A2-4E23-83C9-9C8F52325F44} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{52F6930F-FBC0-404B-B135-6B6756F5713A} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {52F6930F-FBC0-404B-B135-6B6756F5713A} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{CC7E3A76-37B0-4C3D-B666-62DC34F04ABC} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {CC7E3A76-37B0-4C3D-B666-62DC34F04ABC} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{03F2BF9F-BE6C-4DAE-9615-46A7F05EF842} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {03F2BF9F-BE6C-4DAE-9615-46A7F05EF842} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{23D90C94-647A-416C-9227-9A0779401EBC} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {23D90C94-647A-416C-9227-9A0779401EBC} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{AA80B4A3-C885-4A7E-AF1A-FC3E89611988} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8} {AA80B4A3-C885-4A7E-AF1A-FC3E89611988} = {10A4935F-4C17-44ED-BB00-D044FC7C77B8}
{1069B86E-F2C1-498B-9DD8-76C7257C6A2A} = {D067FB54-B69D-4502-8E2F-676271AC4B86} {1069B86E-F2C1-498B-9DD8-76C7257C6A2A} = {D067FB54-B69D-4502-8E2F-676271AC4B86}
{3AE67011-EBB1-4ADE-8F42-8E90EB884219} = {D067FB54-B69D-4502-8E2F-676271AC4B86} {3AE67011-EBB1-4ADE-8F42-8E90EB884219} = {D067FB54-B69D-4502-8E2F-676271AC4B86}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

Просмотреть файл

@ -1,103 +1,137 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Microsoft.Owin.Security.OAuth.Messages namespace Microsoft.Owin.Security.OAuth.Messages
{ {
/// <summary> /// <summary>
/// Data object representing the information contained in the query string of an Authorize endpoint request. /// Data object representing the information contained in the query string of an Authorize endpoint request.
/// </summary> /// </summary>
public class AuthorizeEndpointRequest public class AuthorizeEndpointRequest
{ {
/// <summary> /// <summary>
/// Creates a new instance populated with values from the query string parameters. /// Creates a new instance populated with values from the query string parameters.
/// </summary> /// </summary>
/// <param name="parameters">Query string parameters from a request.</param> /// <param name="parameters">Query string parameters from a request.</param>
public AuthorizeEndpointRequest(IReadableStringCollection parameters) public AuthorizeEndpointRequest(IReadableStringCollection parameters)
{ {
if (parameters == null) if (parameters == null)
{ {
throw new ArgumentNullException("parameters"); throw new ArgumentNullException("parameters");
} }
Scope = new List<string>(); Scope = new List<string>();
foreach (var parameter in parameters) foreach (var parameter in parameters)
{ {
AddParameter(parameter.Key, parameters.Get(parameter.Key)); AddParameter(parameter.Key, parameters.Get(parameter.Key));
} }
} }
/// <summary> /// <summary>
/// The "response_type" query string parameter of the Authorize request. Known values are "code" and "token". /// The "response_type" query string parameter of the Authorize request. Known values are "code" and "token".
/// </summary> /// </summary>
public string ResponseType { get; set; } public string ResponseType { get; set; }
/// <summary> /// <summary>
/// The "client_id" query string parameter of the Authorize request. /// The "response_mode" query string parameter of the Authorize request. Known values are "query", "fragment" and "form_post"
/// </summary> /// See also, http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html
public string ClientId { get; set; } /// </summary>
public string ResponseMode { get; set; }
/// <summary>
/// The "redirect_uri" query string parameter of the Authorize request. May be absent if the server should use the /// <summary>
/// redirect uri known to be registered to the client id. /// The "client_id" query string parameter of the Authorize request.
/// </summary> /// </summary>
[SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string ClientId { get; set; }
public string RedirectUri { get; set; }
/// <summary>
/// <summary> /// The "redirect_uri" query string parameter of the Authorize request. May be absent if the server should use the
/// The "scope" query string parameter of the Authorize request. May be absent if the server should use default scopes. /// redirect uri known to be registered to the client id.
/// </summary> /// </summary>
public IList<string> Scope { get; private set; } [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")]
public string RedirectUri { get; set; }
/// <summary>
/// The "scope" query string parameter of the Authorize request. May be absent if the client does not require state to be /// <summary>
/// included when returning to the RedirectUri. /// The "scope" query string parameter of the Authorize request. May be absent if the server should use default scopes.
/// </summary> /// </summary>
public string State { get; set; } public IList<string> Scope { get; private set; }
/// <summary> /// <summary>
/// True if the "response_type" query string parameter is "code". /// The "scope" query string parameter of the Authorize request. May be absent if the client does not require state to be
/// See also, http://tools.ietf.org/html/rfc6749#section-4.1.1 /// included when returning to the RedirectUri.
/// </summary> /// </summary>
public bool IsAuthorizationCodeGrantType public string State { get; set; }
{
get { return string.Equals(ResponseType, Constants.ResponseTypes.Code, StringComparison.Ordinal); } /// <summary>
} /// True if the "response_type" query string contains the passed responseType.
/// See also, http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html
/// <summary> /// </summary>
/// True if the "response_type" query string parameter is "token". /// <param name="responseType">The responseType that is expected within the "response_type" query string</param>
/// See also, http://tools.ietf.org/html/rfc6749#section-4.2.1 /// <returns>True if the "response_type" query string contains the passed responseType.</returns>
/// </summary> public bool ContainsGrantType(string responseType)
public bool IsImplicitGrantType {
{ var parts = ResponseType.Split(' ');
get { return string.Equals(ResponseType, Constants.ResponseTypes.Token, StringComparison.Ordinal); } foreach (var part in parts)
} {
if (string.Equals(part, responseType, StringComparison.Ordinal))
private void AddParameter(string name, string value) {
{ return true;
if (string.Equals(name, Constants.Parameters.ResponseType, StringComparison.Ordinal)) }
{ }
ResponseType = value; return false;
} }
else if (string.Equals(name, Constants.Parameters.ClientId, StringComparison.Ordinal))
{ /// <summary>
ClientId = value; /// True if the "response_type" query string parameter is "code".
} /// See also, http://tools.ietf.org/html/rfc6749#section-4.1.1
else if (string.Equals(name, Constants.Parameters.RedirectUri, StringComparison.Ordinal)) /// </summary>
{ public bool IsAuthorizationCodeGrantType
RedirectUri = value; {
} get { return ContainsGrantType(Constants.ResponseTypes.Code); }
else if (string.Equals(name, Constants.Parameters.Scope, StringComparison.Ordinal)) }
{
Scope = value.Split(' '); /// <summary>
} /// True if the "response_type" query string parameter is "token".
else if (string.Equals(name, Constants.Parameters.State, StringComparison.Ordinal)) /// See also, http://tools.ietf.org/html/rfc6749#section-4.2.1
{ /// </summary>
State = value; public bool IsImplicitGrantType
} {
} get { return ContainsGrantType(Constants.ResponseTypes.Token); }
} }
}
public bool IsFormPostResponseMode
{
get { return string.Equals(ResponseMode, Constants.ResponseModes.FormPost, StringComparison.Ordinal); }
}
private void AddParameter(string name, string value)
{
if (string.Equals(name, Constants.Parameters.ResponseType, StringComparison.Ordinal))
{
ResponseType = value;
}
else if (string.Equals(name, Constants.Parameters.ClientId, StringComparison.Ordinal))
{
ClientId = value;
}
else if (string.Equals(name, Constants.Parameters.RedirectUri, StringComparison.Ordinal))
{
RedirectUri = value;
}
else if (string.Equals(name, Constants.Parameters.Scope, StringComparison.Ordinal))
{
Scope = value.Split(' ');
}
else if (string.Equals(name, Constants.Parameters.State, StringComparison.Ordinal))
{
State = value;
}
else if (string.Equals(name, Constants.Parameters.ResponseMode, StringComparison.Ordinal))
{
ResponseMode = value;
}
}
}
}

Просмотреть файл

@ -1,124 +1,126 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{F71E48D0-115A-4105-B332-FCCB2139DC23}</ProjectGuid> <ProjectGuid>{F71E48D0-115A-4105-B332-FCCB2139DC23}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Owin.Security.OAuth</RootNamespace> <RootNamespace>Microsoft.Owin.Security.OAuth</RootNamespace>
<AssemblyName>Microsoft.Owin.Security.OAuth</AssemblyName> <AssemblyName>Microsoft.Owin.Security.OAuth</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;CODE_ANALYSIS;AUTHSERVER</DefineConstants> <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS;AUTHSERVER</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile> <DocumentationFile>
</DocumentationFile> </DocumentationFile>
<RunCodeAnalysis>true</RunCodeAnalysis> <RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>..\..\build\CodeAnalysis.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>..\..\build\CodeAnalysis.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath> <OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;AUTHSERVER</DefineConstants> <DefineConstants>TRACE;AUTHSERVER</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Microsoft.Owin.Security.OAuth.XML</DocumentationFile> <DocumentationFile>bin\Release\Microsoft.Owin.Security.OAuth.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL"> <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath> <HintPath>..\..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.IdentityModel" /> <Reference Include="System.IdentityModel" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\..\build\CommonAssemblyInfo.cs"> <Compile Include="..\..\build\CommonAssemblyInfo.cs">
<Link>Properties\CommonAssemblyInfo.cs</Link> <Link>Properties\CommonAssemblyInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Messages\TokenEndpointRequestCustomExtension.cs" /> <Compile Include="Messages\TokenEndpointRequestCustomExtension.cs" />
<Compile Include="Messages\TokenEndpointRequestRefreshToken.cs" /> <Compile Include="Messages\TokenEndpointRequestRefreshToken.cs" />
<Compile Include="Messages\TokenEndpointRequestAuthorizationCode.cs" /> <Compile Include="Messages\TokenEndpointRequestAuthorizationCode.cs" />
<Compile Include="Messages\AuthorizeEndpointRequest.cs" /> <Compile Include="Messages\AuthorizeEndpointRequest.cs" />
<Compile Include="Messages\TokenEndpointRequest.cs" /> <Compile Include="Messages\TokenEndpointRequest.cs" />
<Compile Include="Messages\TokenEndpointRequestClientCredentials.cs" /> <Compile Include="Messages\TokenEndpointRequestClientCredentials.cs" />
<Compile Include="Messages\TokenEndpointRequestResourceOwnerPasswordCredentials.cs" /> <Compile Include="Messages\TokenEndpointRequestResourceOwnerPasswordCredentials.cs" />
<Compile Include="OAuthAuthorizationServerHandler.cs" /> <Compile Include="OAuthAuthorizationServerHandler.cs" />
<Compile Include="OAuthAuthorizationServerExtensions.cs" /> <Compile Include="OAuthAuthorizationServerExtensions.cs" />
<Compile Include="OAuthAuthorizationServerOptions.cs" /> <Compile Include="OAuthAuthorizationServerOptions.cs" />
<Compile Include="OAuthAuthorizationServerMiddleware.cs" /> <Compile Include="OAuthAuthorizationServerMiddleware.cs" />
<Compile Include="OAuthBearerAuthenticationHandler.cs" /> <Compile Include="OAuthBearerAuthenticationHandler.cs" />
<Compile Include="OAuthBearerAuthenticationExtensions.cs" /> <Compile Include="OAuthBearerAuthenticationExtensions.cs" />
<Compile Include="OAuthBearerAuthenticationMiddleware.cs" /> <Compile Include="OAuthBearerAuthenticationMiddleware.cs" />
<Compile Include="OAuthBearerAuthenticationOptions.cs" /> <Compile Include="OAuthBearerAuthenticationOptions.cs" />
<Compile Include="OAuthConstants.cs" /> <Compile Include="OAuthConstants.cs" />
<Compile Include="OAuthDefaults.cs" /> <Compile Include="OAuthDefaults.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Provider\OAuthTokenEndpointResponseContext.cs" />
<Compile Include="Provider\BaseValidatingClientContext.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Provider\BaseValidatingContext.cs" /> <Compile Include="Provider\BaseValidatingClientContext.cs" />
<Compile Include="Provider\BaseValidatingTicketContext.cs" /> <Compile Include="Provider\BaseValidatingContext.cs" />
<Compile Include="Provider\DefaultBehavior.cs" /> <Compile Include="Provider\BaseValidatingTicketContext.cs" />
<Compile Include="Provider\OAuthAuthorizeEndpointContext.cs" /> <Compile Include="Provider\DefaultBehavior.cs" />
<Compile Include="Provider\IOAuthAuthorizationServerProvider.cs" /> <Compile Include="Provider\OAuthAuthorizeEndpointResponseContext.cs" />
<Compile Include="Provider\OAuthAuthorizationServerProvider.cs" /> <Compile Include="Provider\OAuthAuthorizeEndpointContext.cs" />
<Compile Include="Provider\OAuthBearerAuthenticationProvider.cs" /> <Compile Include="Provider\IOAuthAuthorizationServerProvider.cs" />
<Compile Include="Provider\OAuthChallengeContext.cs" /> <Compile Include="Provider\OAuthAuthorizationServerProvider.cs" />
<Compile Include="Provider\OAuthGrantAuthorizationCodeContext.cs" /> <Compile Include="Provider\OAuthBearerAuthenticationProvider.cs" />
<Compile Include="Provider\OAuthGrantRefreshTokenContext.cs" /> <Compile Include="Provider\OAuthChallengeContext.cs" />
<Compile Include="Provider\OAuthRequestTokenContext.cs" /> <Compile Include="Provider\OAuthGrantAuthorizationCodeContext.cs" />
<Compile Include="Provider\OAuthValidateClientAuthenticationContext.cs" /> <Compile Include="Provider\OAuthGrantRefreshTokenContext.cs" />
<Compile Include="Provider\OAuthMatchEndpointContext.cs" /> <Compile Include="Provider\OAuthRequestTokenContext.cs" />
<Compile Include="Provider\OAuthTokenEndpointContext.cs" /> <Compile Include="Provider\OAuthValidateClientAuthenticationContext.cs" />
<Compile Include="Provider\OAuthGrantClientCredentialsContext.cs" /> <Compile Include="Provider\OAuthMatchEndpointContext.cs" />
<Compile Include="Provider\OAuthGrantCustomExtensionContext.cs" /> <Compile Include="Provider\OAuthTokenEndpointContext.cs" />
<Compile Include="Provider\OAuthValidateAuthorizeRequestContext.cs" /> <Compile Include="Provider\OAuthGrantClientCredentialsContext.cs" />
<Compile Include="Provider\OAuthValidateClientRedirectUriContext.cs" /> <Compile Include="Provider\OAuthGrantCustomExtensionContext.cs" />
<Compile Include="Provider\OAuthValidateIdentityContext.cs" /> <Compile Include="Provider\OAuthValidateAuthorizeRequestContext.cs" />
<Compile Include="Provider\IOAuthBearerAuthenticationProvider.cs" /> <Compile Include="Provider\OAuthValidateClientRedirectUriContext.cs" />
<Compile Include="Provider\OAuthGrantResourceOwnerCredentialsContext.cs" /> <Compile Include="Provider\OAuthValidateIdentityContext.cs" />
<Compile Include="Provider\OAuthValidateTokenRequestContext.cs" /> <Compile Include="Provider\IOAuthBearerAuthenticationProvider.cs" />
</ItemGroup> <Compile Include="Provider\OAuthGrantResourceOwnerCredentialsContext.cs" />
<ItemGroup> <Compile Include="Provider\OAuthValidateTokenRequestContext.cs" />
<None Include="Microsoft.Owin.Security.OAuth.nuspec" /> </ItemGroup>
<None Include="packages.config" /> <ItemGroup>
</ItemGroup> <None Include="Microsoft.Owin.Security.OAuth.nuspec" />
<ItemGroup> <None Include="packages.config" />
<ProjectReference Include="..\Microsoft.Owin.Security\Microsoft.Owin.Security.csproj"> </ItemGroup>
<Project>{AAAF8157-1E33-4D6C-8319-3B304D018005}</Project> <ItemGroup>
<Name>Microsoft.Owin.Security</Name> <ProjectReference Include="..\Microsoft.Owin.Security\Microsoft.Owin.Security.csproj">
</ProjectReference> <Project>{AAAF8157-1E33-4D6C-8319-3B304D018005}</Project>
<ProjectReference Include="..\Microsoft.Owin\Microsoft.Owin.csproj"> <Name>Microsoft.Owin.Security</Name>
<Project>{0db69cae-b0bc-4688-9467-66b4c1023d3f}</Project> </ProjectReference>
<Name>Microsoft.Owin</Name> <ProjectReference Include="..\Microsoft.Owin\Microsoft.Owin.csproj">
</ProjectReference> <Project>{0db69cae-b0bc-4688-9467-66b4c1023d3f}</Project>
</ItemGroup> <Name>Microsoft.Owin</Name>
<ItemGroup> </ProjectReference>
<CodeAnalysisDictionary Include="CustomDictionary.xml" /> </ItemGroup>
</ItemGroup> <ItemGroup>
<Import Project="$(ProjectDir)..\..\build\Common.targets" /> <CodeAnalysisDictionary Include="CustomDictionary.xml" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </ItemGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <Import Project="$(ProjectDir)..\..\build\Common.targets" />
Other similar extension points exist, see Microsoft.Common.targets. <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild"> <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
</Target> Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="AfterBuild"> <Target Name="BeforeBuild">
</Target> </Target>
--> <Target Name="AfterBuild">
</Target>
-->
</Project> </Project>

Просмотреть файл

@ -1,6 +1,7 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System; using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
@ -12,6 +13,7 @@ using Microsoft.Owin.Security.Infrastructure;
using Microsoft.Owin.Security.OAuth.Messages; using Microsoft.Owin.Security.OAuth.Messages;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
internal class OAuthAuthorizationServerHandler : AuthenticationHandler<OAuthAuthorizationServerOptions> internal class OAuthAuthorizationServerHandler : AuthenticationHandler<OAuthAuthorizationServerOptions>
@ -172,7 +174,7 @@ namespace Microsoft.Owin.Security.OAuth
return; return;
} }
string location = _clientContext.RedirectUri; var returnParameter = new Dictionary<string, string>();
if (_authorizeEndpointRequest.IsAuthorizationCodeGrantType) if (_authorizeEndpointRequest.IsAuthorizationCodeGrantType)
{ {
@ -204,15 +206,51 @@ namespace Microsoft.Owin.Security.OAuth
await SendErrorRedirectAsync(_clientContext, errorContext); await SendErrorRedirectAsync(_clientContext, errorContext);
} }
location = WebUtilities.AddQueryString(location, Constants.Parameters.Code, code); var authResponseContext = new OAuthAuthorizationEndpointResponseContext(
Context,
Options,
new AuthenticationTicket(signin.Identity, signin.Properties),
_authorizeEndpointRequest,
null,
code);
await Options.Provider.AuthorizationEndpointResponse(authResponseContext);
foreach (var parameter in authResponseContext.AdditionalResponseParameters)
{
returnParameter[parameter.Key] = parameter.Value.ToString();
}
returnParameter[Constants.Parameters.Code] = code;
if (!String.IsNullOrEmpty(_authorizeEndpointRequest.State)) if (!String.IsNullOrEmpty(_authorizeEndpointRequest.State))
{ {
location = WebUtilities.AddQueryString(location, Constants.Parameters.State, _authorizeEndpointRequest.State); returnParameter[Constants.Parameters.State] = _authorizeEndpointRequest.State;
} }
string location = "";
if (_authorizeEndpointRequest.IsFormPostResponseMode)
{
location = Options.FormPostEndpoint.ToString();
returnParameter[Constants.Parameters.RedirectUri] = _clientContext.RedirectUri;
}
else
{
location = _clientContext.RedirectUri;
}
foreach (var key in returnParameter.Keys)
{
location = WebUtilities.AddQueryString(location, key, returnParameter[key]);
}
Response.Redirect(location); Response.Redirect(location);
} }
else if (_authorizeEndpointRequest.IsImplicitGrantType) else if (_authorizeEndpointRequest.IsImplicitGrantType)
{ {
string location = _clientContext.RedirectUri;
DateTimeOffset currentUtc = Options.SystemClock.UtcNow; DateTimeOffset currentUtc = Options.SystemClock.UtcNow;
signin.Properties.IssuedUtc = currentUtc; signin.Properties.IssuedUtc = currentUtc;
signin.Properties.ExpiresUtc = currentUtc.Add(Options.AccessTokenExpireTimeSpan); signin.Properties.ExpiresUtc = currentUtc.Add(Options.AccessTokenExpireTimeSpan);
@ -249,10 +287,28 @@ namespace Microsoft.Owin.Security.OAuth
{ {
appender.Append(Constants.Parameters.State, _authorizeEndpointRequest.State); appender.Append(Constants.Parameters.State, _authorizeEndpointRequest.State);
} }
var authResponseContext = new OAuthAuthorizationEndpointResponseContext(
Context,
Options,
new AuthenticationTicket(signin.Identity, signin.Properties),
_authorizeEndpointRequest,
accessToken,
null);
await Options.Provider.AuthorizationEndpointResponse(authResponseContext);
foreach (var parameter in authResponseContext.AdditionalResponseParameters)
{
appender.Append(parameter.Key, parameter.Value.ToString());
}
Response.Redirect(appender.ToString()); Response.Redirect(appender.ToString());
} }
} }
private async Task InvokeTokenEndpointAsync() private async Task InvokeTokenEndpointAsync()
{ {
DateTimeOffset currentUtc = Options.SystemClock.UtcNow; DateTimeOffset currentUtc = Options.SystemClock.UtcNow;
@ -375,6 +431,16 @@ namespace Microsoft.Owin.Security.OAuth
await Options.RefreshTokenProvider.CreateAsync(refreshTokenCreateContext); await Options.RefreshTokenProvider.CreateAsync(refreshTokenCreateContext);
string refreshToken = refreshTokenCreateContext.Token; string refreshToken = refreshTokenCreateContext.Token;
var tokenEndpointResponseContext = new OAuthTokenEndpointResponseContext(
Context,
Options,
ticket,
tokenEndpointRequest,
accessToken,
tokenEndpointContext.AdditionalResponseParameters);
await Options.Provider.TokenEndpointResponse(tokenEndpointResponseContext);
var memory = new MemoryStream(); var memory = new MemoryStream();
byte[] body; byte[] body;
using (var writer = new JsonTextWriter(new StreamWriter(memory))) using (var writer = new JsonTextWriter(new StreamWriter(memory)))
@ -399,7 +465,7 @@ namespace Microsoft.Owin.Security.OAuth
writer.WritePropertyName(Constants.Parameters.RefreshToken); writer.WritePropertyName(Constants.Parameters.RefreshToken);
writer.WriteValue(refreshToken); writer.WriteValue(refreshToken);
} }
foreach (var additionalResponseParameter in tokenEndpointContext.AdditionalResponseParameters) foreach (var additionalResponseParameter in tokenEndpointResponseContext.AdditionalResponseParameters)
{ {
writer.WritePropertyName(additionalResponseParameter.Key); writer.WritePropertyName(additionalResponseParameter.Key);
writer.WriteValue(additionalResponseParameter.Value); writer.WriteValue(additionalResponseParameter.Value);

Просмотреть файл

@ -1,124 +1,131 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System; using System;
using Microsoft.Owin.Infrastructure; using Microsoft.Owin.Infrastructure;
using Microsoft.Owin.Security.Infrastructure; using Microsoft.Owin.Security.Infrastructure;
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
/// <summary> /// <summary>
/// Options class provides information needed to control Authorization Server middleware behavior /// Options class provides information needed to control Authorization Server middleware behavior
/// </summary> /// </summary>
public class OAuthAuthorizationServerOptions : AuthenticationOptions public class OAuthAuthorizationServerOptions : AuthenticationOptions
{ {
/// <summary> /// <summary>
/// Creates an instance of authorization server options with default values. /// Creates an instance of authorization server options with default values.
/// </summary> /// </summary>
public OAuthAuthorizationServerOptions() public OAuthAuthorizationServerOptions()
: base(OAuthDefaults.AuthenticationType) : base(OAuthDefaults.AuthenticationType)
{ {
AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(5); AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(5);
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20); AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20);
SystemClock = new SystemClock(); SystemClock = new SystemClock();
} }
/// <summary> /// <summary>
/// The request path where client applications will redirect the user-agent in order to /// The request path where client applications will redirect the user-agent in order to
/// obtain user consent to issue a token. Must begin with a leading slash, like "/Authorize". /// obtain user consent to issue a token. Must begin with a leading slash, like "/Authorize".
/// </summary> /// </summary>
public PathString AuthorizeEndpointPath { get; set; } public PathString AuthorizeEndpointPath { get; set; }
/// <summary> /// <summary>
/// The request path client applications communicate with directly as part of the OAuth protocol. /// The request path client applications communicate with directly as part of the OAuth protocol.
/// Must begin with a leading slash, like "/Token". If the client is issued a client_secret, it must /// Must begin with a leading slash, like "/Token". If the client is issued a client_secret, it must
/// be provided to this endpoint. /// be provided to this endpoint.
/// </summary> /// </summary>
public PathString TokenEndpointPath { get; set; } public PathString TokenEndpointPath { get; set; }
/// <summary> /// <summary>
/// The object provided by the application to process events raised by the Authorization Server middleware. /// The object provided by the application to process events raised by the Authorization Server middleware.
/// The application may implement the interface fully, or it may create an instance of OAuthAuthorizationServerProvider /// The application may implement the interface fully, or it may create an instance of OAuthAuthorizationServerProvider
/// and assign delegates only to the events it wants to process. /// and assign delegates only to the events it wants to process.
/// </summary> /// </summary>
public IOAuthAuthorizationServerProvider Provider { get; set; } public IOAuthAuthorizationServerProvider Provider { get; set; }
/// <summary> /// <summary>
/// The data format used to protect and unprotect the information contained in the authorization code. /// The data format used to protect and unprotect the information contained in the authorization code.
/// If not provided by the application the default data protection provider depends on the host server. /// If not provided by the application the default data protection provider depends on the host server.
/// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted /// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted
/// servers will use DPAPI data protection. /// servers will use DPAPI data protection.
/// </summary> /// </summary>
public ISecureDataFormat<AuthenticationTicket> AuthorizationCodeFormat { get; set; } public ISecureDataFormat<AuthenticationTicket> AuthorizationCodeFormat { get; set; }
/// <summary> /// <summary>
/// The data format used to protect the information contained in the access token. /// The data format used to protect the information contained in the access token.
/// If not provided by the application the default data protection provider depends on the host server. /// If not provided by the application the default data protection provider depends on the host server.
/// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted /// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted
/// servers will use DPAPI data protection. If a different access token /// servers will use DPAPI data protection. If a different access token
/// provider or format is assigned, a compatible instance must be assigned to the OAuthBearerAuthenticationOptions.AccessTokenProvider /// provider or format is assigned, a compatible instance must be assigned to the OAuthBearerAuthenticationOptions.AccessTokenProvider
/// or OAuthBearerAuthenticationOptions.AccessTokenFormat property of the resource server. /// or OAuthBearerAuthenticationOptions.AccessTokenFormat property of the resource server.
/// </summary> /// </summary>
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; set; } public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; set; }
/// <summary> /// <summary>
/// The data format used to protect and unprotect the information contained in the refresh token. /// The data format used to protect and unprotect the information contained in the refresh token.
/// If not provided by the application the default data protection provider depends on the host server. /// If not provided by the application the default data protection provider depends on the host server.
/// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted /// The SystemWeb host on IIS will use ASP.NET machine key data protection, and HttpListener and other self-hosted
/// servers will use DPAPI data protection. /// servers will use DPAPI data protection.
/// </summary> /// </summary>
public ISecureDataFormat<AuthenticationTicket> RefreshTokenFormat { get; set; } public ISecureDataFormat<AuthenticationTicket> RefreshTokenFormat { get; set; }
/// <summary> /// <summary>
/// The period of time the authorization code remains valid after being issued. The default is five minutes. /// The period of time the authorization code remains valid after being issued. The default is five minutes.
/// This time span must also take into account clock synchronization between servers in a web farm, so a very /// This time span must also take into account clock synchronization between servers in a web farm, so a very
/// brief value could result in unexpectedly expired tokens. /// brief value could result in unexpectedly expired tokens.
/// </summary> /// </summary>
public TimeSpan AuthorizationCodeExpireTimeSpan { get; set; } public TimeSpan AuthorizationCodeExpireTimeSpan { get; set; }
/// <summary> /// <summary>
/// The period of time the access token remains valid after being issued. The default is twenty minutes. /// The period of time the access token remains valid after being issued. The default is twenty minutes.
/// The client application is expected to refresh or acquire a new access token after the token has expired. /// The client application is expected to refresh or acquire a new access token after the token has expired.
/// </summary> /// </summary>
public TimeSpan AccessTokenExpireTimeSpan { get; set; } public TimeSpan AccessTokenExpireTimeSpan { get; set; }
/// <summary> /// <summary>
/// Produces a single-use authorization code to return to the client application. For the OAuth server to be secure the /// Produces a single-use authorization code to return to the client application. For the OAuth server to be secure the
/// application MUST provide an instance for AuthorizationCodeProvider where the token produced by the OnCreate or OnCreateAsync event /// application MUST provide an instance for AuthorizationCodeProvider where the token produced by the OnCreate or OnCreateAsync event
/// is considered valid for only one call to OnReceive or OnReceiveAsync. /// is considered valid for only one call to OnReceive or OnReceiveAsync.
/// </summary> /// </summary>
public IAuthenticationTokenProvider AuthorizationCodeProvider { get; set; } public IAuthenticationTokenProvider AuthorizationCodeProvider { get; set; }
/// <summary> /// <summary>
/// Produces a bearer token the client application will typically be providing to resource server as the authorization bearer /// Produces a bearer token the client application will typically be providing to resource server as the authorization bearer
/// http request header. If not provided the token produced on the server's default data protection. If a different access token /// http request header. If not provided the token produced on the server's default data protection. If a different access token
/// provider or format is assigned, a compatible instance must be assigned to the OAuthBearerAuthenticationOptions.AccessTokenProvider /// provider or format is assigned, a compatible instance must be assigned to the OAuthBearerAuthenticationOptions.AccessTokenProvider
/// or OAuthBearerAuthenticationOptions.AccessTokenFormat property of the resource server. /// or OAuthBearerAuthenticationOptions.AccessTokenFormat property of the resource server.
/// </summary> /// </summary>
public IAuthenticationTokenProvider AccessTokenProvider { get; set; } public IAuthenticationTokenProvider AccessTokenProvider { get; set; }
/// <summary> /// <summary>
/// Produces a refresh token which may be used to produce a new access token when needed. If not provided the authorization server will /// Produces a refresh token which may be used to produce a new access token when needed. If not provided the authorization server will
/// not return refresh tokens from the /Token endpoint. /// not return refresh tokens from the /Token endpoint.
/// </summary> /// </summary>
public IAuthenticationTokenProvider RefreshTokenProvider { get; set; } public IAuthenticationTokenProvider RefreshTokenProvider { get; set; }
/// <summary> /// <summary>
/// Set to true if the web application is able to render error messages on the /Authorize endpoint. This is only needed for cases where /// Set to true if the web application is able to render error messages on the /Authorize endpoint. This is only needed for cases where
/// the browser is not redirected back to the client application, for example, when the client_id or redirect_uri are incorrect. The /// the browser is not redirected back to the client application, for example, when the client_id or redirect_uri are incorrect. The
/// /Authorize endpoint should expect to see "oauth.Error", "oauth.ErrorDescription", "oauth.ErrorUri" properties added to the owin environment. /// /Authorize endpoint should expect to see "oauth.Error", "oauth.ErrorDescription", "oauth.ErrorUri" properties added to the owin environment.
/// </summary> /// </summary>
public bool ApplicationCanDisplayErrors { get; set; } public bool ApplicationCanDisplayErrors { get; set; }
/// <summary> /// <summary>
/// Used to know what the current clock time is when calculating or validating token expiration. When not assigned default is based on /// Used to know what the current clock time is when calculating or validating token expiration. When not assigned default is based on
/// DateTimeOffset.UtcNow. This is typically needed only for unit testing. /// DateTimeOffset.UtcNow. This is typically needed only for unit testing.
/// </summary> /// </summary>
public ISystemClock SystemClock { get; set; } public ISystemClock SystemClock { get; set; }
/// <summary> /// <summary>
/// True to allow authorize and token requests to arrive on http URI addresses, and to allow incoming /// True to allow authorize and token requests to arrive on http URI addresses, and to allow incoming
/// redirect_uri authorize request parameter to have http URI addresses. /// redirect_uri authorize request parameter to have http URI addresses.
/// </summary> /// </summary>
public bool AllowInsecureHttp { get; set; } public bool AllowInsecureHttp { get; set; }
}
} /// <summary>
/// Endpoint responsible for Form Post Response Mode
/// See also, http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html
/// </summary>
public PathString FormPostEndpoint { get; set; }
}
}

Просмотреть файл

@ -1,63 +1,70 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
internal static class Constants internal static class Constants
{ {
public static class Parameters public static class Parameters
{ {
public const string ResponseType = "response_type"; public const string ResponseType = "response_type";
public const string GrantType = "grant_type"; public const string GrantType = "grant_type";
public const string ClientId = "client_id"; public const string ClientId = "client_id";
public const string ClientSecret = "client_secret"; public const string ClientSecret = "client_secret";
public const string RedirectUri = "redirect_uri"; public const string RedirectUri = "redirect_uri";
public const string Scope = "scope"; public const string Scope = "scope";
public const string State = "state"; public const string State = "state";
public const string Code = "code"; public const string Code = "code";
public const string RefreshToken = "refresh_token"; public const string RefreshToken = "refresh_token";
public const string Username = "username"; public const string Username = "username";
public const string Password = "password"; public const string Password = "password";
public const string Error = "error"; public const string Error = "error";
public const string ErrorDescription = "error_description"; public const string ErrorDescription = "error_description";
public const string ErrorUri = "error_uri"; public const string ErrorUri = "error_uri";
public const string ExpiresIn = "expires_in"; public const string ExpiresIn = "expires_in";
public const string AccessToken = "access_token"; public const string AccessToken = "access_token";
public const string TokenType = "token_type"; public const string TokenType = "token_type";
}
public const string ResponseMode = "response_mode";
public static class ResponseTypes }
{
public const string Code = "code"; public static class ResponseTypes
public const string Token = "token"; {
} public const string Code = "code";
public const string Token = "token";
public static class GrantTypes }
{
public const string AuthorizationCode = "authorization_code"; public static class GrantTypes
public const string ClientCredentials = "client_credentials"; {
public const string RefreshToken = "refresh_token"; public const string AuthorizationCode = "authorization_code";
public const string Password = "password"; public const string ClientCredentials = "client_credentials";
} public const string RefreshToken = "refresh_token";
public const string Password = "password";
public static class TokenTypes }
{
public const string Bearer = "bearer"; public static class TokenTypes
} {
public const string Bearer = "bearer";
public static class Errors }
{
public const string InvalidRequest = "invalid_request"; public static class Errors
public const string InvalidClient = "invalid_client"; {
public const string InvalidGrant = "invalid_grant"; public const string InvalidRequest = "invalid_request";
public const string UnsupportedResponseType = "unsupported_response_type"; public const string InvalidClient = "invalid_client";
public const string UnsupportedGrantType = "unsupported_grant_type"; public const string InvalidGrant = "invalid_grant";
public const string UnauthorizedClient = "unauthorized_client"; public const string UnsupportedResponseType = "unsupported_response_type";
} public const string UnsupportedGrantType = "unsupported_grant_type";
public const string UnauthorizedClient = "unauthorized_client";
public static class Extra }
{
public const string ClientId = "client_id"; public static class Extra
public const string RedirectUri = "redirect_uri"; {
} public const string ClientId = "client_id";
} public const string RedirectUri = "redirect_uri";
} }
public static class ResponseModes
{
public const string FormPost = "form_post";
}
}
}

Просмотреть файл

@ -1,154 +1,172 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
/// <summary> /// <summary>
/// Interface for OAuthAuthorizationServerOptions.Provider property used by Authorization /// Interface for OAuthAuthorizationServerOptions.Provider property used by Authorization
/// Server to communicate with the web application while processing requests. /// Server to communicate with the web application while processing requests.
/// </summary> /// </summary>
public interface IOAuthAuthorizationServerProvider public interface IOAuthAuthorizationServerProvider
{ {
/// <summary> /// <summary>
/// Called to determine if an incoming request is treated as an Authorize or Token /// Called to determine if an incoming request is treated as an Authorize or Token
/// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath /// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath
/// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint /// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint
/// will already be true if the request path matches. /// will already be true if the request path matches.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task MatchEndpoint(OAuthMatchEndpointContext context); Task MatchEndpoint(OAuthMatchEndpointContext context);
/// <summary> /// <summary>
/// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri" /// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri"
/// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this /// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this
/// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called /// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called
/// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI. /// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI.
/// If context.Validated is not called the request will not proceed further. /// If context.Validated is not called the request will not proceed further.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context); Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context);
/// <summary> /// <summary>
/// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are /// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are
/// present on the request. If the web application accepts Basic authentication credentials, /// present on the request. If the web application accepts Basic authentication credentials,
/// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web /// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web
/// application accepts "client_id" and "client_secret" as form encoded POST parameters, /// application accepts "client_id" and "client_secret" as form encoded POST parameters,
/// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body. /// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body.
/// If context.Validated is not called the request will not proceed further. /// If context.Validated is not called the request will not proceed further.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context); Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context);
/// <summary> /// <summary>
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with /// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
/// validated client redirect URI, should continue processing. An application may add any additional constraints. /// validated client redirect URI, should continue processing. An application may add any additional constraints.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context); Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context);
/// <summary> /// <summary>
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with /// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
/// validated client credentials, should continue processing. An application may add any additional constraints. /// validated client credentials, should continue processing. An application may add any additional constraints.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task ValidateTokenRequest(OAuthValidateTokenRequestContext context); Task ValidateTokenRequest(OAuthValidateTokenRequestContext context);
/// <summary> /// <summary>
/// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize /// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize
/// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token". /// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token".
/// The claims and properties /// The claims and properties
/// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization /// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization
/// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different /// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different
/// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token. /// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token.
/// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to /// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to
/// the access token unmodified. /// the access token unmodified.
/// See also http://tools.ietf.org/html/rfc6749#section-4.1.3 /// See also http://tools.ietf.org/html/rfc6749#section-4.1.3
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task GrantAuthorizationCode(OAuthGrantAuthorizationCodeContext context); Task GrantAuthorizationCode(OAuthGrantAuthorizationCodeContext context);
/// <summary> /// <summary>
/// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token" /// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token"
/// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token". /// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token".
/// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties /// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties
/// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the /// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the
/// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may /// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may
/// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to /// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to
/// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to /// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to
/// the access token unmodified. /// the access token unmodified.
/// See also http://tools.ietf.org/html/rfc6749#section-6 /// See also http://tools.ietf.org/html/rfc6749#section-6
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task GrantRefreshToken(OAuthGrantRefreshTokenContext context); Task GrantRefreshToken(OAuthGrantRefreshTokenContext context);
/// <summary> /// <summary>
/// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password /// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password
/// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and /// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and
/// optional "refresh_token". If the web application supports the /// optional "refresh_token". If the web application supports the
/// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an /// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an
/// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated /// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. . /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. .
/// The default behavior is to reject this grant type. /// The default behavior is to reject this grant type.
/// See also http://tools.ietf.org/html/rfc6749#section-4.3.2 /// See also http://tools.ietf.org/html/rfc6749#section-4.3.2
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context); Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context);
/// <summary> /// <summary>
/// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client /// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client
/// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user. /// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user.
/// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call. /// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call.
/// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated /// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers.
/// The default behavior is to reject this grant type. /// The default behavior is to reject this grant type.
/// See also http://tools.ietf.org/html/rfc6749#section-4.4.2 /// See also http://tools.ietf.org/html/rfc6749#section-4.4.2
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task GrantClientCredentials(OAuthGrantClientCredentialsContext context); Task GrantClientCredentials(OAuthGrantClientCredentialsContext context);
/// <summary> /// <summary>
/// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types /// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types
/// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket /// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket
/// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be /// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be
/// included they may be added in the final TokenEndpoint call. /// included they may be added in the final TokenEndpoint call.
/// See also http://tools.ietf.org/html/rfc6749#section-4.5 /// See also http://tools.ietf.org/html/rfc6749#section-4.5
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task GrantCustomExtension(OAuthGrantCustomExtensionContext context); Task GrantCustomExtension(OAuthGrantCustomExtensionContext context);
/// <summary> /// <summary>
/// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component /// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component
/// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the /// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the
/// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the /// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the
/// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the /// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the
/// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes /// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes
/// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the /// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the
/// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing. /// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context); Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context);
/// <summary> /// <summary>
/// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final /// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final
/// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional /// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional
/// response parameters to the Token endpoint's json response body. /// response parameters to the Token endpoint's json response body.
/// </summary> /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <returns>Task to enable asynchronous execution</returns>
Task TokenEndpoint(OAuthTokenEndpointContext context); Task TokenEndpoint(OAuthTokenEndpointContext context);
}
} /// <summary>
/// Called before the AuthorizationEndpoint redirects its response to the caller. The response could be the
/// token, when using implicit flow or the AuthorizationEndpoint when using authorization code flow.
/// An application may implement this call in order to do any final modification of the claims being used
/// to issue access or refresh tokens. This call may also be used in order to add additional
/// response parameters to the authorization endpoint's response.
/// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
Task AuthorizationEndpointResponse(OAuthAuthorizationEndpointResponseContext context);
/// <summary>
/// Called before the TokenEndpoint redirects its response to the caller.
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context);
}
}

Просмотреть файл

@ -1,332 +1,378 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
/// <summary> /// <summary>
/// Default implementation of IOAuthAuthorizationServerProvider used by Authorization /// Default implementation of IOAuthAuthorizationServerProvider used by Authorization
/// Server to communicate with the web application while processing requests. OAuthAuthorizationServerProvider provides some default behavior, /// Server to communicate with the web application while processing requests. OAuthAuthorizationServerProvider provides some default behavior,
/// may be used as a virtual base class, and offers delegate properties which may be used to /// may be used as a virtual base class, and offers delegate properties which may be used to
/// handle individual calls without declaring a new class type. /// handle individual calls without declaring a new class type.
/// </summary> /// </summary>
public class OAuthAuthorizationServerProvider : IOAuthAuthorizationServerProvider public class OAuthAuthorizationServerProvider : IOAuthAuthorizationServerProvider
{ {
/// <summary> /// <summary>
/// Creates new instance of default provider behavior /// Creates new instance of default provider behavior
/// </summary> /// </summary>
public OAuthAuthorizationServerProvider() public OAuthAuthorizationServerProvider()
{ {
OnMatchEndpoint = context => Task.FromResult<object>(null); OnMatchEndpoint = context => Task.FromResult<object>(null);
OnValidateClientRedirectUri = context => Task.FromResult<object>(null); OnValidateClientRedirectUri = context => Task.FromResult<object>(null);
OnValidateClientAuthentication = context => Task.FromResult<object>(null); OnValidateClientAuthentication = context => Task.FromResult<object>(null);
OnValidateAuthorizeRequest = DefaultBehavior.ValidateAuthorizeRequest; OnValidateAuthorizeRequest = DefaultBehavior.ValidateAuthorizeRequest;
OnValidateTokenRequest = DefaultBehavior.ValidateTokenRequest; OnValidateTokenRequest = DefaultBehavior.ValidateTokenRequest;
OnGrantAuthorizationCode = DefaultBehavior.GrantAuthorizationCode; OnGrantAuthorizationCode = DefaultBehavior.GrantAuthorizationCode;
OnGrantResourceOwnerCredentials = context => Task.FromResult<object>(null); OnGrantResourceOwnerCredentials = context => Task.FromResult<object>(null);
OnGrantRefreshToken = DefaultBehavior.GrantRefreshToken; OnGrantRefreshToken = DefaultBehavior.GrantRefreshToken;
OnGrantClientCredentials = context => Task.FromResult<object>(null); OnGrantClientCredentials = context => Task.FromResult<object>(null);
OnGrantCustomExtension = context => Task.FromResult<object>(null); OnGrantCustomExtension = context => Task.FromResult<object>(null);
OnAuthorizeEndpoint = context => Task.FromResult<object>(null); OnAuthorizeEndpoint = context => Task.FromResult<object>(null);
OnTokenEndpoint = context => Task.FromResult<object>(null); OnTokenEndpoint = context => Task.FromResult<object>(null);
}
OnAuthorizationEndpointResponse = context => Task.FromResult<object>(null);
/// <summary>
/// Called to determine if an incoming request is treated as an Authorize or Token OnTokenEndpointResponse = context => Task.FromResult<object>(null);
/// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath }
/// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint
/// will already be true if the request path matches. /// <summary>
/// </summary> /// Called to determine if an incoming request is treated as an Authorize or Token
public Func<OAuthMatchEndpointContext, Task> OnMatchEndpoint { get; set; } /// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath
/// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint
/// <summary> /// will already be true if the request path matches.
/// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri" /// </summary>
/// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this public Func<OAuthMatchEndpointContext, Task> OnMatchEndpoint { get; set; }
/// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called
/// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI. /// <summary>
/// If context.Validated is not called the request will not proceed further. /// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri"
/// </summary> /// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this
public Func<OAuthValidateClientRedirectUriContext, Task> OnValidateClientRedirectUri { get; set; } /// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called
/// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI.
/// <summary> /// If context.Validated is not called the request will not proceed further.
/// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are /// </summary>
/// present on the request. If the web application accepts Basic authentication credentials, public Func<OAuthValidateClientRedirectUriContext, Task> OnValidateClientRedirectUri { get; set; }
/// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web
/// application accepts "client_id" and "client_secret" as form encoded POST parameters, /// <summary>
/// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body. /// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are
/// If context.Validated is not called the request will not proceed further. /// present on the request. If the web application accepts Basic authentication credentials,
/// </summary> /// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web
public Func<OAuthValidateClientAuthenticationContext, Task> OnValidateClientAuthentication { get; set; } /// application accepts "client_id" and "client_secret" as form encoded POST parameters,
/// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body.
/// <summary> /// If context.Validated is not called the request will not proceed further.
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// </summary>
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with public Func<OAuthValidateClientAuthenticationContext, Task> OnValidateClientAuthentication { get; set; }
/// validated client redirect URI, should continue processing. An application may add any additional constraints.
/// </summary> /// <summary>
public Func<OAuthValidateAuthorizeRequestContext, Task> OnValidateAuthorizeRequest { get; set; } /// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
/// <summary> /// validated client redirect URI, should continue processing. An application may add any additional constraints.
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// </summary>
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with public Func<OAuthValidateAuthorizeRequestContext, Task> OnValidateAuthorizeRequest { get; set; }
/// validated client credentials, should continue processing. An application may add any additional constraints.
/// </summary> /// <summary>
public Func<OAuthValidateTokenRequestContext, Task> OnValidateTokenRequest { get; set; } /// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
/// <summary> /// validated client credentials, should continue processing. An application may add any additional constraints.
/// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize /// </summary>
/// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token". public Func<OAuthValidateTokenRequestContext, Task> OnValidateTokenRequest { get; set; }
/// The claims and properties
/// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization /// <summary>
/// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different /// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize
/// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token. /// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token".
/// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to /// The claims and properties
/// the access token unmodified. /// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization
/// See also http://tools.ietf.org/html/rfc6749#section-4.1.3 /// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different
/// </summary> /// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token.
public Func<OAuthGrantAuthorizationCodeContext, Task> OnGrantAuthorizationCode { get; set; } /// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to
/// the access token unmodified.
/// <summary> /// See also http://tools.ietf.org/html/rfc6749#section-4.1.3
/// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password /// </summary>
/// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and public Func<OAuthGrantAuthorizationCodeContext, Task> OnGrantAuthorizationCode { get; set; }
/// optional "refresh_token". If the web application supports the
/// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an /// <summary>
/// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated /// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. /// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and
/// The default behavior is to reject this grant type. /// optional "refresh_token". If the web application supports the
/// See also http://tools.ietf.org/html/rfc6749#section-4.3.2 /// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an
/// </summary> /// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated
public Func<OAuthGrantResourceOwnerCredentialsContext, Task> OnGrantResourceOwnerCredentials { get; set; } /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers.
/// The default behavior is to reject this grant type.
/// <summary> /// See also http://tools.ietf.org/html/rfc6749#section-4.3.2
/// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client /// </summary>
/// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user. public Func<OAuthGrantResourceOwnerCredentialsContext, Task> OnGrantResourceOwnerCredentials { get; set; }
/// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call.
/// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated /// <summary>
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. /// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client
/// The default behavior is to reject this grant type. /// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user.
/// See also http://tools.ietf.org/html/rfc6749#section-4.4.2 /// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call.
/// </summary> /// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated
public Func<OAuthGrantClientCredentialsContext, Task> OnGrantClientCredentials { get; set; } /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers.
/// The default behavior is to reject this grant type.
/// <summary> /// See also http://tools.ietf.org/html/rfc6749#section-4.4.2
/// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token" /// </summary>
/// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token". public Func<OAuthGrantClientCredentialsContext, Task> OnGrantClientCredentials { get; set; }
/// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties
/// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the /// <summary>
/// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may /// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token"
/// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to /// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token".
/// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to /// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties
/// the access token unmodified. /// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the
/// See also http://tools.ietf.org/html/rfc6749#section-6 /// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may
/// </summary> /// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to
public Func<OAuthGrantRefreshTokenContext, Task> OnGrantRefreshToken { get; set; } /// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to
/// the access token unmodified.
/// <summary> /// See also http://tools.ietf.org/html/rfc6749#section-6
/// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types /// </summary>
/// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket public Func<OAuthGrantRefreshTokenContext, Task> OnGrantRefreshToken { get; set; }
/// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be
/// included they may be added in the final TokenEndpoint call. /// <summary>
/// See also http://tools.ietf.org/html/rfc6749#section-4.5 /// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types
/// </summary> /// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket
public Func<OAuthGrantCustomExtensionContext, Task> OnGrantCustomExtension { get; set; } /// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be
/// included they may be added in the final TokenEndpoint call.
/// <summary> /// See also http://tools.ietf.org/html/rfc6749#section-4.5
/// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component /// </summary>
/// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the public Func<OAuthGrantCustomExtensionContext, Task> OnGrantCustomExtension { get; set; }
/// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the
/// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the /// <summary>
/// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes /// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component
/// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the /// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the
/// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing. /// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the
/// </summary> /// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the
public Func<OAuthAuthorizeEndpointContext, Task> OnAuthorizeEndpoint { get; set; } /// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes
/// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the
/// <summary> /// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing.
/// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final /// </summary>
/// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional public Func<OAuthAuthorizeEndpointContext, Task> OnAuthorizeEndpoint { get; set; }
/// response parameters to the Token endpoint's json response body.
/// </summary> /// <summary>
public Func<OAuthTokenEndpointContext, Task> OnTokenEndpoint { get; set; } /// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final
/// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional
/// <summary> /// response parameters to the Token endpoint's json response body.
/// Called to determine if an incoming request is treated as an Authorize or Token /// </summary>
/// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath public Func<OAuthTokenEndpointContext, Task> OnTokenEndpoint { get; set; }
/// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint
/// will already be true if the request path matches. /// <summary>
/// </summary> /// Called before the AuthorizationEndpoint redirects its response to the caller. The response could be the
/// <param name="context">The context of the event carries information in and results out.</param> /// token, when using implicit flow or the AuthorizationEndpoint when using authorization code flow.
/// <returns>Task to enable asynchronous execution</returns> /// An application may implement this call in order to do any final modification of the claims being used
public virtual Task MatchEndpoint(OAuthMatchEndpointContext context) /// to issue access or refresh tokens. This call may also be used in order to add additional
{ /// response parameters to the authorization endpoint's response.
return OnMatchEndpoint.Invoke(context); /// </summary>
} /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
/// <summary> public Func<OAuthAuthorizationEndpointResponseContext, Task> OnAuthorizationEndpointResponse { get; set; }
/// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri"
/// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this /// <summary>
/// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called /// Called before the TokenEndpoint redirects its response to the caller.
/// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI. /// </summary>
/// If context.Validated is not called the request will not proceed further. /// <param name="context"></param>
/// </summary> /// <returns></returns>
/// <param name="context">The context of the event carries information in and results out.</param> public Func<OAuthTokenEndpointResponseContext, Task> OnTokenEndpointResponse { get; set; }
/// <returns>Task to enable asynchronous execution</returns>
public virtual Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) /// <summary>
{ /// Called to determine if an incoming request is treated as an Authorize or Token
return OnValidateClientRedirectUri.Invoke(context); /// endpoint. If Options.AuthorizeEndpointPath or Options.TokenEndpointPath
} /// are assigned values, then handling this event is optional and context.IsAuthorizeEndpoint and context.IsTokenEndpoint
/// will already be true if the request path matches.
/// <summary> /// </summary>
/// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are /// <param name="context">The context of the event carries information in and results out.</param>
/// present on the request. If the web application accepts Basic authentication credentials, /// <returns>Task to enable asynchronous execution</returns>
/// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web public virtual Task MatchEndpoint(OAuthMatchEndpointContext context)
/// application accepts "client_id" and "client_secret" as form encoded POST parameters, {
/// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body. return OnMatchEndpoint.Invoke(context);
/// If context.Validated is not called the request will not proceed further. }
/// </summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// <summary>
/// <returns>Task to enable asynchronous execution</returns> /// Called to validate that the context.ClientId is a registered "client_id", and that the context.RedirectUri a "redirect_uri"
public virtual Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) /// registered for that client. This only occurs when processing the Authorize endpoint. The application MUST implement this
{ /// call, and it MUST validate both of those factors before calling context.Validated. If the context.Validated method is called
return OnValidateClientAuthentication.Invoke(context); /// with a given redirectUri parameter, then IsValidated will only become true if the incoming redirect URI matches the given redirect URI.
} /// If context.Validated is not called the request will not proceed further.
/// </summary>
/// <summary> /// <param name="context">The context of the event carries information in and results out.</param>
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// <returns>Task to enable asynchronous execution</returns>
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with public virtual Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
/// validated client redirect URI, should continue processing. An application may add any additional constraints. {
/// </summary> return OnValidateClientRedirectUri.Invoke(context);
/// <param name="context">The context of the event carries information in and results out.</param> }
/// <returns>Task to enable asynchronous execution</returns>
public virtual Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context) /// <summary>
{ /// Called to validate that the origin of the request is a registered "client_id", and that the correct credentials for that client are
return OnValidateAuthorizeRequest.Invoke(context); /// present on the request. If the web application accepts Basic authentication credentials,
} /// context.TryGetBasicCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request header. If the web
/// application accepts "client_id" and "client_secret" as form encoded POST parameters,
/// <summary> /// context.TryGetFormCredentials(out clientId, out clientSecret) may be called to acquire those values if present in the request body.
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue. /// If context.Validated is not called the request will not proceed further.
/// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with /// </summary>
/// validated client credentials, should continue processing. An application may add any additional constraints. /// <param name="context">The context of the event carries information in and results out.</param>
/// </summary> /// <returns>Task to enable asynchronous execution</returns>
/// <param name="context">The context of the event carries information in and results out.</param> public virtual Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
/// <returns>Task to enable asynchronous execution</returns> {
public virtual Task ValidateTokenRequest(OAuthValidateTokenRequestContext context) return OnValidateClientAuthentication.Invoke(context);
{ }
return OnValidateTokenRequest.Invoke(context);
} /// <summary>
/// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// <summary> /// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
/// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize /// validated client redirect URI, should continue processing. An application may add any additional constraints.
/// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token". /// </summary>
/// The claims and properties /// <param name="context">The context of the event carries information in and results out.</param>
/// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization /// <returns>Task to enable asynchronous execution</returns>
/// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different public virtual Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context)
/// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token. {
/// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to return OnValidateAuthorizeRequest.Invoke(context);
/// the access token unmodified. }
/// See also http://tools.ietf.org/html/rfc6749#section-4.1.3
/// </summary> /// <summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// Called for each request to the Authorize endpoint to determine if the request is valid and should continue.
/// <returns>Task to enable asynchronous execution</returns> /// The default behavior when using the OAuthAuthorizationServerProvider is to assume well-formed requests, with
public virtual Task GrantAuthorizationCode(OAuthGrantAuthorizationCodeContext context) /// validated client credentials, should continue processing. An application may add any additional constraints.
{ /// </summary>
return OnGrantAuthorizationCode.Invoke(context); /// <param name="context">The context of the event carries information in and results out.</param>
} /// <returns>Task to enable asynchronous execution</returns>
public virtual Task ValidateTokenRequest(OAuthValidateTokenRequestContext context)
/// <summary> {
/// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token" return OnValidateTokenRequest.Invoke(context);
/// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token". }
/// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties
/// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the /// <summary>
/// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may /// Called when a request to the Token endpoint arrives with a "grant_type" of "authorization_code". This occurs after the Authorize
/// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to /// endpoint as redirected the user-agent back to the client with a "code" parameter, and the client is exchanging that for an "access_token".
/// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to /// The claims and properties
/// the access token unmodified. /// associated with the authorization code are present in the context.Ticket. The application must call context.Validated to instruct the Authorization
/// See also http://tools.ietf.org/html/rfc6749#section-6 /// Server middleware to issue an access token based on those claims and properties. The call to context.Validated may be given a different
/// </summary> /// AuthenticationTicket or ClaimsIdentity in order to control which information flows from authorization code to access token.
/// <param name="context">The context of the event carries information in and results out.</param> /// The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the authorization code to
/// <returns>Task to enable asynchronous execution</returns> /// the access token unmodified.
public virtual Task GrantRefreshToken(OAuthGrantRefreshTokenContext context) /// See also http://tools.ietf.org/html/rfc6749#section-4.1.3
{ /// </summary>
return OnGrantRefreshToken.Invoke(context); /// <param name="context">The context of the event carries information in and results out.</param>
} /// <returns>Task to enable asynchronous execution</returns>
public virtual Task GrantAuthorizationCode(OAuthGrantAuthorizationCodeContext context)
/// <summary> {
/// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password return OnGrantAuthorizationCode.Invoke(context);
/// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and }
/// optional "refresh_token". If the web application supports the
/// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an /// <summary>
/// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated /// Called when a request to the Token endpoint arrives with a "grant_type" of "refresh_token". This occurs if your application has issued a "refresh_token"
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. /// along with the "access_token", and the client is attempting to use the "refresh_token" to acquire a new "access_token", and possibly a new "refresh_token".
/// The default behavior is to reject this grant type. /// To issue a refresh token the an Options.RefreshTokenProvider must be assigned to create the value which is returned. The claims and properties
/// See also http://tools.ietf.org/html/rfc6749#section-4.3.2 /// associated with the refresh token are present in the context.Ticket. The application must call context.Validated to instruct the
/// </summary> /// Authorization Server middleware to issue an access token based on those claims and properties. The call to context.Validated may
/// <param name="context">The context of the event carries information in and results out.</param> /// be given a different AuthenticationTicket or ClaimsIdentity in order to control which information flows from the refresh token to
/// <returns>Task to enable asynchronous execution</returns> /// the access token. The default behavior when using the OAuthAuthorizationServerProvider is to flow information from the refresh token to
public virtual Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) /// the access token unmodified.
{ /// See also http://tools.ietf.org/html/rfc6749#section-6
return OnGrantResourceOwnerCredentials.Invoke(context); /// </summary>
} /// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
/// <summary> public virtual Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
/// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client {
/// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user. return OnGrantRefreshToken.Invoke(context);
/// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call. }
/// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated
/// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers. /// <summary>
/// The default behavior is to reject this grant type. /// Called when a request to the Token endpoint arrives with a "grant_type" of "password". This occurs when the user has provided name and password
/// See also http://tools.ietf.org/html/rfc6749#section-4.4.2 /// credentials directly into the client application's user interface, and the client application is using those to acquire an "access_token" and
/// </summary> /// optional "refresh_token". If the web application supports the
/// <param name="context">The context of the event carries information in and results out.</param> /// resource owner credentials grant type it must validate the context.Username and context.Password as appropriate. To issue an
/// <returns>Task to enable asynchronous execution</returns> /// access token the context.Validated must be called with a new ticket containing the claims about the resource owner which should be associated
public virtual Task GrantClientCredentials(OAuthGrantClientCredentialsContext context) /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers.
{ /// The default behavior is to reject this grant type.
return OnGrantClientCredentials.Invoke(context); /// See also http://tools.ietf.org/html/rfc6749#section-4.3.2
} /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <summary> /// <returns>Task to enable asynchronous execution</returns>
/// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types public virtual Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
/// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket {
/// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be return OnGrantResourceOwnerCredentials.Invoke(context);
/// included they may be added in the final TokenEndpoint call. }
/// See also http://tools.ietf.org/html/rfc6749#section-4.5
/// </summary> /// <summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// Called when a request to the Token endpoint arrives with a "grant_type" of "client_credentials". This occurs when a registered client
/// <returns>Task to enable asynchronous execution</returns> /// application wishes to acquire an "access_token" to interact with protected resources on it's own behalf, rather than on behalf of an authenticated user.
public virtual Task GrantCustomExtension(OAuthGrantCustomExtensionContext context) /// If the web application supports the client credentials it may assume the context.ClientId has been validated by the ValidateClientAuthentication call.
{ /// To issue an access token the context.Validated must be called with a new ticket containing the claims about the client application which should be associated
return OnGrantCustomExtension.Invoke(context); /// with the access token. The application should take appropriate measures to ensure that the endpoint isnt abused by malicious callers.
} /// The default behavior is to reject this grant type.
/// See also http://tools.ietf.org/html/rfc6749#section-4.4.2
/// <summary> /// </summary>
/// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component /// <param name="context">The context of the event carries information in and results out.</param>
/// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the /// <returns>Task to enable asynchronous execution</returns>
/// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the public virtual Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
/// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the {
/// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes return OnGrantClientCredentials.Invoke(context);
/// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the }
/// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing.
/// </summary> /// <summary>
/// <param name="context">The context of the event carries information in and results out.</param> /// Called when a request to the Token andpoint arrives with a "grant_type" of any other value. If the application supports custom grant types
/// <returns>Task to enable asynchronous execution</returns> /// it is entirely responsible for determining if the request should result in an access_token. If context.Validated is called with ticket
public virtual Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context) /// information the response body is produced in the same way as the other standard grant types. If additional response parameters must be
{ /// included they may be added in the final TokenEndpoint call.
return OnAuthorizeEndpoint.Invoke(context); /// See also http://tools.ietf.org/html/rfc6749#section-4.5
} /// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <summary> /// <returns>Task to enable asynchronous execution</returns>
/// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final public virtual Task GrantCustomExtension(OAuthGrantCustomExtensionContext context)
/// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional {
/// response parameters to the Token endpoint's json response body. return OnGrantCustomExtension.Invoke(context);
/// </summary> }
/// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns> /// <summary>
public virtual Task TokenEndpoint(OAuthTokenEndpointContext context) /// Called at the final stage of an incoming Authorize endpoint request before the execution continues on to the web application component
{ /// responsible for producing the html response. Anything present in the OWIN pipeline following the Authorization Server may produce the
return OnTokenEndpoint.Invoke(context); /// response for the Authorize page. If running on IIS any ASP.NET technology running on the server may produce the response for the
} /// Authorize page. If the web application wishes to produce the response directly in the AuthorizeEndpoint call it may write to the
} /// context.Response directly and should call context.RequestCompleted to stop other handlers from executing. If the web application wishes
} /// to grant the authorization directly in the AuthorizeEndpoint call it cay call context.OwinContext.Authentication.SignIn with the
/// appropriate ClaimsIdentity and should call context.RequestCompleted to stop other handlers from executing.
/// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
public virtual Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
{
return OnAuthorizeEndpoint.Invoke(context);
}
/// <summary>
/// Called at the final stage of a successful Token endpoint request. An application may implement this call in order to do any final
/// modification of the claims being used to issue access or refresh tokens. This call may also be used in order to add additional
/// response parameters to the Token endpoint's json response body.
/// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
public virtual Task TokenEndpoint(OAuthTokenEndpointContext context)
{
return OnTokenEndpoint.Invoke(context);
}
/// <summary>
/// Called before the AuthorizationEndpoint redirects its response to the caller. The response could be the
/// token, when using implicit flow or the AuthorizationEndpoint when using authorization code flow.
/// An application may implement this call in order to do any final modification of the claims being used
/// to issue access or refresh tokens. This call may also be used in order to add additional
/// response parameters to the authorization endpoint's response.
/// </summary>
/// <param name="context">The context of the event carries information in and results out.</param>
/// <returns>Task to enable asynchronous execution</returns>
public virtual Task AuthorizationEndpointResponse(OAuthAuthorizationEndpointResponseContext context)
{
return OnAuthorizationEndpointResponse.Invoke(context);
}
/// <summary>
/// Called before the TokenEndpoint redirects its response to the caller.
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public virtual Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
{
return OnTokenEndpointResponse.Invoke(context); ;
}
}
}

Просмотреть файл

@ -0,0 +1,78 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Security.Claims;
using Microsoft.Owin.Security.OAuth.Messages;
using Microsoft.Owin.Security.Provider;
namespace Microsoft.Owin.Security.OAuth
{
/// <summary>
/// Provides context information when processing an Authorization Response
/// </summary>
public class OAuthAuthorizationEndpointResponseContext: EndpointContext<OAuthAuthorizationServerOptions>
{
/// <summary>
/// Initializes a new instance of the <see cref="OAuthAuthorizationEndpointResponseContext"/> class
/// </summary>
/// <param name="context"></param>
/// <param name="options"></param>
/// <param name="ticket"></param>
/// <param name="tokenEndpointRequest"></param>
public OAuthAuthorizationEndpointResponseContext(
IOwinContext context,
OAuthAuthorizationServerOptions options,
AuthenticationTicket ticket,
AuthorizeEndpointRequest authorizeEndpointRequest,
string accessToken,
string authorizationCode)
: base(context, options)
{
if (ticket == null)
{
throw new ArgumentNullException("ticket");
}
Identity = ticket.Identity;
Properties = ticket.Properties;
AuthorizeEndpointRequest = authorizeEndpointRequest;
AdditionalResponseParameters = new Dictionary<string, object>(StringComparer.Ordinal);
AccessToken = accessToken;
AuthorizationCode = authorizationCode;
}
/// <summary>
/// Gets the identity of the resource owner.
/// </summary>
public ClaimsIdentity Identity { get; private set; }
/// <summary>
/// Dictionary containing the state of the authentication session.
/// </summary>
public AuthenticationProperties Properties { get; private set; }
/// <summary>
/// Gets information about the authorize endpoint request.
/// </summary>
public AuthorizeEndpointRequest AuthorizeEndpointRequest { get; private set; }
/// <summary>
/// Enables additional values to be appended to the token response.
/// </summary>
public IDictionary<string, object> AdditionalResponseParameters { get; private set; }
/// <summary>
/// The serialized Access-Token. Depending on the flow, it can be null.
/// </summary>
public string AccessToken { get; private set; }
/// <summary>
/// The created Authorization-Code. Depending on the flow, it can be null.
/// </summary>
public string AuthorizationCode { get; private set; }
}
}

Просмотреть файл

@ -1,79 +1,79 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Claims; using System.Security.Claims;
using Microsoft.Owin.Security.OAuth.Messages; using Microsoft.Owin.Security.OAuth.Messages;
using Microsoft.Owin.Security.Provider; using Microsoft.Owin.Security.Provider;
namespace Microsoft.Owin.Security.OAuth namespace Microsoft.Owin.Security.OAuth
{ {
/// <summary> /// <summary>
/// Provides context information used when processing an OAuth token request. /// Provides context information used when processing an OAuth token request.
/// </summary> /// </summary>
public class OAuthTokenEndpointContext : EndpointContext<OAuthAuthorizationServerOptions> public class OAuthTokenEndpointContext : EndpointContext<OAuthAuthorizationServerOptions>
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="OAuthTokenEndpointContext"/> class /// Initializes a new instance of the <see cref="OAuthTokenEndpointContext"/> class
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <param name="options"></param> /// <param name="options"></param>
/// <param name="ticket"></param> /// <param name="ticket"></param>
/// <param name="tokenEndpointRequest"></param> /// <param name="tokenEndpointRequest"></param>
public OAuthTokenEndpointContext( public OAuthTokenEndpointContext(
IOwinContext context, IOwinContext context,
OAuthAuthorizationServerOptions options, OAuthAuthorizationServerOptions options,
AuthenticationTicket ticket, AuthenticationTicket ticket,
TokenEndpointRequest tokenEndpointRequest) TokenEndpointRequest tokenEndpointRequest)
: base(context, options) : base(context, options)
{ {
if (ticket == null) if (ticket == null)
{ {
throw new ArgumentNullException("ticket"); throw new ArgumentNullException("ticket");
} }
Identity = ticket.Identity; Identity = ticket.Identity;
Properties = ticket.Properties; Properties = ticket.Properties;
TokenEndpointRequest = tokenEndpointRequest; TokenEndpointRequest = tokenEndpointRequest;
AdditionalResponseParameters = new Dictionary<string, object>(StringComparer.Ordinal); AdditionalResponseParameters = new Dictionary<string, object>(StringComparer.Ordinal);
TokenIssued = Identity != null; TokenIssued = Identity != null;
} }
/// <summary> /// <summary>
/// Gets the identity of the resource owner. /// Gets the identity of the resource owner.
/// </summary> /// </summary>
public ClaimsIdentity Identity { get; private set; } public ClaimsIdentity Identity { get; private set; }
/// <summary> /// <summary>
/// Dictionary containing the state of the authentication session. /// Dictionary containing the state of the authentication session.
/// </summary> /// </summary>
public AuthenticationProperties Properties { get; private set; } public AuthenticationProperties Properties { get; private set; }
/// <summary> /// <summary>
/// Gets information about the token endpoint request. /// Gets information about the token endpoint request.
/// </summary> /// </summary>
public TokenEndpointRequest TokenEndpointRequest { get; set; } public TokenEndpointRequest TokenEndpointRequest { get; set; }
/// <summary> /// <summary>
/// Gets whether or not the token should be issued. /// Gets whether or not the token should be issued.
/// </summary> /// </summary>
public bool TokenIssued { get; private set; } public bool TokenIssued { get; private set; }
/// <summary> /// <summary>
/// Enables additional values to be appended to the token response. /// Enables additional values to be appended to the token response.
/// </summary> /// </summary>
public IDictionary<string, object> AdditionalResponseParameters { get; private set; } public IDictionary<string, object> AdditionalResponseParameters { get; private set; }
/// <summary> /// <summary>
/// Issues the token. /// Issues the token.
/// </summary> /// </summary>
/// <param name="identity"></param> /// <param name="identity"></param>
/// <param name="properties"></param> /// <param name="properties"></param>
public void Issue(ClaimsIdentity identity, AuthenticationProperties properties) public void Issue(ClaimsIdentity identity, AuthenticationProperties properties)
{ {
Identity = identity; Identity = identity;
Properties = properties; Properties = properties;
TokenIssued = true; TokenIssued = true;
} }
} }
} }

Просмотреть файл

@ -0,0 +1,89 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Security.Claims;
using Microsoft.Owin.Security.OAuth.Messages;
using Microsoft.Owin.Security.Provider;
namespace Microsoft.Owin.Security.OAuth
{
/// <summary>
/// Provides context information used at the end of a token-endpoint-request.
/// </summary>
public class OAuthTokenEndpointResponseContext : EndpointContext<OAuthAuthorizationServerOptions>
{
/// <summary>
/// Initializes a new instance of the <see cref="OAuthTokenEndpointResponseContext"/> class
/// </summary>
/// <param name="context"></param>
/// <param name="options"></param>
/// <param name="ticket"></param>
/// <param name="tokenEndpointRequest"></param>
public OAuthTokenEndpointResponseContext(
IOwinContext context,
OAuthAuthorizationServerOptions options,
AuthenticationTicket ticket,
TokenEndpointRequest tokenEndpointRequest,
string accessToken,
IDictionary<string, object> additionalResponseParameters)
: base(context, options)
{
if (ticket == null)
{
throw new ArgumentNullException("ticket");
}
Identity = ticket.Identity;
Properties = ticket.Properties;
TokenEndpointRequest = tokenEndpointRequest;
AdditionalResponseParameters = new Dictionary<string, object>(StringComparer.Ordinal);
TokenIssued = Identity != null;
AccessToken = accessToken;
AdditionalResponseParameters = additionalResponseParameters;
}
/// <summary>
/// Gets the identity of the resource owner.
/// </summary>
public ClaimsIdentity Identity { get; private set; }
/// <summary>
/// Dictionary containing the state of the authentication session.
/// </summary>
public AuthenticationProperties Properties { get; private set; }
/// <summary>
/// The issued Access-Token
/// </summary>
public string AccessToken { get; private set; }
/// <summary>
/// Gets information about the token endpoint request.
/// </summary>
public TokenEndpointRequest TokenEndpointRequest { get; set; }
/// <summary>
/// Gets whether or not the token should be issued.
/// </summary>
public bool TokenIssued { get; private set; }
/// <summary>
/// Enables additional values to be appended to the token response.
/// </summary>
public IDictionary<string, object> AdditionalResponseParameters { get; private set; }
/// <summary>
/// Issues the token.
/// </summary>
/// <param name="identity"></param>
/// <param name="properties"></param>
public void Issue(ClaimsIdentity identity, AuthenticationProperties properties)
{
Identity = identity;
Properties = properties;
TokenIssued = true;
}
}
}