diff --git a/OpenIddict.sln b/OpenIddict.sln
index af4f3f92..bca05fc1 100644
--- a/OpenIddict.sln
+++ b/OpenIddict.sln
@@ -11,9 +11,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{5FC71D6A-A
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict", "src\OpenIddict\OpenIddict.csproj", "{80A8D6CE-C29A-4602-9844-D51FEF9C33C8}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc.Client", "sandbox\Mvc.Client\Mvc.Client.csproj", "{96B22EB9-771A-4DCA-B828-E6EA2774CF1B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Sandbox.AspNetCore.Client", "sandbox\OpenIddict.Sandbox.AspNetCore.Client\OpenIddict.Sandbox.AspNetCore.Client.csproj", "{96B22EB9-771A-4DCA-B828-E6EA2774CF1B}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc.Server", "sandbox\Mvc.Server\Mvc.Server.csproj", "{7CBEAFD2-E3D0-4424-9B78-E87AB52327A6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Sandbox.AspNetCore.Server", "sandbox\OpenIddict.Sandbox.AspNetCore.Server\OpenIddict.Sandbox.AspNetCore.Server.csproj", "{7CBEAFD2-E3D0-4424-9B78-E87AB52327A6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.EntityFrameworkCore", "src\OpenIddict.EntityFrameworkCore\OpenIddict.EntityFrameworkCore.csproj", "{D2450929-ED0E-420D-B475-327924F9701C}"
EndProject
@@ -111,6 +111,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Quartz", "src\Op
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Quartz.Tests", "test\OpenIddict.Quartz.Tests\OpenIddict.Quartz.Tests.csproj", "{01420929-33B8-4B60-A618-8C8B5F139630}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Client", "src\OpenIddict.Client\OpenIddict.Client.csproj", "{A5654E58-18D3-4148-B210-F4637AD57D48}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Client.AspNetCore", "src\OpenIddict.Client.AspNetCore\OpenIddict.Client.AspNetCore.csproj", "{C92FB132-96A7-47C5-BBC2-0FC3EF4E0205}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenIddict.Client.SystemNetHttp", "src\OpenIddict.Client.SystemNetHttp\OpenIddict.Client.SystemNetHttp.csproj", "{00E19194-427A-42BC-BC72-519CF9C2B7D1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -257,6 +263,18 @@ Global
{01420929-33B8-4B60-A618-8C8B5F139630}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01420929-33B8-4B60-A618-8C8B5F139630}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01420929-33B8-4B60-A618-8C8B5F139630}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A5654E58-18D3-4148-B210-F4637AD57D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A5654E58-18D3-4148-B210-F4637AD57D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A5654E58-18D3-4148-B210-F4637AD57D48}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A5654E58-18D3-4148-B210-F4637AD57D48}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C92FB132-96A7-47C5-BBC2-0FC3EF4E0205}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C92FB132-96A7-47C5-BBC2-0FC3EF4E0205}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C92FB132-96A7-47C5-BBC2-0FC3EF4E0205}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C92FB132-96A7-47C5-BBC2-0FC3EF4E0205}.Release|Any CPU.Build.0 = Release|Any CPU
+ {00E19194-427A-42BC-BC72-519CF9C2B7D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {00E19194-427A-42BC-BC72-519CF9C2B7D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {00E19194-427A-42BC-BC72-519CF9C2B7D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {00E19194-427A-42BC-BC72-519CF9C2B7D1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -297,6 +315,9 @@ Global
{D94B10D3-3DD3-4829-B305-17C48833AB33} = {5FC71D6A-A994-4F62-977F-88A7D25379D7}
{FD150A90-1997-45C7-9EBE-7C6E62E464E8} = {D544447C-D701-46BB-9A5B-C76C612A596B}
{01420929-33B8-4B60-A618-8C8B5F139630} = {5FC71D6A-A994-4F62-977F-88A7D25379D7}
+ {A5654E58-18D3-4148-B210-F4637AD57D48} = {D544447C-D701-46BB-9A5B-C76C612A596B}
+ {C92FB132-96A7-47C5-BBC2-0FC3EF4E0205} = {D544447C-D701-46BB-9A5B-C76C612A596B}
+ {00E19194-427A-42BC-BC72-519CF9C2B7D1} = {D544447C-D701-46BB-9A5B-C76C612A596B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A710059F-0466-4D48-9B3A-0EF4F840B616}
diff --git a/Packages.props b/Packages.props
index 791771b3..f90d7b4f 100644
--- a/Packages.props
+++ b/Packages.props
@@ -5,8 +5,9 @@
-
-
+
+
+
diff --git a/sandbox/Mvc.Client/Controllers/AuthenticationController.cs b/sandbox/Mvc.Client/Controllers/AuthenticationController.cs
deleted file mode 100644
index f6f18f48..00000000
--- a/sandbox/Mvc.Client/Controllers/AuthenticationController.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using Microsoft.AspNetCore.Authentication;
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Mvc;
-
-namespace Mvc.Client.Controllers;
-
-public class AuthenticationController : Controller
-{
- [HttpGet("~/login")]
- public ActionResult LogIn()
- {
- // Instruct the OIDC client middleware to redirect the user agent to the identity provider.
- // Note: the authenticationType parameter must match the value configured in Startup.cs
- return Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectDefaults.AuthenticationScheme);
- }
-
- [HttpGet("~/logout"), HttpPost("~/logout")]
- public ActionResult LogOut()
- {
- // Instruct the cookies middleware to delete the local cookie created when the user agent
- // is redirected from the identity provider after a successful authorization flow and
- // to redirect the user agent to the identity provider to sign out.
- return SignOut(CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
- }
-}
diff --git a/sandbox/Mvc.Client/Startup.cs b/sandbox/Mvc.Client/Startup.cs
deleted file mode 100644
index 74eb9a74..00000000
--- a/sandbox/Mvc.Client/Startup.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace Mvc.Client;
-
-public class Startup
-{
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddAuthentication(options =>
- {
- options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
- })
-
- .AddCookie(options =>
- {
- options.LoginPath = "/login";
- options.ExpireTimeSpan = TimeSpan.FromMinutes(50);
- options.SlidingExpiration = false;
- })
-
- .AddOpenIdConnect(options =>
- {
- // Note: these settings must match the application details
- // inserted in the database at the server level.
- options.ClientId = "mvc";
- options.ClientSecret = "901564A5-E7FE-42CB-B10D-61EF6A8F3654";
-
- options.RequireHttpsMetadata = false;
- options.GetClaimsFromUserInfoEndpoint = true;
- options.SaveTokens = true;
-
- // Use the authorization code flow.
- options.ResponseType = OpenIdConnectResponseType.Code;
- options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
-
- // Note: setting the Authority allows the OIDC client middleware to automatically
- // retrieve the identity provider's configuration and spare you from setting
- // the different endpoints URIs or the token validation parameters explicitly.
- options.Authority = "https://localhost:44395/";
-
- options.Scope.Add("email");
- options.Scope.Add("roles");
- options.Scope.Add("offline_access");
- options.Scope.Add("demo_api");
-
- // Disable the built-in JWT claims mapping feature.
- options.MapInboundClaims = false;
-
- options.TokenValidationParameters.NameClaimType = "name";
- options.TokenValidationParameters.RoleClaimType = "role";
-
- options.AccessDeniedPath = "/";
- });
-
- services.AddHttpClient();
-
- services.AddControllersWithViews();
- }
-
- public void Configure(IApplicationBuilder app)
- {
- app.UseDeveloperExceptionPage();
-
- app.UseStaticFiles();
-
- app.UseRouting();
-
- app.UseAuthentication();
- app.UseAuthorization();
-
- app.UseEndpoints(options =>
- {
- options.MapControllers();
- options.MapDefaultControllerRoute();
- });
- }
-}
diff --git a/sandbox/Mvc.Server/Views/_ViewImports.cshtml b/sandbox/Mvc.Server/Views/_ViewImports.cshtml
deleted file mode 100644
index e8080468..00000000
--- a/sandbox/Mvc.Server/Views/_ViewImports.cshtml
+++ /dev/null
@@ -1,8 +0,0 @@
-@using Mvc.Server
-@using Mvc.Server.Models
-@using Mvc.Server.ViewModels.Account
-@using Mvc.Server.ViewModels.Authorization
-@using Mvc.Server.ViewModels.Manage
-@using Mvc.Server.ViewModels.Shared
-@using Microsoft.AspNetCore.Identity
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/AuthenticationController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/AuthenticationController.cs
new file mode 100644
index 00000000..67ef74a8
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/AuthenticationController.cs
@@ -0,0 +1,139 @@
+using System.Security.Claims;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Mvc;
+using OpenIddict.Client.AspNetCore;
+using static OpenIddict.Abstractions.OpenIddictConstants;
+
+namespace OpenIddict.Sandbox.AspNetCore.Client.Controllers;
+
+public class AuthenticationController : Controller
+{
+ [HttpGet("~/login")]
+ public ActionResult LogIn(string returnUrl)
+ {
+ var properties = new AuthenticationProperties(new Dictionary
+ {
+ // Note: when only one client is registered in the client options,
+ // setting the issuer property is not required and can be omitted.
+ [OpenIddictClientAspNetCoreConstants.Properties.Issuer] = "https://localhost:44395/"
+ })
+ {
+ // Only allow local return URLs to prevent open redirect attacks.
+ RedirectUri = Url.IsLocalUrl(returnUrl) ? returnUrl : "/"
+ };
+
+ // Ask the OpenIddict client middleware to redirect the user agent to the identity provider.
+ return Challenge(properties, OpenIddictClientAspNetCoreDefaults.AuthenticationScheme);
+ }
+
+ [HttpGet("~/signin-oidc"), HttpPost("~/signin-oidc")]
+ public async Task Callback()
+ {
+ // Retrieve the authorization data validated by OpenIddict as part of the callback handling.
+ var result = await HttpContext.AuthenticateAsync(OpenIddictClientAspNetCoreDefaults.AuthenticationScheme);
+
+ // Multiple strategies exist to handle OAuth 2.0/OpenID Connect callbacks, each with their pros and cons:
+ //
+ // * Directly using the tokens to perform the necessary action(s) on behalf of the user, which is suitable
+ // for applications that don't need a long-term access to the user's resources or don't want to store
+ // access/refresh tokens in a database or in an authentication cookie (which has security implications).
+ // It is also suitable for applications that don't need to authenticate users but only need to perform
+ // action(s) on their behalf by making API calls using the access tokens returned by the remote server.
+ //
+ // * Storing the external claims/tokens in a database (and optionally keeping the essentials claims in an
+ // authentication cookie so that cookie size limits are not hit). For the applications that use ASP.NET
+ // Core Identity, the UserManager.SetAuthenticationTokenAsync() API can be used to store external tokens.
+ //
+ // Note: in this case, it's recommended to use column encryption to protect the tokens in the database.
+ //
+ // * Storing the external claims/tokens in an authentication cookie, which doesn't require having
+ // a user database but may be affected by the cookie size limits enforced by most browser vendors
+ // (e.g Safari for macOS and Safari for iOS/iPadOS enforce a per-domain 4KB limit for all cookies).
+ //
+ // Note: this is the approach used here, but the external claims are first filtered to only persist
+ // a few claims like the user identifier. The same approach is used to store the access/refresh tokens.
+
+ // Important: if the remote server doesn't support OpenID Connect and doesn't expose a userinfo endpoint,
+ // result.Principal.Identity will represent an unauthenticated identity and won't contain any claim.
+ //
+ // Such identities cannot be used as-is to build an authentication cookie in ASP.NET Core (as the
+ // antiforgery stack requires at least a name claim to bind CSRF cookies to the user's identity) but
+ // the access/refresh tokens can be retrieved using result.Properties.GetTokens() to make API calls.
+ if (result.Principal.Identity is not ClaimsIdentity { IsAuthenticated: true })
+ {
+ throw new InvalidOperationException("The external authorization data cannot be used for authentication.");
+ }
+
+ // Build an identity based on the external claims and that will be used to create the authentication cookie.
+ //
+ // By default, all claims extracted during the authorization dance are available. The claims collection stored
+ // in the cookie can be filtered out or mapped to different names depending the claim name or its issuer.
+ var claims = result.Principal.Claims
+ .Select(claim => claim switch
+ {
+ // Applications can map non-standard claims issued by specific issuers to a standard equivalent.
+ { Type: "non_standard_user_id", Issuer: "https://example.com/" }
+ => new Claim(Claims.Subject, claim.Value, claim.ValueType, claim.Issuer),
+
+ _ => claim
+ })
+ .Where(claim => claim switch
+ {
+ // Preserve the "name" and "sub" claims.
+ { Type: Claims.Name or Claims.Subject } => true,
+
+ // Applications that use multiple client registrations can filter claims based on the issuer.
+ { Type: "custom_claim", Issuer: "https://example.com/" } => true,
+
+ // Don't preserve the other claims.
+ _ => false
+ });
+
+ var identity = new ClaimsIdentity(claims,
+ authenticationType: CookieAuthenticationDefaults.AuthenticationScheme,
+ nameType: Claims.Name,
+ roleType: Claims.Role);
+
+ // If needed, the tokens returned by the authorization server can be stored in the authentication cookie.
+ // To make cookies less heavy, tokens that are not used can be filtered out before creating the cookie.
+ var tokens = result.Properties.GetTokens().Where(token => token switch
+ {
+ // Preserve the access and refresh tokens returned in the token response, if available.
+ {
+ Name: OpenIddictClientAspNetCoreConstants.Tokens.BackchannelAccessToken or
+ OpenIddictClientAspNetCoreConstants.Tokens.BackchannelRefreshToken
+ } => true,
+
+ // Ignore the other tokens.
+ _ => false
+ });
+
+ var properties = new AuthenticationProperties
+ {
+ RedirectUri = result.Properties.RedirectUri
+ };
+
+ properties.StoreTokens(tokens);
+
+ // Note: "return SignIn(...)" cannot be directly used in this case, as the cookies handler doesn't allow
+ // redirecting from an endpoint that doesn't match the path set in CookieAuthenticationOptions.LoginPath.
+ // For more information about this restriction, visit https://github.com/dotnet/aspnetcore/issues/36934.
+ await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), properties);
+
+ return Redirect(properties.RedirectUri ?? "/");
+ }
+
+ [HttpGet("~/logout"), HttpPost("~/logout")]
+ public ActionResult LogOut()
+ {
+ // Ask the cookies middleware to delete the local cookie created when the user agent
+ // is redirected from the identity provider after a successful authorization flow.
+ var properties = new AuthenticationProperties
+ {
+ RedirectUri = "/"
+ };
+
+ return SignOut(properties, CookieAuthenticationDefaults.AuthenticationScheme);
+ }
+}
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/ErrorController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/ErrorController.cs
new file mode 100644
index 00000000..d71cbcee
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/ErrorController.cs
@@ -0,0 +1,32 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Mvc;
+using OpenIddict.Sandbox.AspNetCore.Client.ViewModels.Shared;
+
+namespace OpenIddict.Sandbox.AspNetCore.Client;
+
+public class ErrorController : Controller
+{
+ [HttpGet, HttpPost, Route("~/error")]
+ public IActionResult Error()
+ {
+ // If the error was not caused by an invalid
+ // OIDC request, display a generic error page.
+ var response = HttpContext.GetOpenIddictClientResponse();
+ if (response is null)
+ {
+ return View(new ErrorViewModel());
+ }
+
+ return View(new ErrorViewModel
+ {
+ Error = response.Error,
+ ErrorDescription = response.ErrorDescription
+ });
+ }
+}
diff --git a/sandbox/Mvc.Client/Controllers/HomeController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/HomeController.cs
similarity index 71%
rename from sandbox/Mvc.Client/Controllers/HomeController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/HomeController.cs
index 5dbe668c..cc73ed83 100644
--- a/sandbox/Mvc.Client/Controllers/HomeController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Controllers/HomeController.cs
@@ -3,9 +3,9 @@ using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
+using OpenIddict.Client.AspNetCore;
-namespace Mvc.Client.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Client.Controllers;
public class HomeController : Controller
{
@@ -20,12 +20,8 @@ public class HomeController : Controller
[Authorize, HttpPost("~/")]
public async Task Index(CancellationToken cancellationToken)
{
- var token = await HttpContext.GetTokenAsync(CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectParameterNames.AccessToken);
- if (string.IsNullOrEmpty(token))
- {
- throw new InvalidOperationException("The access token cannot be found in the authentication ticket. " +
- "Make sure that SaveTokens is set to true in the OIDC options.");
- }
+ var token = await HttpContext.GetTokenAsync(CookieAuthenticationDefaults.AuthenticationScheme,
+ OpenIddictClientAspNetCoreConstants.Tokens.BackchannelAccessToken);
using var client = _httpClientFactory.CreateClient();
diff --git a/sandbox/Mvc.Client/Mvc.Client.csproj b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/OpenIddict.Sandbox.AspNetCore.Client.csproj
similarity index 71%
rename from sandbox/Mvc.Client/Mvc.Client.csproj
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/OpenIddict.Sandbox.AspNetCore.Client.csproj
index 4fdb3060..59fa1395 100644
--- a/sandbox/Mvc.Client/Mvc.Client.csproj
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/OpenIddict.Sandbox.AspNetCore.Client.csproj
@@ -6,6 +6,10 @@
disable
+
+
+
+
diff --git a/sandbox/Mvc.Server/Program.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Program.cs
similarity index 86%
rename from sandbox/Mvc.Server/Program.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Program.cs
index 8624d7c0..d35cfa85 100644
--- a/sandbox/Mvc.Server/Program.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Program.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server;
+namespace OpenIddict.Sandbox.AspNetCore.Client;
public static class Program
{
diff --git a/sandbox/Mvc.Client/Properties/launchSettings.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Properties/launchSettings.json
similarity index 92%
rename from sandbox/Mvc.Client/Properties/launchSettings.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Properties/launchSettings.json
index 1c7dcc5a..d85eb522 100644
--- a/sandbox/Mvc.Client/Properties/launchSettings.json
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Properties/launchSettings.json
@@ -15,7 +15,7 @@
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "Mvc.Client": {
+ "OpenIddict.Sandbox.AspNetCore.Client": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Startup.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Startup.cs
new file mode 100644
index 00000000..5ce31718
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Startup.cs
@@ -0,0 +1,80 @@
+using Microsoft.AspNetCore.Authentication.Cookies;
+using OpenIddict.Abstractions;
+using OpenIddict.Client;
+using static OpenIddict.Abstractions.OpenIddictConstants;
+
+namespace OpenIddict.Sandbox.AspNetCore.Client;
+
+public class Startup
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddAuthentication(options =>
+ {
+ options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
+ })
+
+ .AddCookie(options =>
+ {
+ options.LoginPath = "/login";
+ options.LogoutPath = "/logout";
+ options.ExpireTimeSpan = TimeSpan.FromMinutes(50);
+ options.SlidingExpiration = false;
+ });
+
+ services.AddOpenIddict()
+ .AddClient(options =>
+ {
+ // Add a client registration matching the client application definition in the server project.
+ options.AddRegistration(new OpenIddictClientRegistration
+ {
+ Issuer = new Uri("https://localhost:44395/", UriKind.Absolute),
+
+ ClientId = "mvc",
+ ClientSecret = "901564A5-E7FE-42CB-B10D-61EF6A8F3654",
+ RedirectUri = new Uri("https://localhost:44381/signin-oidc", UriKind.Absolute),
+ Scopes = { Scopes.Email, Scopes.Profile, Scopes.OfflineAccess, "demo_api" }
+ });
+
+ // Enable the redirection endpoint needed to handle the callback stage.
+ options.SetRedirectionEndpointUris(new Uri("/signin-oidc", UriKind.Relative));
+
+ // Register the ASP.NET Core host and configure the ASP.NET Core-specific options.
+ options.UseAspNetCore()
+ .EnableStatusCodePagesIntegration()
+ .EnableRedirectionEndpointPassthrough();
+
+ // Register the signing and encryption credentials used to protect
+ // sensitive data like the state tokens produced by OpenIddict.
+ options.AddDevelopmentEncryptionCertificate()
+ .AddDevelopmentSigningCertificate();
+
+ // Register the System.Net.Http integration.
+ options.UseSystemNetHttp();
+ });
+
+ services.AddHttpClient();
+
+ services.AddControllersWithViews();
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ app.UseDeveloperExceptionPage();
+
+ app.UseStaticFiles();
+
+ app.UseStatusCodePagesWithReExecute("/error");
+
+ app.UseRouting();
+
+ app.UseAuthentication();
+ app.UseAuthorization();
+
+ app.UseEndpoints(options =>
+ {
+ options.MapControllers();
+ options.MapDefaultControllerRoute();
+ });
+ }
+}
diff --git a/sandbox/Mvc.Server/ViewModels/Shared/ErrorViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/ViewModels/Shared/ErrorViewModel.cs
similarity index 78%
rename from sandbox/Mvc.Server/ViewModels/Shared/ErrorViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/ViewModels/Shared/ErrorViewModel.cs
index 62b9851a..8e0e68be 100644
--- a/sandbox/Mvc.Server/ViewModels/Shared/ErrorViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/ViewModels/Shared/ErrorViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Shared;
+namespace OpenIddict.Sandbox.AspNetCore.Client.ViewModels.Shared;
public class ErrorViewModel
{
diff --git a/sandbox/Mvc.Server/Views/Shared/Error.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/Error.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Shared/Error.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/Error.cshtml
diff --git a/sandbox/Mvc.Client/Views/Shared/Home.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/Home.cshtml
similarity index 100%
rename from sandbox/Mvc.Client/Views/Shared/Home.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/Home.cshtml
diff --git a/sandbox/Mvc.Client/Views/Shared/_Layout.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/_Layout.cshtml
similarity index 80%
rename from sandbox/Mvc.Client/Views/Shared/_Layout.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/_Layout.cshtml
index 3c29994c..ab3a76b4 100644
--- a/sandbox/Mvc.Client/Views/Shared/_Layout.cshtml
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/Shared/_Layout.cshtml
@@ -7,7 +7,7 @@
- Mvc.Client
+ OpenIddict.Sandbox.AspNetCore.Client
@@ -16,7 +16,7 @@
-
Your application (Mvc.Client)
+
Your application (OpenIddict.Sandbox.AspNetCore.Client)
@RenderBody()
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/_ViewImports.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/_ViewImports.cshtml
new file mode 100644
index 00000000..bb090cca
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/_ViewImports.cshtml
@@ -0,0 +1,3 @@
+@using OpenIddict.Sandbox.AspNetCore.Client
+@using OpenIddict.Sandbox.AspNetCore.Client.ViewModels.Shared
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/sandbox/Mvc.Client/Views/_ViewStart.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/_ViewStart.cshtml
similarity index 100%
rename from sandbox/Mvc.Client/Views/_ViewStart.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/Views/_ViewStart.cshtml
diff --git a/sandbox/Mvc.Client/appsettings.Development.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/appsettings.Development.json
similarity index 100%
rename from sandbox/Mvc.Client/appsettings.Development.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/appsettings.Development.json
diff --git a/sandbox/Mvc.Client/appsettings.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/appsettings.json
similarity index 100%
rename from sandbox/Mvc.Client/appsettings.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/appsettings.json
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Client/web.config b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/web.config
new file mode 100644
index 00000000..c128c496
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/web.config
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.eot b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.eot
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.eot
diff --git a/sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.svg b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.svg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.svg
diff --git a/sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.ttf b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.ttf
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.ttf
diff --git a/sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.woff b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/fonts/glyphicons-halflings-regular.woff
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/fonts/glyphicons-halflings-regular.woff
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/bootstrap.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/bootstrap.js
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/bootstrap.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/bootstrap.js
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/bootstrap.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/bootstrap.min.js
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/bootstrap.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/bootstrap.min.js
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.intellisense.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.intellisense.js
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.intellisense.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.intellisense.js
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.js
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.js
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.min.js
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.min.js
diff --git a/sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.min.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.min.map
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/scripts/jquery-1.9.0.min.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/scripts/jquery-1.9.0.min.map
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.css
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.css
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.css.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.css.map
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.css.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.css.map
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.min.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.min.css
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap-theme.min.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap-theme.min.css
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.css
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.css
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.css.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.css.map
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.css.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.css.map
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.min.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.min.css
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/bootstrap.min.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/bootstrap.min.css
diff --git a/sandbox/Mvc.Client/wwwroot/stylesheets/jumbotron-narrow.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/jumbotron-narrow.css
similarity index 100%
rename from sandbox/Mvc.Client/wwwroot/stylesheets/jumbotron-narrow.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Client/wwwroot/stylesheets/jumbotron-narrow.css
diff --git a/sandbox/Mvc.Server/.bowerrc b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/.bowerrc
similarity index 100%
rename from sandbox/Mvc.Server/.bowerrc
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/.bowerrc
diff --git a/sandbox/Mvc.Server/Controllers/AccountController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AccountController.cs
similarity index 98%
rename from sandbox/Mvc.Server/Controllers/AccountController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AccountController.cs
index 08cb0465..9e275281 100644
--- a/sandbox/Mvc.Server/Controllers/AccountController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AccountController.cs
@@ -3,11 +3,11 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
-using Mvc.Server.Models;
-using Mvc.Server.Services;
-using Mvc.Server.ViewModels.Account;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Services;
+using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
-namespace Mvc.Server.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers;
[Authorize]
public class AccountController : Controller
diff --git a/sandbox/Mvc.Server/Controllers/AuthorizationController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AuthorizationController.cs
similarity index 99%
rename from sandbox/Mvc.Server/Controllers/AuthorizationController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AuthorizationController.cs
index 7556377e..6d7f9dcc 100644
--- a/sandbox/Mvc.Server/Controllers/AuthorizationController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/AuthorizationController.cs
@@ -11,14 +11,14 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
-using Mvc.Server.Helpers;
-using Mvc.Server.Models;
-using Mvc.Server.ViewModels.Authorization;
+using OpenIddict.Sandbox.AspNetCore.Server.Helpers;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Authorization;
using OpenIddict.Abstractions;
using OpenIddict.Server.AspNetCore;
using static OpenIddict.Abstractions.OpenIddictConstants;
-namespace Mvc.Server;
+namespace OpenIddict.Sandbox.AspNetCore.Server;
public class AuthorizationController : Controller
{
diff --git a/sandbox/Mvc.Server/Controllers/ErrorController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ErrorController.cs
similarity index 88%
rename from sandbox/Mvc.Server/Controllers/ErrorController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ErrorController.cs
index 116953ee..da824852 100644
--- a/sandbox/Mvc.Server/Controllers/ErrorController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ErrorController.cs
@@ -6,9 +6,9 @@
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Mvc;
-using Mvc.Server.ViewModels.Shared;
+using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Shared;
-namespace Mvc.Server;
+namespace OpenIddict.Sandbox.AspNetCore.Server;
public class ErrorController : Controller
{
diff --git a/sandbox/Mvc.Server/Controllers/HomeController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/HomeController.cs
similarity index 89%
rename from sandbox/Mvc.Server/Controllers/HomeController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/HomeController.cs
index 1bdf3f56..bd765a1e 100644
--- a/sandbox/Mvc.Server/Controllers/HomeController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/HomeController.cs
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc;
-namespace Mvc.Server.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers;
public class HomeController : Controller
{
diff --git a/sandbox/Mvc.Server/Controllers/ManageController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ManageController.cs
similarity index 98%
rename from sandbox/Mvc.Server/Controllers/ManageController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ManageController.cs
index 00938b93..96626d86 100644
--- a/sandbox/Mvc.Server/Controllers/ManageController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ManageController.cs
@@ -1,11 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
-using Mvc.Server.Models;
-using Mvc.Server.Services;
-using Mvc.Server.ViewModels.Manage;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Services;
+using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
-namespace Mvc.Server.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers;
[Authorize]
public class ManageController : Controller
diff --git a/sandbox/Mvc.Server/Controllers/ResourceController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ResourceController.cs
similarity index 95%
rename from sandbox/Mvc.Server/Controllers/ResourceController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ResourceController.cs
index d9acb0be..92bd7157 100644
--- a/sandbox/Mvc.Server/Controllers/ResourceController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/ResourceController.cs
@@ -2,12 +2,12 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
-using Mvc.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
using OpenIddict.Abstractions;
using OpenIddict.Validation.AspNetCore;
using static OpenIddict.Abstractions.OpenIddictConstants;
-namespace Mvc.Server.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers;
[Route("api")]
public class ResourceController : Controller
diff --git a/sandbox/Mvc.Server/Controllers/UserinfoController.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/UserinfoController.cs
similarity index 95%
rename from sandbox/Mvc.Server/Controllers/UserinfoController.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/UserinfoController.cs
index cd499639..44b874da 100644
--- a/sandbox/Mvc.Server/Controllers/UserinfoController.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Controllers/UserinfoController.cs
@@ -2,12 +2,12 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
-using Mvc.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
using OpenIddict.Abstractions;
using OpenIddict.Server.AspNetCore;
using static OpenIddict.Abstractions.OpenIddictConstants;
-namespace Mvc.Server.Controllers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers;
public class UserinfoController : Controller
{
diff --git a/sandbox/Mvc.Server/Helpers/AsyncEnumerableExtensions.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/AsyncEnumerableExtensions.cs
similarity index 89%
rename from sandbox/Mvc.Server/Helpers/AsyncEnumerableExtensions.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/AsyncEnumerableExtensions.cs
index 1b2fb756..946d35e7 100644
--- a/sandbox/Mvc.Server/Helpers/AsyncEnumerableExtensions.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/AsyncEnumerableExtensions.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.Helpers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Helpers;
public static class AsyncEnumerableExtensions
{
diff --git a/sandbox/Mvc.Server/Helpers/FormValueRequiredAttribute.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/FormValueRequiredAttribute.cs
similarity index 95%
rename from sandbox/Mvc.Server/Helpers/FormValueRequiredAttribute.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/FormValueRequiredAttribute.cs
index c7ef0599..9328d924 100644
--- a/sandbox/Mvc.Server/Helpers/FormValueRequiredAttribute.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Helpers/FormValueRequiredAttribute.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
-namespace Mvc.Server.Helpers;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Helpers;
public sealed class FormValueRequiredAttribute : ActionMethodSelectorAttribute
{
diff --git a/sandbox/Mvc.Server/Models/ApplicationDbContext.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationDbContext.cs
similarity index 91%
rename from sandbox/Mvc.Server/Models/ApplicationDbContext.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationDbContext.cs
index af3e843b..2b361345 100644
--- a/sandbox/Mvc.Server/Models/ApplicationDbContext.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationDbContext.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
-namespace Mvc.Server.Models;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Models;
public class ApplicationDbContext : IdentityDbContext
{
diff --git a/sandbox/Mvc.Server/Models/ApplicationUser.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationUser.cs
similarity index 76%
rename from sandbox/Mvc.Server/Models/ApplicationUser.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationUser.cs
index 6a98a66a..7b128502 100644
--- a/sandbox/Mvc.Server/Models/ApplicationUser.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Models/ApplicationUser.cs
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Identity;
-namespace Mvc.Server.Models;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Models;
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser { }
diff --git a/sandbox/Mvc.Server/Mvc.Server.csproj b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/OpenIddict.Sandbox.AspNetCore.Server.csproj
similarity index 100%
rename from sandbox/Mvc.Server/Mvc.Server.csproj
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/OpenIddict.Sandbox.AspNetCore.Server.csproj
diff --git a/sandbox/Mvc.Client/Program.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Program.cs
similarity index 86%
rename from sandbox/Mvc.Client/Program.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Program.cs
index c11b1115..2d5b2d60 100644
--- a/sandbox/Mvc.Client/Program.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Program.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Client;
+namespace OpenIddict.Sandbox.AspNetCore.Server;
public static class Program
{
diff --git a/sandbox/Mvc.Server/Properties/launchSettings.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Properties/launchSettings.json
similarity index 92%
rename from sandbox/Mvc.Server/Properties/launchSettings.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Properties/launchSettings.json
index 9e078ae9..a84423f7 100644
--- a/sandbox/Mvc.Server/Properties/launchSettings.json
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Properties/launchSettings.json
@@ -15,7 +15,7 @@
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
- "Mvc.Server": {
+ "OpenIddict.Sandbox.AspNetCore.Server": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
diff --git a/sandbox/Mvc.Server/Services/IEmailSender.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/IEmailSender.cs
similarity index 63%
rename from sandbox/Mvc.Server/Services/IEmailSender.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/IEmailSender.cs
index f589b295..28f27587 100644
--- a/sandbox/Mvc.Server/Services/IEmailSender.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/IEmailSender.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.Services;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Services;
public interface IEmailSender
{
diff --git a/sandbox/Mvc.Server/Services/ISmsSender.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/ISmsSender.cs
similarity index 59%
rename from sandbox/Mvc.Server/Services/ISmsSender.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/ISmsSender.cs
index e9df4f3b..68091b8f 100644
--- a/sandbox/Mvc.Server/Services/ISmsSender.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/ISmsSender.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.Services;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Services;
public interface ISmsSender
{
diff --git a/sandbox/Mvc.Server/Services/MessageServices.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/MessageServices.cs
similarity index 91%
rename from sandbox/Mvc.Server/Services/MessageServices.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/MessageServices.cs
index 2ec1c49f..c672f2f8 100644
--- a/sandbox/Mvc.Server/Services/MessageServices.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Services/MessageServices.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.Services;
+namespace OpenIddict.Sandbox.AspNetCore.Server.Services;
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
diff --git a/sandbox/Mvc.Server/Startup.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Startup.cs
similarity index 98%
rename from sandbox/Mvc.Server/Startup.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Startup.cs
index 8b0ff97a..7e8ccfe4 100644
--- a/sandbox/Mvc.Server/Startup.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Startup.cs
@@ -1,11 +1,11 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
-using Mvc.Server.Models;
-using Mvc.Server.Services;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Services;
using Quartz;
using static OpenIddict.Abstractions.OpenIddictConstants;
-namespace Mvc.Server;
+namespace OpenIddict.Sandbox.AspNetCore.Server;
public class Startup
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs
similarity index 72%
rename from sandbox/Mvc.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs
index 3ef5483c..85466d65 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ExternalLoginConfirmationViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class ExternalLoginConfirmationViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/ForgotPasswordViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ForgotPasswordViewModel.cs
similarity index 70%
rename from sandbox/Mvc.Server/ViewModels/Account/ForgotPasswordViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ForgotPasswordViewModel.cs
index 9c7080b1..2447f4b3 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/ForgotPasswordViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ForgotPasswordViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class ForgotPasswordViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/LoginViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/LoginViewModel.cs
similarity index 82%
rename from sandbox/Mvc.Server/ViewModels/Account/LoginViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/LoginViewModel.cs
index 8b178672..0454720e 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/LoginViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/LoginViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class LoginViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/RegisterViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/RegisterViewModel.cs
similarity index 90%
rename from sandbox/Mvc.Server/ViewModels/Account/RegisterViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/RegisterViewModel.cs
index 2ddd989d..980d84a6 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/RegisterViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/RegisterViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class RegisterViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/ResetPasswordViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ResetPasswordViewModel.cs
similarity index 90%
rename from sandbox/Mvc.Server/ViewModels/Account/ResetPasswordViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ResetPasswordViewModel.cs
index 84bedccb..57ea8920 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/ResetPasswordViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/ResetPasswordViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class ResetPasswordViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/SendCodeViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/SendCodeViewModel.cs
similarity index 80%
rename from sandbox/Mvc.Server/ViewModels/Account/SendCodeViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/SendCodeViewModel.cs
index c1c6a80f..d65df331 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/SendCodeViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/SendCodeViewModel.cs
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc.Rendering;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class SendCodeViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Account/VerifyCodeViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/VerifyCodeViewModel.cs
similarity index 86%
rename from sandbox/Mvc.Server/ViewModels/Account/VerifyCodeViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/VerifyCodeViewModel.cs
index 52e37c9a..943d27d4 100644
--- a/sandbox/Mvc.Server/ViewModels/Account/VerifyCodeViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Account/VerifyCodeViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Account;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account;
public class VerifyCodeViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Authorization/AuthorizeViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/AuthorizeViewModel.cs
similarity index 76%
rename from sandbox/Mvc.Server/ViewModels/Authorization/AuthorizeViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/AuthorizeViewModel.cs
index 7cf90736..af4f6392 100644
--- a/sandbox/Mvc.Server/ViewModels/Authorization/AuthorizeViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/AuthorizeViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Authorization;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Authorization;
public class AuthorizeViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Authorization/VerifyViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/VerifyViewModel.cs
similarity index 90%
rename from sandbox/Mvc.Server/ViewModels/Authorization/VerifyViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/VerifyViewModel.cs
index 7a9db5aa..c1cfc228 100644
--- a/sandbox/Mvc.Server/ViewModels/Authorization/VerifyViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Authorization/VerifyViewModel.cs
@@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using OpenIddict.Abstractions;
-namespace Mvc.Server.ViewModels.Authorization;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Authorization;
public class VerifyViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs
similarity index 75%
rename from sandbox/Mvc.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs
index 2bddb4d1..898aefdd 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/AddPhoneNumberViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class AddPhoneNumberViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/ChangePasswordViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ChangePasswordViewModel.cs
similarity index 91%
rename from sandbox/Mvc.Server/ViewModels/Manage/ChangePasswordViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ChangePasswordViewModel.cs
index 6e2691f8..73335fe4 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/ChangePasswordViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ChangePasswordViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class ChangePasswordViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs
similarity index 75%
rename from sandbox/Mvc.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs
index 85f3dc02..3f9524ef 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ConfigureTwoFactorViewModel.cs
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc.Rendering;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class ConfigureTwoFactorViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/FactorViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/FactorViewModel.cs
similarity index 51%
rename from sandbox/Mvc.Server/ViewModels/Manage/FactorViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/FactorViewModel.cs
index dc190ceb..db9ea182 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/FactorViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/FactorViewModel.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class FactorViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/IndexViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/IndexViewModel.cs
similarity index 82%
rename from sandbox/Mvc.Server/ViewModels/Manage/IndexViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/IndexViewModel.cs
index 86091e7f..ae5c8ff1 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/IndexViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/IndexViewModel.cs
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Identity;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class IndexViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/ManageLoginsViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ManageLoginsViewModel.cs
similarity index 79%
rename from sandbox/Mvc.Server/ViewModels/Manage/ManageLoginsViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ManageLoginsViewModel.cs
index bbfcae9c..5656fbc0 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/ManageLoginsViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/ManageLoginsViewModel.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class ManageLoginsViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/RemoveLoginViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/RemoveLoginViewModel.cs
similarity index 65%
rename from sandbox/Mvc.Server/ViewModels/Manage/RemoveLoginViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/RemoveLoginViewModel.cs
index a784f759..b15ca2b0 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/RemoveLoginViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/RemoveLoginViewModel.cs
@@ -1,4 +1,4 @@
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class RemoveLoginViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/SetPasswordViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/SetPasswordViewModel.cs
similarity index 89%
rename from sandbox/Mvc.Server/ViewModels/Manage/SetPasswordViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/SetPasswordViewModel.cs
index ec866186..d1bf8a2e 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/SetPasswordViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/SetPasswordViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class SetPasswordViewModel
{
diff --git a/sandbox/Mvc.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs
similarity index 79%
rename from sandbox/Mvc.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs
index 4254a4ef..c960a5cb 100644
--- a/sandbox/Mvc.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Manage/VerifyPhoneNumberViewModel.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Mvc.Server.ViewModels.Manage;
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage;
public class VerifyPhoneNumberViewModel
{
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Shared/ErrorViewModel.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Shared/ErrorViewModel.cs
new file mode 100644
index 00000000..17af0c68
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/ViewModels/Shared/ErrorViewModel.cs
@@ -0,0 +1,12 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Shared;
+
+public class ErrorViewModel
+{
+ [Display(Name = "Error")]
+ public string Error { get; set; }
+
+ [Display(Name = "Description")]
+ public string ErrorDescription { get; set; }
+}
diff --git a/sandbox/Mvc.Server/Views/Account/ConfirmEmail.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ConfirmEmail.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ConfirmEmail.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ConfirmEmail.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ExternalLoginConfirmation.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ExternalLoginConfirmation.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ExternalLoginConfirmation.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ExternalLoginConfirmation.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ExternalLoginFailure.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ExternalLoginFailure.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ExternalLoginFailure.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ExternalLoginFailure.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ForgotPassword.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ForgotPassword.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ForgotPassword.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ForgotPassword.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ForgotPasswordConfirmation.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ForgotPasswordConfirmation.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ForgotPasswordConfirmation.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ForgotPasswordConfirmation.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/Lockout.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Lockout.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/Lockout.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Lockout.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/Login.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Login.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/Login.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Login.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/Register.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Register.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/Register.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/Register.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ResetPassword.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ResetPassword.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ResetPassword.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ResetPassword.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/ResetPasswordConfirmation.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ResetPasswordConfirmation.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/ResetPasswordConfirmation.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/ResetPasswordConfirmation.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/SendCode.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/SendCode.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/SendCode.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/SendCode.cshtml
diff --git a/sandbox/Mvc.Server/Views/Account/VerifyCode.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/VerifyCode.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Account/VerifyCode.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Account/VerifyCode.cshtml
diff --git a/sandbox/Mvc.Server/Views/Authorization/Authorize.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Authorize.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Authorization/Authorize.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Authorize.cshtml
diff --git a/sandbox/Mvc.Server/Views/Authorization/Logout.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Logout.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Authorization/Logout.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Logout.cshtml
diff --git a/sandbox/Mvc.Server/Views/Authorization/Verify.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Verify.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Authorization/Verify.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Authorization/Verify.cshtml
diff --git a/sandbox/Mvc.Server/Views/Home/About.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/About.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Home/About.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/About.cshtml
diff --git a/sandbox/Mvc.Server/Views/Home/Contact.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/Contact.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Home/Contact.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/Contact.cshtml
diff --git a/sandbox/Mvc.Server/Views/Home/Index.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/Index.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Home/Index.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Home/Index.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/AddPhoneNumber.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/AddPhoneNumber.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/AddPhoneNumber.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/AddPhoneNumber.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/ChangePassword.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/ChangePassword.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/ChangePassword.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/ChangePassword.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/Index.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/Index.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/Index.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/Index.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/ManageLogins.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/ManageLogins.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/ManageLogins.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/ManageLogins.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/RemoveLogin.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/RemoveLogin.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/RemoveLogin.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/RemoveLogin.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/SetPassword.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/SetPassword.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/SetPassword.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/SetPassword.cshtml
diff --git a/sandbox/Mvc.Server/Views/Manage/VerifyPhoneNumber.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/VerifyPhoneNumber.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Manage/VerifyPhoneNumber.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Manage/VerifyPhoneNumber.cshtml
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/Error.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/Error.cshtml
new file mode 100644
index 00000000..1b5c5de8
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/Error.cshtml
@@ -0,0 +1,14 @@
+@model ErrorViewModel
+
+
\ No newline at end of file
diff --git a/sandbox/Mvc.Server/Views/Shared/_Layout.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_Layout.cshtml
similarity index 95%
rename from sandbox/Mvc.Server/Views/Shared/_Layout.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_Layout.cshtml
index 12f9b717..c7cd4cc6 100644
--- a/sandbox/Mvc.Server/Views/Shared/_Layout.cshtml
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_Layout.cshtml
@@ -3,7 +3,7 @@
- @ViewData["Title"] - Mvc.Server
+ @ViewData["Title"] - OpenIddict.Sandbox.AspNetCore.Server
@@ -29,7 +29,7 @@
- Mvc.Server
+ OpenIddict.Sandbox.AspNetCore.Server
@@ -45,7 +45,7 @@
@RenderBody()
diff --git a/sandbox/Mvc.Server/Views/Shared/_LoginPartial.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_LoginPartial.cshtml
similarity index 94%
rename from sandbox/Mvc.Server/Views/Shared/_LoginPartial.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_LoginPartial.cshtml
index 1f1658bb..aab41de7 100644
--- a/sandbox/Mvc.Server/Views/Shared/_LoginPartial.cshtml
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_LoginPartial.cshtml
@@ -1,5 +1,5 @@
@using Microsoft.AspNetCore.Identity
-@using Mvc.Server.Models
+@using OpenIddict.Sandbox.AspNetCore.Server.Models
@inject SignInManager SignInManager
@inject UserManager UserManager
diff --git a/sandbox/Mvc.Server/Views/Shared/_ValidationScriptsPartial.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/Shared/_ValidationScriptsPartial.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/Shared/_ValidationScriptsPartial.cshtml
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/_ViewImports.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/_ViewImports.cshtml
new file mode 100644
index 00000000..5751c3f9
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/_ViewImports.cshtml
@@ -0,0 +1,8 @@
+@using OpenIddict.Sandbox.AspNetCore.Server
+@using OpenIddict.Sandbox.AspNetCore.Server.Models
+@using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Account
+@using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Authorization
+@using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Manage
+@using OpenIddict.Sandbox.AspNetCore.Server.ViewModels.Shared
+@using Microsoft.AspNetCore.Identity
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/sandbox/Mvc.Server/Views/_ViewStart.cshtml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/_ViewStart.cshtml
similarity index 100%
rename from sandbox/Mvc.Server/Views/_ViewStart.cshtml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Views/_ViewStart.cshtml
diff --git a/sandbox/Mvc.Server/Worker.cs b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Worker.cs
similarity index 98%
rename from sandbox/Mvc.Server/Worker.cs
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/Worker.cs
index 4e525c0c..a10cb10b 100644
--- a/sandbox/Mvc.Server/Worker.cs
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/Worker.cs
@@ -1,9 +1,9 @@
using System.Globalization;
-using Mvc.Server.Models;
+using OpenIddict.Sandbox.AspNetCore.Server.Models;
using OpenIddict.Abstractions;
using static OpenIddict.Abstractions.OpenIddictConstants;
-namespace Mvc.Server;
+namespace OpenIddict.Sandbox.AspNetCore.Server;
public class Worker : IHostedService
{
diff --git a/sandbox/Mvc.Server/appsettings.Development.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/appsettings.Development.json
similarity index 100%
rename from sandbox/Mvc.Server/appsettings.Development.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/appsettings.Development.json
diff --git a/sandbox/Mvc.Server/appsettings.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/appsettings.json
similarity index 100%
rename from sandbox/Mvc.Server/appsettings.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/appsettings.json
diff --git a/sandbox/Mvc.Server/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/bower.json
diff --git a/sandbox/Mvc.Server/gulpfile.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/gulpfile.js
similarity index 100%
rename from sandbox/Mvc.Server/gulpfile.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/gulpfile.js
diff --git a/sandbox/Mvc.Server/package.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/package.json
similarity index 100%
rename from sandbox/Mvc.Server/package.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/package.json
diff --git a/sandbox/OpenIddict.Sandbox.AspNetCore.Server/web.config b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/web.config
new file mode 100644
index 00000000..c128c496
--- /dev/null
+++ b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/web.config
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sandbox/Mvc.Server/wwwroot/css/site.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/css/site.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/css/site.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/css/site.css
diff --git a/sandbox/Mvc.Server/wwwroot/favicon.ico b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/favicon.ico
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/favicon.ico
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/favicon.ico
diff --git a/sandbox/Mvc.Server/wwwroot/images/ASP-NET-Banners-01.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/ASP-NET-Banners-01.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/images/ASP-NET-Banners-01.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/ASP-NET-Banners-01.png
diff --git a/sandbox/Mvc.Server/wwwroot/images/ASP-NET-Banners-02.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/ASP-NET-Banners-02.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/images/ASP-NET-Banners-02.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/ASP-NET-Banners-02.png
diff --git a/sandbox/Mvc.Server/wwwroot/images/Banner-01-Azure.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/Banner-01-Azure.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/images/Banner-01-Azure.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/Banner-01-Azure.png
diff --git a/sandbox/Mvc.Server/wwwroot/images/Banner-02-VS.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/Banner-02-VS.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/images/Banner-02-VS.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/images/Banner-02-VS.png
diff --git a/sandbox/Mvc.Server/wwwroot/js/site.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/js/site.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/js/site.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/js/site.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/CHANGELOG.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/CHANGELOG.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/CHANGELOG.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/CHANGELOG.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/Gruntfile.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/Gruntfile.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/Gruntfile.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/Gruntfile.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/LICENSE-MIT b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/LICENSE-MIT
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/LICENSE-MIT
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/LICENSE-MIT
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/README.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/README.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/README.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/README.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/dist/css/bootstrap-touch-carousel.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/dist/css/bootstrap-touch-carousel.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/dist/css/bootstrap-touch-carousel.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/dist/css/bootstrap-touch-carousel.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/dist/js/bootstrap-touch-carousel.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/dist/js/bootstrap-touch-carousel.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/dist/js/bootstrap-touch-carousel.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/dist/js/bootstrap-touch-carousel.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/package.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/package.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/package.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/package.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/touch-carousel.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/touch-carousel.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/touch-carousel.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/touch-carousel.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/transition.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/transition.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/transition.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/js/transition.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/carousel.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/carousel.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/carousel.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/carousel.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/elements.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/elements.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/elements.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap-touch-carousel/src/less/elements.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/CNAME b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/CNAME
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/CNAME
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/CNAME
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/CONTRIBUTING.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/CONTRIBUTING.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/CONTRIBUTING.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/CONTRIBUTING.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/Gruntfile.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/Gruntfile.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/Gruntfile.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/Gruntfile.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/LICENSE b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/LICENSE
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/LICENSE
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/README.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/README.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/README.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/README.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_config.yml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_config.yml
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_config.yml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_config.yml
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/ads.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/ads.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/ads.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/ads.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/footer.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/footer.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/footer.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/footer.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/header.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/header.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/header.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/header.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-components.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-components.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-components.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-components.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-css.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-css.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-css.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-css.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-customize.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-customize.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-customize.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-customize.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-getting-started.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-getting-started.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-getting-started.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-getting-started.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-javascript.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-javascript.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-javascript.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-javascript.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-main.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-main.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/nav-main.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/nav-main.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/old-bs-docs.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/old-bs-docs.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/old-bs-docs.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/old-bs-docs.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/social-buttons.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/social-buttons.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_includes/social-buttons.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_includes/social-buttons.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_layouts/default.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_layouts/default.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_layouts/default.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_layouts/default.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/_layouts/home.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_layouts/home.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/_layouts/home.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/_layouts/home.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/css/docs.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/css/docs.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/css/docs.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/css/docs.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/css/pygments-manni.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/css/pygments-manni.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/css/pygments-manni.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/css/pygments-manni.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/favicon.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/favicon.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/ico/favicon.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/ico/favicon.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/application.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/application.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/application.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/application.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/customizer.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/customizer.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/customizer.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/customizer.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/filesaver.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/filesaver.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/filesaver.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/filesaver.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/holder.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/holder.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/holder.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/holder.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/html5shiv.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/html5shiv.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/html5shiv.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/html5shiv.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/jszip.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/jszip.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/jszip.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/jszip.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/less.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/less.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/less.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/less.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/raw-files.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/raw-files.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/raw-files.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/raw-files.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/respond.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/respond.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/respond.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/respond.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/uglify.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/uglify.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/assets/js/uglify.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/assets/js/uglify.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/browserstack.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/browserstack.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/browserstack.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/browserstack.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/components.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/components.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/components.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/components.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/composer.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/composer.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/composer.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/composer.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/css.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/css.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/css.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/css.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/customize.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/customize.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/customize.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/customize.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/carousel/carousel.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/carousel/carousel.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/carousel/carousel.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/carousel/carousel.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/carousel/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/carousel/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/carousel/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/carousel/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/grid/grid.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/grid/grid.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/grid/grid.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/grid/grid.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/grid/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/grid/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/grid/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/grid/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron/jumbotron.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron/jumbotron.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/jumbotron/jumbotron.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/jumbotron/jumbotron.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/justified-nav/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/justified-nav/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/justified-nav/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/justified-nav/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/justified-nav/justified-nav.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/justified-nav/justified-nav.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/justified-nav/justified-nav.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/justified-nav/justified-nav.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/navbar-static-top.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/navbar-static-top.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/navbar-static-top.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar-static-top/navbar-static-top.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar/navbar.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar/navbar.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/navbar/navbar.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/navbar/navbar.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/non-responsive/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/non-responsive/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/non-responsive/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/non-responsive/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/non-responsive/non-responsive.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/non-responsive/non-responsive.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/non-responsive/non-responsive.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/non-responsive/non-responsive.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/offcanvas/offcanvas.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/carousel.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/carousel.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/carousel.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/carousel.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/grid.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/grid.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/grid.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/grid.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron-narrow.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron-narrow.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron-narrow.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron-narrow.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/jumbotron.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/justified-nav.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/justified-nav.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/justified-nav.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/justified-nav.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-fixed.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-fixed.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-fixed.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-fixed.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-static.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-static.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-static.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar-static.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/navbar.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/non-responsive.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/non-responsive.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/non-responsive.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/non-responsive.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/offcanvas.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/offcanvas.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/offcanvas.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/offcanvas.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sign-in.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sign-in.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sign-in.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sign-in.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/starter-template.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/starter-template.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/starter-template.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/starter-template.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer-navbar.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer-navbar.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer-navbar.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer-navbar.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/sticky-footer.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/theme.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/theme.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/screenshots/theme.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/screenshots/theme.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/signin/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/signin/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/signin/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/signin/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/signin/signin.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/signin/signin.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/signin/signin.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/signin/signin.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/starter-template/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/starter-template/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/starter-template/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/starter-template/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/starter-template/starter-template.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/starter-template/starter-template.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/starter-template/starter-template.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/starter-template/starter-template.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer/sticky-footer.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer/sticky-footer.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/sticky-footer/sticky-footer.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/sticky-footer/sticky-footer.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/theme/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/theme/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/theme/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/theme/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/theme/theme.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/theme/theme.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/examples/theme/theme.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/examples/theme/theme.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/getting-started.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/getting-started.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/getting-started.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/getting-started.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/javascript.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/javascript.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/javascript.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/javascript.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/affix.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/affix.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/affix.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/affix.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/alert.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/alert.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/alert.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/alert.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/button.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/button.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/button.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/button.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/carousel.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/carousel.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/carousel.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/carousel.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/collapse.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/collapse.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/collapse.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/collapse.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/dropdown.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/dropdown.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/dropdown.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/dropdown.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/modal.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/modal.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/modal.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/modal.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/popover.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/popover.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/popover.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/popover.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/scrollspy.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/scrollspy.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/scrollspy.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/scrollspy.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tab.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tab.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tab.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tab.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/phantom.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/phantom.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/phantom.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/phantom.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/server.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/server.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/server.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/server.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/affix.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/affix.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/affix.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/affix.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/alert.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/alert.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/alert.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/alert.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/button.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/button.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/button.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/button.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/carousel.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/carousel.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/carousel.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/carousel.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/collapse.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/collapse.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/collapse.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/collapse.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/dropdown.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/dropdown.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/dropdown.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/dropdown.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/modal.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/modal.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/modal.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/modal.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/phantom.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/phantom.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/phantom.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/phantom.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/popover.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/popover.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/popover.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/popover.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/scrollspy.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/scrollspy.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/scrollspy.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/scrollspy.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/tab.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/tab.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/tab.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/tab.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/tooltip.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/tooltip.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/tooltip.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/tooltip.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/transition.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/transition.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/unit/transition.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/unit/transition.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tests/vendor/qunit.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tooltip.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tooltip.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/tooltip.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/tooltip.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/transition.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/transition.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/js/transition.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/js/transition.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/alerts.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/alerts.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/alerts.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/alerts.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/badges.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/badges.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/badges.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/badges.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/bootstrap.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/bootstrap.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/bootstrap.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/bootstrap.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/breadcrumbs.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/breadcrumbs.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/breadcrumbs.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/breadcrumbs.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/button-groups.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/button-groups.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/button-groups.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/button-groups.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/buttons.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/buttons.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/buttons.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/buttons.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/carousel.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/carousel.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/carousel.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/carousel.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/close.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/close.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/close.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/close.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/code.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/code.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/code.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/code.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/component-animations.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/component-animations.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/component-animations.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/component-animations.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/dropdowns.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/dropdowns.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/dropdowns.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/dropdowns.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/forms.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/forms.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/forms.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/forms.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/glyphicons.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/glyphicons.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/glyphicons.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/glyphicons.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/grid.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/grid.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/grid.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/grid.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/input-groups.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/input-groups.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/input-groups.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/input-groups.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/jumbotron.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/jumbotron.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/jumbotron.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/jumbotron.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/labels.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/labels.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/labels.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/labels.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/list-group.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/list-group.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/list-group.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/list-group.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/media.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/media.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/media.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/media.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/mixins.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/mixins.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/mixins.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/mixins.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/modals.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/modals.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/modals.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/modals.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/navbar.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/navbar.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/navbar.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/navbar.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/navs.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/navs.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/navs.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/navs.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/normalize.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/normalize.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/normalize.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/normalize.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/pager.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/pager.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/pager.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/pager.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/pagination.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/pagination.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/pagination.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/pagination.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/panels.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/panels.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/panels.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/panels.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/popovers.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/popovers.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/popovers.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/popovers.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/print.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/print.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/print.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/print.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/progress-bars.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/progress-bars.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/progress-bars.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/progress-bars.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/responsive-utilities.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/responsive-utilities.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/responsive-utilities.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/responsive-utilities.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/scaffolding.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/scaffolding.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/scaffolding.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/scaffolding.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/tables.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/tables.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/tables.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/tables.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/theme.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/theme.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/theme.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/theme.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/thumbnails.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/thumbnails.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/thumbnails.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/thumbnails.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/tooltip.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/tooltip.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/tooltip.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/tooltip.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/type.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/type.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/type.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/type.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/utilities.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/utilities.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/utilities.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/utilities.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/variables.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/variables.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/variables.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/variables.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/wells.less b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/wells.less
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/less/wells.less
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/less/wells.less
diff --git a/sandbox/Mvc.Server/wwwroot/lib/bootstrap/package.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/package.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/bootstrap/package.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/bootstrap/package.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.bowerrc b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.bowerrc
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.bowerrc
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.bowerrc
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.gitignore b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.gitignore
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.gitignore
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.gitignore
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.jscsrc b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.jscsrc
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.jscsrc
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.jscsrc
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.jshintrc b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.jshintrc
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.jshintrc
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.jshintrc
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/.travis.yml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.travis.yml
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/.travis.yml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/.travis.yml
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/CHANGELOG.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/CHANGELOG.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/CHANGELOG.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/CHANGELOG.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/CONTRIBUTING.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/CONTRIBUTING.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/CONTRIBUTING.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/CONTRIBUTING.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/Gruntfile.coffee b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/Gruntfile.coffee
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/Gruntfile.coffee
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/Gruntfile.coffee
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/LICENSE.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/LICENSE.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/LICENSE.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/LICENSE.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/README.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/README.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/README.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/README.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/component.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/component.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/component.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/component.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.min.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.min.map
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/hammer.min.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/hammer.min.map
diff --git a/sandbox/Mvc.Server/wwwroot/lib/hammer.js/package.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/package.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/hammer.js/package.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/hammer.js/package.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/.gitignore b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/.gitignore
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/.gitignore
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/.gitignore
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/CONTRIBUTING.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/CONTRIBUTING.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/CONTRIBUTING.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/CONTRIBUTING.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/README.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/README.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/README.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/README.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.gitattributes b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.gitattributes
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.gitattributes
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.gitattributes
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.gitignore b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.gitignore
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.gitignore
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.gitignore
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.travis.yml b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.travis.yml
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/.travis.yml
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/.travis.yml
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/CONTRIBUTING.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/CONTRIBUTING.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/CONTRIBUTING.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/CONTRIBUTING.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/Gruntfile.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/Gruntfile.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/Gruntfile.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/Gruntfile.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/README.md b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/README.md
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/README.md
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/README.md
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/additional-methods.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/additional-methods.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/additional-methods.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/additional-methods.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/changelog.txt b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/changelog.txt
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/changelog.txt
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/changelog.txt
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/ajaxSubmit-integration-demo.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/ajaxSubmit-integration-demo.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/ajaxSubmit-integration-demo.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/ajaxSubmit-integration-demo.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/captcha.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/captcha.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/captcha.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/captcha.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/fonts/Anorexia.ttf b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/fonts/Anorexia.ttf
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/fonts/Anorexia.ttf
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/fonts/Anorexia.ttf
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/image_req.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/image_req.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/image_req.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/image_req.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/.htaccess b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/.htaccess
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/.htaccess
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/.htaccess
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/button.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/button.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/button.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/button.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/image.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/image.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/images/image.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/images/image.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/index.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/index.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/index.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/index.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/newsession.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/newsession.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/newsession.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/newsession.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/process.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/process.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/process.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/process.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/rand.php b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/rand.php
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/rand.php
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/rand.php
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/style.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/style.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/captcha/style.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/captcha/style.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/cmxform.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/cmxform.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/cmxform.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/cmxform.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/cmxformTemplate.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/cmxformTemplate.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/cmxformTemplate.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/cmxformTemplate.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/core.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/core.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/core.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/core.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/reset.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/reset.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/reset.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/reset.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/screen.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/screen.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/css/screen.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/css/screen.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/custom-messages-data-demo.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/custom-messages-data-demo.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/custom-messages-data-demo.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/custom-messages-data-demo.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/custom-methods-demo.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/custom-methods-demo.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/custom-methods-demo.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/custom-methods-demo.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/dynamic-totals.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/dynamic-totals.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/dynamic-totals.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/dynamic-totals.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/errorcontainer-demo.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/errorcontainer-demo.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/errorcontainer-demo.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/errorcontainer-demo.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/file_input.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/file_input.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/file_input.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/file_input.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/bg.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/bg.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/bg.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/bg.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/checked.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/checked.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/checked.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/checked.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-divider.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-divider.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-divider.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-divider.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-fieldset.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-fieldset.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-fieldset.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/cmxform-fieldset.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/loading.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/loading.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/loading.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/loading.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/unchecked.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/unchecked.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/images/unchecked.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/images/unchecked.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/jquerymobile.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/jquerymobile.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/jquerymobile.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/jquerymobile.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/bg.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/bg.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/bg.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/bg.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/header1.jpg b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/header1.jpg
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/header1.jpg
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/header1.jpg
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/page.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/page.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/page.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/page.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/required_star.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/required_star.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/images/required_star.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/images/required_star.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/screen.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/screen.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/login/screen.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/login/screen.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/backRequiredGray.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/backRequiredGray.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/backRequiredGray.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/backRequiredGray.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_green-fade.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_green-fade.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_green-fade.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_green-fade.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_nav_blue.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_nav_blue.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_nav_blue.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/back_nav_blue.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/blank.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/blank.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/blank.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/blank.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/button-submit.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/button-submit.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/button-submit.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/button-submit.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/favicon.ico b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/favicon.ico
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/favicon.ico
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/favicon.ico
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/help.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/help.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/help.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/help.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/left-nav-callout-long.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/left-nav-callout-long.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/left-nav-callout-long.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/left-nav-callout-long.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/login-sprite.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/login-sprite.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/login-sprite.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/login-sprite.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/logo_marketo.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/logo_marketo.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/logo_marketo.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/logo_marketo.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/sf.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/sf.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/sf.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/sf.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step1-24.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step1-24.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step1-24.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step1-24.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step2-24.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step2-24.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step2-24.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step2-24.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step3-24.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step3-24.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step3-24.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/step3-24.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab-sprite.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab-sprite.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab-sprite.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab-sprite.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab_green.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab_green.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab_green.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/tab_green.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/time.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/time.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/time.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/time.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/toggle.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/toggle.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/toggle.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/toggle.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/warning.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/warning.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/images/warning.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/images/warning.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/jquery.maskedinput.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/jquery.maskedinput.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/jquery.maskedinput.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/jquery.maskedinput.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/mktSignup.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/mktSignup.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/mktSignup.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/mktSignup.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/step2.htm b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/step2.htm
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/step2.htm
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/step2.htm
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/stylesheet.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/stylesheet.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/marketo/stylesheet.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/marketo/stylesheet.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/bg.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/bg.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/bg.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/bg.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/left_white.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/left_white.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/left_white.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/left_white.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/milk.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/milk.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/milk.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/milk.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/milk.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/milk.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/milk.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/milk.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/right_white.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/right_white.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/milk/right_white.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/milk/right_white.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/jquery.maskedinput-1.0.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/jquery.maskedinput-1.0.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/jquery.maskedinput-1.0.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/jquery.maskedinput-1.0.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.accordion.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.accordion.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.accordion.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.accordion.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.core.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.core.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.core.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/js/ui.core.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/style.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/style.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/multipart/style.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/multipart/style.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/radio-checkbox-select-demo.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/radio-checkbox-select-demo.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/radio-checkbox-select-demo.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/radio-checkbox-select-demo.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tabs/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tabs/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tabs/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tabs/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/themerollered.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/themerollered.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/themerollered.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/themerollered.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/editor_template.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/editor_template.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/editor_template.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/editor_template.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/img/icons.gif b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/img/icons.gif
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/img/icons.gif
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/img/icons.gif
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/langs/en.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/langs/en.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/langs/en.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/langs/en.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/skins/default/ui.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/skins/default/ui.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/skins/default/ui.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/themes/simple/skins/default/ui.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/tiny_mce.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/tiny_mce.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/demo/tinymce/tiny_mce.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/demo/tinymce/tiny_mce.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/jquery.validate.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/jquery.validate.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/jquery.validate.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/jquery.validate.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.6.4.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.6.4.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.6.4.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.6.4.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.7.2.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.7.2.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.7.2.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.7.2.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.8.3.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.8.3.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.8.3.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.8.3.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.9.0.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.9.0.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery-1.9.0.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery-1.9.0.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.form.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.form.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.form.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.form.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.mockjax.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.mockjax.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/lib/jquery.mockjax.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/lib/jquery.mockjax.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ar.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ar.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ar.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ar.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_bg.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_bg.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_bg.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_bg.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ca.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ca.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ca.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ca.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_cs.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_cs.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_cs.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_cs.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_da.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_da.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_da.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_da.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_de.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_de.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_de.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_de.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_el.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_el.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_el.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_el.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_es.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_es.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_es.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_es.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_et.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_et.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_et.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_et.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_eu.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_eu.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_eu.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_eu.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fa.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fa.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fa.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fa.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fi.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fi.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fi.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fi.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_fr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_fr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_he.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_he.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_he.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_he.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_hr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_hr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_hr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_hr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_hu.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_hu.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_hu.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_hu.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_it.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_it.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_it.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_it.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ja.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ja.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ja.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ja.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ka.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ka.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ka.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ka.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_kk.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_kk.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_kk.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_kk.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ko.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ko.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ko.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ko.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_lt.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_lt.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_lt.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_lt.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_lv.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_lv.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_lv.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_lv.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_my.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_my.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_my.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_my.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_nl.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_nl.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_nl.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_nl.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_no.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_no.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_no.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_no.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pl.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pl.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pl.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pl.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pt_BR.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pt_BR.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pt_BR.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pt_BR.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pt_PT.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pt_PT.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_pt_PT.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_pt_PT.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ro.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ro.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ro.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ro.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ru.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ru.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_ru.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_ru.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_si.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_si.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_si.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_si.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sk.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sk.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sk.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sk.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sl.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sl.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sl.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sl.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sv.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sv.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_sv.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_sv.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_th.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_th.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_th.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_th.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_tr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_tr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_tr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_tr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_uk.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_uk.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_uk.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_uk.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_vi.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_vi.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_vi.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_vi.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_zh.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_zh.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_zh.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_zh.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_zh_TW.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_zh_TW.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/messages_zh_TW.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/messages_zh_TW.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_de.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_de.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_de.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_de.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_nl.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_nl.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_nl.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_nl.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_pt.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_pt.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/localization/methods_pt.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/localization/methods_pt.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/package.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/package.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/package.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/package.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/events.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/events.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/events.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/events.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/errorIcon.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/errorIcon.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/errorIcon.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/errorIcon.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebug.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebugx.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebugx.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/firebugx.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/firebugx.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/infoIcon.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/infoIcon.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/infoIcon.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/infoIcon.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/warningIcon.png b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/warningIcon.png
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/firebug/warningIcon.png
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/firebug/warningIcon.png
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/large.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/large.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/large.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/large.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/messages.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/messages.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/messages.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/messages.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/methods.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/methods.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/methods.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/methods.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.css b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.css
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.css
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.css
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/qunit/qunit.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/rules.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/rules.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/rules.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/rules.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/selects/index.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/selects/index.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/selects/index.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/selects/index.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/tabs.html b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/tabs.html
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/tabs.html
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/tabs.html
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/test.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/test.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/test/test.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/test/test.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/todo b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/todo
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/todo
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/todo
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery-validation/validation.jquery.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/validation.jquery.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery-validation/validation.jquery.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery-validation/validation.jquery.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/.bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/.bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/.bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/MIT-LICENSE.txt b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/MIT-LICENSE.txt
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/MIT-LICENSE.txt
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/MIT-LICENSE.txt
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/bower.json b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/bower.json
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/bower.json
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/bower.json
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.min.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/dist/jquery.min.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/jsonp.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/jsonp.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/jsonp.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/jsonp.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/load.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/load.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/load.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/load.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/parseJSON.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/parseJSON.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/parseJSON.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/parseJSON.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/parseXML.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/parseXML.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/parseXML.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/parseXML.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/script.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/script.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/script.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/script.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/var/nonce.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/var/nonce.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/var/nonce.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/var/nonce.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/var/rquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/var/rquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/var/rquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/var/rquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/xhr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/xhr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/ajax/xhr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/ajax/xhr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/attr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/attr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/attr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/attr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/classes.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/classes.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/classes.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/classes.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/prop.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/prop.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/prop.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/prop.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/support.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/support.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/support.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/support.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/val.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/val.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/attributes/val.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/attributes/val.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/callbacks.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/callbacks.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/callbacks.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/callbacks.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/access.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/access.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/access.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/access.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/init.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/init.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/init.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/init.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/parseHTML.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/parseHTML.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/parseHTML.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/parseHTML.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/ready.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/ready.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/ready.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/ready.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/var/rsingleTag.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/var/rsingleTag.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/core/var/rsingleTag.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/core/var/rsingleTag.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/addGetHookIf.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/addGetHookIf.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/addGetHookIf.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/addGetHookIf.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/curCSS.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/curCSS.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/curCSS.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/curCSS.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/defaultDisplay.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/defaultDisplay.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/defaultDisplay.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/defaultDisplay.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/hiddenVisibleSelectors.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/hiddenVisibleSelectors.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/hiddenVisibleSelectors.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/hiddenVisibleSelectors.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/support.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/support.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/support.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/support.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/swap.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/swap.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/swap.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/swap.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/cssExpand.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/cssExpand.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/cssExpand.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/cssExpand.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/getStyles.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/getStyles.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/getStyles.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/getStyles.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/isHidden.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/isHidden.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/isHidden.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/isHidden.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/rmargin.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/rmargin.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/rmargin.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/rmargin.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/rnumnonpx.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/rnumnonpx.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/css/var/rnumnonpx.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/css/var/rnumnonpx.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/data.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/data.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/Data.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/Data.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/Data.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/Data.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/accepts.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/accepts.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/accepts.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/accepts.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/var/data_priv.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/var/data_priv.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/var/data_priv.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/var/data_priv.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/var/data_user.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/var/data_user.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/data/var/data_user.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/data/var/data_user.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/deferred.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/deferred.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/deferred.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/deferred.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/deprecated.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/deprecated.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/deprecated.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/deprecated.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/dimensions.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/dimensions.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/dimensions.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/dimensions.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects/Tween.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects/Tween.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects/Tween.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects/Tween.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects/animatedSelector.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects/animatedSelector.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/effects/animatedSelector.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/effects/animatedSelector.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/event.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/event.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/ajax.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/ajax.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/ajax.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/ajax.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/alias.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/alias.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/alias.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/alias.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/support.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/support.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/event/support.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/event/support.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/exports/amd.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/exports/amd.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/exports/amd.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/exports/amd.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/exports/global.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/exports/global.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/exports/global.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/exports/global.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/intro.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/intro.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/intro.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/intro.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/jquery.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/jquery.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/jquery.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/jquery.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/_evalUrl.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/_evalUrl.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/_evalUrl.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/_evalUrl.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/support.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/support.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/support.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/support.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/var/rcheckableType.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/var/rcheckableType.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/manipulation/var/rcheckableType.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/manipulation/var/rcheckableType.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/offset.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/offset.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/offset.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/offset.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/outro.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/outro.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/outro.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/outro.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/queue.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/queue.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/queue.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/queue.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/queue/delay.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/queue/delay.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/queue/delay.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/queue/delay.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector-native.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector-native.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector-native.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector-native.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector-sizzle.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector-sizzle.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector-sizzle.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector-sizzle.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/selector.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/selector.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/serialize.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/serialize.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/serialize.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/serialize.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.map b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.map
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.map
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/sizzle/dist/sizzle.min.map
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing/findFilter.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing/findFilter.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing/findFilter.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing/findFilter.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing/var/rneedsContext.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing/var/rneedsContext.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/traversing/var/rneedsContext.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/traversing/var/rneedsContext.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/arr.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/arr.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/arr.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/arr.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/class2type.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/class2type.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/class2type.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/class2type.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/concat.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/concat.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/concat.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/concat.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/hasOwn.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/hasOwn.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/hasOwn.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/hasOwn.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/indexOf.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/indexOf.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/indexOf.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/indexOf.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/pnum.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/pnum.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/pnum.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/pnum.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/push.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/push.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/push.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/push.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/rnotwhite.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/rnotwhite.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/rnotwhite.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/rnotwhite.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/slice.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/slice.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/slice.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/slice.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/strundefined.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/strundefined.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/strundefined.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/strundefined.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/support.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/support.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/support.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/support.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/toString.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/toString.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/var/toString.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/var/toString.js
diff --git a/sandbox/Mvc.Server/wwwroot/lib/jquery/src/wrap.js b/sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/wrap.js
similarity index 100%
rename from sandbox/Mvc.Server/wwwroot/lib/jquery/src/wrap.js
rename to sandbox/OpenIddict.Sandbox.AspNetCore.Server/wwwroot/lib/jquery/src/wrap.js
diff --git a/src/OpenIddict.Abstractions/OpenIddict.Abstractions.csproj b/src/OpenIddict.Abstractions/OpenIddict.Abstractions.csproj
index 9dcbe0a3..d261bf00 100644
--- a/src/OpenIddict.Abstractions/OpenIddict.Abstractions.csproj
+++ b/src/OpenIddict.Abstractions/OpenIddict.Abstractions.csproj
@@ -12,6 +12,7 @@
+
diff --git a/src/OpenIddict.Abstractions/OpenIddictConstants.cs b/src/OpenIddict.Abstractions/OpenIddictConstants.cs
index 4b59d442..98b6973d 100644
--- a/src/OpenIddict.Abstractions/OpenIddictConstants.cs
+++ b/src/OpenIddict.Abstractions/OpenIddictConstants.cs
@@ -63,6 +63,7 @@ public static class OpenIddictConstants
public const string AuthenticationContextReference = "acr";
public const string AuthenticationMethodReference = "amr";
public const string AuthenticationTime = "auth_time";
+ public const string AuthorizationServer = "as";
public const string AuthorizedParty = "azp";
public const string Birthdate = "birthdate";
public const string ClientId = "client_id";
@@ -93,10 +94,12 @@ public static class OpenIddictConstants
public const string PreferredUsername = "preferred_username";
public const string Profile = "profile";
public const string Region = "region";
+ public const string RequestForgeryProtection = "rfp";
public const string Role = "role";
public const string Scope = "scope";
public const string StreetAddress = "street_address";
public const string Subject = "sub";
+ public const string TargetLinkUri = "target_link_uri";
public const string TokenType = "token_type";
public const string TokenUsage = "token_usage";
public const string UpdatedAt = "updated_at";
@@ -118,17 +121,22 @@ public static class OpenIddictConstants
public const string ClaimDestinationsMap = "oi_cl_dstn";
public const string CodeChallenge = "oi_cd_chlg";
public const string CodeChallengeMethod = "oi_cd_chlg_meth";
+ public const string CodeVerifier = "oi_cd_vrf";
public const string CreationDate = "oi_crt_dt";
public const string DeviceCodeId = "oi_dvc_id";
public const string DeviceCodeLifetime = "oi_dvc_lft";
public const string ExpirationDate = "oi_exp_dt";
+ public const string GrantType = "oi_grt_typ";
public const string IdentityTokenLifetime = "oi_idt_lft";
public const string Nonce = "oi_nce";
public const string Presenter = "oi_prst";
public const string RedirectUri = "oi_reduri";
public const string RefreshTokenLifetime = "oi_reft_lft";
public const string Resource = "oi_rsrc";
+ public const string ResponseType = "oi_rsp_typ";
+ public const string SigningAlgorithm = "oi_sign_alg";
public const string Scope = "oi_scp";
+ public const string StateTokenLifetime = "oi_stet_lft";
public const string TokenId = "oi_tkn_id";
public const string TokenType = "oi_tkn_typ";
public const string UserCodeLifetime = "oi_usrc_lft";
@@ -223,6 +231,7 @@ public static class OpenIddictConstants
public const string AuthorizationCode = "oi_auc+jwt";
public const string DeviceCode = "oi_dvc+jwt";
public const string RefreshToken = "oi_reft+jwt";
+ public const string StateToken = "oi_stet+jwt";
public const string UserCode = "oi_usrc+jwt";
}
}
@@ -231,6 +240,7 @@ public static class OpenIddictConstants
{
public const string AcrValuesSupported = "acr_values_supported";
public const string AuthorizationEndpoint = "authorization_endpoint";
+ public const string AuthorizationResponseIssParameterSupported = "authorization_response_iss_parameter_supported";
public const string ClaimsLocalesSupported = "claims_locales_supported";
public const string ClaimsParameterSupported = "claims_parameter_supported";
public const string ClaimsSupported = "claims_supported";
@@ -301,6 +311,7 @@ public static class OpenIddictConstants
public const string IdentityProvider = "identity_provider";
public const string IdToken = "id_token";
public const string IdTokenHint = "id_token_hint";
+ public const string Iss = "iss";
public const string LoginHint = "login_hint";
public const string Keys = "keys";
public const string MaxAge = "max_age";
@@ -427,6 +438,7 @@ public static class OpenIddictConstants
{
public static readonly char[] Ampersand = { '&' };
public static readonly char[] Dash = { '-' };
+ public static readonly char[] Dot = { '.' };
public static readonly char[] Space = { ' ' };
}
@@ -469,6 +481,7 @@ public static class OpenIddictConstants
public const string DeviceCode = "device_code";
public const string IdToken = "id_token";
public const string RefreshToken = "refresh_token";
+ public const string StateToken = "state_token";
public const string UserCode = "user_code";
}
diff --git a/src/OpenIddict.Abstractions/OpenIddictResources.resx b/src/OpenIddict.Abstractions/OpenIddictResources.resx
index 3cdfcb4c..08ee8d03 100644
--- a/src/OpenIddict.Abstractions/OpenIddictResources.resx
+++ b/src/OpenIddict.Abstractions/OpenIddictResources.resx
@@ -1119,6 +1119,75 @@ To register the OpenIddict core services, reference the 'OpenIddict.Core' packag
The payload of this authentication ticket was serialized using an unsupported formatter version.
+
+ The OpenIddict ASP.NET Core client handler cannot be registered as an authentication scheme.
+This may indicate that an instance of another handler was registered with the same scheme.
+
+
+ The OpenIddict ASP.NET Core client handler cannot be used as the default authentication/sign-in/sign-out handler.
+Make sure that neither DefaultAuthenticateScheme, DefaultSignInScheme, DefaultSignOutScheme nor DefaultScheme point to an instance of the OpenIddict ASP.NET Core client handler.
+
+
+ An identity cannot be extracted from this request.
+This generally indicates that the OpenIddict client stack was asked to validate a token for an endpoint it doesn't manage.
+To validate tokens received by custom API endpoints, the OpenIddict validation handler (e.g OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme or OpenIddictValidationOwinDefaults.AuthenticationType) must be used instead.
+
+
+ The authorization server information cannot be extracted from the state principal.
+
+
+ The client registration corresponding to the specified issuer cannot be found in the client options.
+
+
+ The signing algorithm cannot be resolved from the specified frontchannel identity token.
+
+
+ The negotiated grant type cannot be extracted from the state principal.
+
+
+ The signing algorithm cannot be resolved from the specified backchannel identity token.
+
+
+ The specified grant type is not supported.
+
+
+ A common grant type supported by both the client and the server couldn't be negotiated automatically. If the error persists, consider specifying a list of allowed grant types in the client registration and ensure the supported grant types listed in the authorization server configuration are appropriate.
+
+
+ A common response type combination supported by both the client and the server couldn't be negotiated automatically. If the error persists, consider specifying a list of allowed response type combinations in the client registration and ensure the supported response type combinations listed in the authorization server configuration are appropriate.
+
+
+ A common response mode supported by both the client and the server couldn't be negotiated automatically. If the error persists, consider specifying a list of allowed response modes in the client registration and ensure the supported response modes listed in the authorization server configuration are appropriate.
+
+
+ A redirection URI must be specified in the client registration options when using OpenID Connect.
+
+
+ The '{0}' cannot be resolved from the authorization server configuration or doesn't represent a valid absolute URI, which may indicate this endpoint is not supported or is not enabled in the server configuration.
+
+
+ The redirection request was not correctly extracted.
+To extract authorization requests, create a class implementing 'IOpenIddictClientHandler<ExtractRedirectionRequestContext>' and register it using 'services.AddOpenIddict().AddClient().AddEventHandler()'.
+
+
+ The redirection response was not correctly applied.
+To apply redirection responses, create a class implementing 'IOpenIddictClientHandler<ApplyRedirectionResponseContext>' and register it using 'services.AddOpenIddict().AddClient().AddEventHandler()'.
+
+
+ No client registration was found in the client options. To add a registration, use 'services.AddOpenIddict().AddClient().AddRegistration()'.
+
+
+ No issuer was specified in the challenge properties. When multiple clients are registered, an issuer must be specified in the challenge properties.
+
+
+ The specified issuer is not a valid or absolute URL.
+
+
+ The issuer extracted from the server configuration metadata doesn't match the expected value.
+
+
+ The specified list of valid token types is not valid.
+
The security token is missing.
@@ -1420,10 +1489,7 @@ To register the OpenIddict core services, reference the 'OpenIddict.Core' packag
No JWKS endpoint could be found in the server configuration.
- A server configuration containing an invalid JWKS endpoint URL was returned.
-
-
- A server configuration containing an invalid introspection endpoint URL was returned.
+ A server configuration containing an invalid '{0}' URL was returned.The JWKS document didn't contain a valid '{0}' node with at least one key.
@@ -1476,6 +1542,42 @@ To register the OpenIddict core services, reference the 'OpenIddict.Core' packag
The token usage returned by the authorization server is not supported.
+
+ The specified '{0}' parameter doesn't match the authorization server the authorization request was initially sent to.
+
+
+ The '{0}' parameter cannot be used when '{1}' is not supported by the authorization server.
+
+
+ The '{0}' claim extracted from the specified frontchannel identity token is malformed or isn't of the expected type.
+
+
+ The mandatory '{0}' claim cannot be found in the specified frontchannel identity token.
+
+
+ The specified frontchannel identity token cannot be used with this client application.
+
+
+ The '{0}' claim returned in the specified frontchannel identity token doesn't match the expected value.
+
+
+ The '{0}' claim extracted from the specified backchannel identity token is malformed or isn't of the expected type.
+
+
+ The mandatory '{0}' claim cannot be found in the specified backchannel identity token.
+
+
+ The specified backchannel identity token cannot be used with this client application.
+
+
+ The '{0}' claim returned in the specified backchannel identity token doesn't match the expected value.
+
+
+ No correlation cookie associated with the specified state can be found. Please try logging in again. If the error persists, please contact the website owner.
+
+
+ The specified state token is not valid in this context.
+
The '{0}' parameter shouldn't be null or empty at this point.
@@ -1515,6 +1617,9 @@ To register the OpenIddict core services, reference the 'OpenIddict.Core' packag
EC-based keys should have a non-null OID raw value or friendly name.
+
+ The issuer should be a valid absolute URL at this point.
+
An error occurred while validating the token '{Token}'.
@@ -2009,6 +2114,15 @@ This may indicate that the hashed entry is corrupted or malformed.
The authorization request was rejected because the application '{ClientId}' was not allowed to use the '{ResponseType}' response type.
+
+ The redirection request was successfully extracted: {Request}.
+
+
+ The redirection request was successfully validated.
+
+
+ The redirection request was successfully validated.
+
https://documentation.openiddict.com/errors/{0}
diff --git a/src/OpenIddict.Abstractions/Primitives/OpenIddictConfiguration.cs b/src/OpenIddict.Abstractions/Primitives/OpenIddictConfiguration.cs
new file mode 100644
index 00000000..7f75f244
--- /dev/null
+++ b/src/OpenIddict.Abstractions/Primitives/OpenIddictConfiguration.cs
@@ -0,0 +1,93 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.IdentityModel.Tokens;
+
+namespace OpenIddict.Abstractions;
+
+///
+/// Represents the configuration of an authorization server.
+///
+///
+/// Note: depending on the stack used to produce this instance, only a few select properties may be available.
+///
+public class OpenIddictConfiguration
+{
+ ///
+ /// Gets or sets the address of the authorization endpoint.
+ ///
+ public Uri? AuthorizationEndpoint { get; set; }
+
+ ///
+ /// Gets or sets a boolean indicating whether the "iss" parameter is returned in authorization responses.
+ ///
+ public bool? AuthorizationResponseIssParameterSupported { get; set; }
+
+ ///
+ /// Gets the code challenge methods supported by the server.
+ ///
+ public HashSet CodeChallengeMethodsSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets the grant types supported by the server.
+ ///
+ public HashSet GrantTypesSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets or sets the address of the introspection endpoint.
+ ///
+ public Uri? IntrospectionEndpoint { get; set; }
+
+ ///
+ /// Gets the client authentication methods supported by the introspection endpoint.
+ ///
+ public HashSet IntrospectionEndpointAuthMethodsSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets or sets the address of the issuer.
+ ///
+ public Uri? Issuer { get; set; }
+
+ ///
+ /// Gets or sets the JSON Web Key set containing the keys exposed by the server.
+ ///
+ public JsonWebKeySet? JsonWebKeySet { get; set; }
+
+ ///
+ /// Gets or sets the address of the JWKS endpoint.
+ ///
+ public Uri? JwksUri { get; set; }
+
+ ///
+ /// Gets the response mode supported by the server.
+ ///
+ public HashSet ResponseModesSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets the response types supported by the server.
+ ///
+ public HashSet ResponseTypesSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets the scopes supported by the server.
+ ///
+ public HashSet ScopesSupported { get; } = new(StringComparer.Ordinal);
+
+ ///
+ /// Gets the signing keys extracted from the JSON Web Key set.
+ ///
+ public List SigningKeys { get; } = new();
+
+ ///
+ /// Gets or sets the address of the token endpoint.
+ ///
+ public Uri? TokenEndpoint { get; set; }
+
+ ///
+ /// Gets the client authentication methods supported by the token endpoint.
+ ///
+ public HashSet TokenEndpointAuthMethodsSupported { get; } = new(StringComparer.Ordinal);
+}
diff --git a/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs b/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs
index 9224898e..f4407188 100644
--- a/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs
+++ b/src/OpenIddict.Abstractions/Primitives/OpenIddictExtensions.cs
@@ -1262,6 +1262,14 @@ public static class OpenIddictExtensions
public static TimeSpan? GetRefreshTokenLifetime(this ClaimsPrincipal principal)
=> GetLifetime(principal, Claims.Private.RefreshTokenLifetime);
+ ///
+ /// Gets the state token lifetime associated with the claims principal.
+ ///
+ /// The claims principal.
+ /// The state token lifetime or null if the claim cannot be found.
+ public static TimeSpan? GetStateTokenLifetime(this ClaimsPrincipal principal)
+ => GetLifetime(principal, Claims.Private.StateTokenLifetime);
+
///
/// Gets the user code lifetime associated with the claims principal.
///
@@ -1582,6 +1590,15 @@ public static class OpenIddictExtensions
public static ClaimsPrincipal SetRefreshTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime)
=> principal.SetClaim(Claims.Private.RefreshTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture));
+ ///
+ /// Sets the state token lifetime associated with the claims principal.
+ ///
+ /// The claims principal.
+ /// The state token lifetime to store.
+ /// The claims principal.
+ public static ClaimsPrincipal SetStateTokenLifetime(this ClaimsPrincipal principal, TimeSpan? lifetime)
+ => principal.SetClaim(Claims.Private.StateTokenLifetime, lifetime?.TotalSeconds.ToString(CultureInfo.InvariantCulture));
+
///
/// Sets the user code lifetime associated with the claims principal.
///
diff --git a/src/OpenIddict.Abstractions/Primitives/OpenIddictRequest.cs b/src/OpenIddict.Abstractions/Primitives/OpenIddictRequest.cs
index c41e451f..b7bc993a 100644
--- a/src/OpenIddict.Abstractions/Primitives/OpenIddictRequest.cs
+++ b/src/OpenIddict.Abstractions/Primitives/OpenIddictRequest.cs
@@ -243,6 +243,15 @@ public class OpenIddictRequest : OpenIddictMessage
set => SetParameter(OpenIddictConstants.Parameters.IdentityProvider, value);
}
+ ///
+ /// Gets or sets the "id_token" parameter.
+ ///
+ public string? IdToken
+ {
+ get => (string?) GetParameter(OpenIddictConstants.Parameters.IdToken);
+ set => SetParameter(OpenIddictConstants.Parameters.IdToken, value);
+ }
+
///
/// Gets or sets the "id_token_hint" parameter.
///
diff --git a/src/OpenIddict.AspNetCore/OpenIddict.AspNetCore.csproj b/src/OpenIddict.AspNetCore/OpenIddict.AspNetCore.csproj
index ed547915..e73cdcdf 100644
--- a/src/OpenIddict.AspNetCore/OpenIddict.AspNetCore.csproj
+++ b/src/OpenIddict.AspNetCore/OpenIddict.AspNetCore.csproj
@@ -8,11 +8,12 @@
Versatile OpenID Connect stack for ASP.NET Core.
- $(PackageTags);aspnetcore;server;validation
+ $(PackageTags);aspnetcore;client;server;validation
+
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddict.Client.AspNetCore.csproj b/src/OpenIddict.Client.AspNetCore/OpenIddict.Client.AspNetCore.csproj
new file mode 100644
index 00000000..40b1e439
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddict.Client.AspNetCore.csproj
@@ -0,0 +1,44 @@
+
+
+
+ net461;netcoreapp3.1;net5.0;net6.0
+
+
+
+ ASP.NET Core integration package for the OpenIddict client services.
+ $(PackageTags);client;aspnetcore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreBuilder.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreBuilder.cs
new file mode 100644
index 00000000..552f6cc2
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreBuilder.cs
@@ -0,0 +1,103 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.ComponentModel;
+using Microsoft.AspNetCore;
+using OpenIddict.Client.AspNetCore;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Exposes the necessary methods required to configure
+/// the OpenIddict client ASP.NET Core integration.
+///
+public class OpenIddictClientAspNetCoreBuilder
+{
+ ///
+ /// Initializes a new instance of .
+ ///
+ /// The services collection.
+ public OpenIddictClientAspNetCoreBuilder(IServiceCollection services)
+ => Services = services ?? throw new ArgumentNullException(nameof(services));
+
+ ///
+ /// Gets the services collection.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public IServiceCollection Services { get; }
+
+ ///
+ /// Amends the default OpenIddict client ASP.NET Core configuration.
+ ///
+ /// The delegate used to configure the OpenIddict options.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public OpenIddictClientAspNetCoreBuilder Configure(Action configuration)
+ {
+ if (configuration is null)
+ {
+ throw new ArgumentNullException(nameof(configuration));
+ }
+
+ Services.Configure(configuration);
+
+ return this;
+ }
+
+ ///
+ /// Enables the pass-through mode for the OpenID Connect redirection endpoint.
+ /// When the pass-through mode is used, OpenID Connect requests are initially handled by OpenIddict.
+ /// Once validated, the rest of the request processing pipeline is invoked, so that OpenID Connect requests
+ /// can be handled at a later stage (in a custom middleware or in a MVC controller, for instance).
+ ///
+ /// The .
+ public OpenIddictClientAspNetCoreBuilder EnableRedirectionEndpointPassthrough()
+ => Configure(options => options.EnableRedirectionEndpointPassthrough = true);
+
+ ///
+ /// Enables error pass-through support, so that the rest of the request processing pipeline is
+ /// automatically invoked when returning an error from the interactive authorization and logout endpoints.
+ /// When this option is enabled, special logic must be added to these actions to handle errors, that can be
+ /// retrieved using .
+ ///
+ ///
+ /// Important: the error pass-through mode cannot be used when the status code pages integration is enabled.
+ ///
+ /// The .
+ [EditorBrowsable(EditorBrowsableState.Advanced)]
+ public OpenIddictClientAspNetCoreBuilder EnableErrorPassthrough()
+ => Configure(options => options.EnableErrorPassthrough = true);
+
+ ///
+ /// Enables status code pages integration support. Once enabled, errors
+ /// generated by the interactive endpoints can be handled by ASP.NET Core.
+ ///
+ /// The .
+ public OpenIddictClientAspNetCoreBuilder EnableStatusCodePagesIntegration()
+ => Configure(options => options.EnableStatusCodePagesIntegration = true);
+
+ ///
+ /// Determines whether the specified object is equal to the current object.
+ ///
+ /// The object to compare with the current object.
+ /// true if the specified object is equal to the current object; otherwise, false.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool Equals(object? obj) => base.Equals(obj);
+
+ ///
+ /// Serves as the default hash function.
+ ///
+ /// A hash code for the current object.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override int GetHashCode() => base.GetHashCode();
+
+ ///
+ /// Returns a string that represents the current object.
+ ///
+ /// A string that represents the current object.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override string? ToString() => base.ToString();
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConfiguration.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConfiguration.cs
new file mode 100644
index 00000000..349ae54f
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConfiguration.cs
@@ -0,0 +1,82 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.Extensions.Options;
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Contains the methods required to ensure that the OpenIddict client configuration is valid.
+///
+public class OpenIddictClientAspNetCoreConfiguration : IConfigureOptions,
+ IConfigureOptions,
+ IPostConfigureOptions
+{
+ ///
+ /// Registers the OpenIddict client handler in the global authentication options.
+ ///
+ /// The options instance to initialize.
+ public void Configure(AuthenticationOptions options)
+ {
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ // If a handler was already registered and the type doesn't correspond to the OpenIddict handler, throw an exception.
+ if (options.SchemeMap.TryGetValue(OpenIddictClientAspNetCoreDefaults.AuthenticationScheme, out var builder) &&
+ builder.HandlerType != typeof(OpenIddictClientAspNetCoreHandler))
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0288));
+ }
+
+ options.AddScheme(
+ OpenIddictClientAspNetCoreDefaults.AuthenticationScheme, displayName: null);
+ }
+
+ public void Configure(OpenIddictClientOptions options)
+ {
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ // Register the built-in event handlers used by the OpenIddict ASP.NET Core client components.
+ options.Handlers.AddRange(OpenIddictClientAspNetCoreHandlers.DefaultHandlers);
+ }
+
+ ///
+ /// Ensures that the authentication configuration is in a consistent and valid state.
+ ///
+ /// The authentication scheme associated with the handler instance.
+ /// The options instance to initialize.
+ public void PostConfigure(string name, AuthenticationOptions options)
+ {
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ if (!TryValidate(options.SchemeMap, options.DefaultAuthenticateScheme) ||
+ !TryValidate(options.SchemeMap, options.DefaultScheme) ||
+ !TryValidate(options.SchemeMap, options.DefaultSignInScheme) ||
+ !TryValidate(options.SchemeMap, options.DefaultSignOutScheme))
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0289));
+ }
+
+ static bool TryValidate(IDictionary map, string? scheme)
+ {
+ // If the scheme was not set or if it cannot be found in the map, return true.
+ if (string.IsNullOrEmpty(scheme) || !map.TryGetValue(scheme, out var builder))
+ {
+ return true;
+ }
+
+ return builder.HandlerType != typeof(OpenIddictClientAspNetCoreHandler);
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConstants.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConstants.cs
new file mode 100644
index 00000000..55ed7def
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreConstants.cs
@@ -0,0 +1,39 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Exposes common constants used by the OpenIddict ASP.NET Core host.
+///
+public static class OpenIddictClientAspNetCoreConstants
+{
+ public static class Properties
+ {
+ public const string BackchannelAccessTokenPrincipal = ".backchannel_access_token_principal";
+ public const string BackchannelIdentityTokenPrincipal = ".backchannel_id_token_principal";
+ public const string BackchannelRefreshTokenPrincipal = ".backchannel_refresh_token_principal";
+ public const string FrontchannelAccessTokenPrincipal = ".frontchannel_access_token_principal";
+ public const string FrontchannelAuthorizationCodePrincipal = ".frontchannel_authorization_code_principal";
+ public const string FrontchannelIdentityTokenPrincipal = ".frontchannel_id_token_principal";
+ public const string FrontchannelStateTokenPrincipal = ".frontchannel_state_token_principal";
+ public const string Issuer = ".issuer";
+ public const string Error = ".error";
+ public const string ErrorDescription = ".error_description";
+ public const string ErrorUri = ".error_uri";
+ }
+
+ public static class Tokens
+ {
+ public const string BackchannelAccessToken = "backchannel_access_token";
+ public const string BackchannelIdentityToken = "backchannel_id_token";
+ public const string BackchannelRefreshToken = "backchannel_refresh_token";
+ public const string FrontchannelAccessToken = "frontchannel_access_token";
+ public const string FrontchannelAuthorizationCode = "frontchannel_authorization_code";
+ public const string FrontchannelIdentityToken = "frontchannel_id_token";
+ public const string FrontchannelStateToken = "frontchannel_state_token";
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreDefaults.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreDefaults.cs
new file mode 100644
index 00000000..cdb9b64e
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreDefaults.cs
@@ -0,0 +1,18 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Exposes the default values used by the OpenIddict client handler.
+///
+public static class OpenIddictClientAspNetCoreDefaults
+{
+ ///
+ /// Default value for .
+ ///
+ public const string AuthenticationScheme = "OpenIddict.Client.AspNetCore";
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreExtensions.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreExtensions.cs
new file mode 100644
index 00000000..d9f7e705
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreExtensions.cs
@@ -0,0 +1,83 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Options;
+using OpenIddict.Client;
+using OpenIddict.Client.AspNetCore;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Exposes extensions allowing to register the OpenIddict client services.
+///
+public static class OpenIddictClientAspNetCoreExtensions
+{
+ ///
+ /// Registers the OpenIddict client services for ASP.NET Core in the DI container.
+ ///
+ /// The services builder used by OpenIddict to register new services.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public static OpenIddictClientAspNetCoreBuilder UseAspNetCore(this OpenIddictClientBuilder builder)
+ {
+ if (builder is null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ builder.Services.AddAuthentication();
+
+ builder.Services.TryAddScoped();
+
+ // Register the built-in event handlers used by the OpenIddict ASP.NET Core client components.
+ // Note: the order used here is not important, as the actual order is set in the options.
+ builder.Services.TryAdd(OpenIddictClientAspNetCoreHandlers.DefaultHandlers.Select(descriptor => descriptor.ServiceDescriptor));
+
+ // Register the built-in filters used by the default OpenIddict ASP.NET Core client event handlers.
+ builder.Services.TryAddSingleton();
+ builder.Services.TryAddSingleton();
+ builder.Services.TryAddSingleton();
+ builder.Services.TryAddSingleton();
+
+ // Register the option initializer used by the OpenIddict ASP.NET Core client integration services.
+ // Note: TryAddEnumerable() is used here to ensure the initializers are only registered once.
+ builder.Services.TryAddEnumerable(new[]
+ {
+ ServiceDescriptor.Singleton, OpenIddictClientAspNetCoreConfiguration>(),
+ ServiceDescriptor.Singleton, OpenIddictClientAspNetCoreConfiguration>(),
+
+ ServiceDescriptor.Singleton, OpenIddictClientAspNetCoreConfiguration>()
+ });
+
+ return new OpenIddictClientAspNetCoreBuilder(builder.Services);
+ }
+
+ ///
+ /// Registers the OpenIddict client services for ASP.NET Core in the DI container.
+ ///
+ /// The services builder used by OpenIddict to register new services.
+ /// The configuration delegate used to configure the client services.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public static OpenIddictClientBuilder UseAspNetCore(
+ this OpenIddictClientBuilder builder, Action configuration)
+ {
+ if (builder is null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ if (configuration is null)
+ {
+ throw new ArgumentNullException(nameof(configuration));
+ }
+
+ configuration(builder.UseAspNetCore());
+
+ return builder;
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreFeature.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreFeature.cs
new file mode 100644
index 00000000..28875f65
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreFeature.cs
@@ -0,0 +1,19 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Exposes the current client transaction to the ASP.NET Core host.
+///
+public class OpenIddictClientAspNetCoreFeature
+{
+ ///
+ /// Gets or sets the client transaction that encapsulates all specific
+ /// information about an individual OpenID Connect client request.
+ ///
+ public OpenIddictClientTransaction? Transaction { get; set; }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandler.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandler.cs
new file mode 100644
index 00000000..d9c76139
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandler.cs
@@ -0,0 +1,317 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Security.Claims;
+using System.Text.Encodings.Web;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using static OpenIddict.Client.AspNetCore.OpenIddictClientAspNetCoreConstants;
+using Properties = OpenIddict.Client.AspNetCore.OpenIddictClientAspNetCoreConstants.Properties;
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Provides the logic necessary to extract, validate and handle OpenID Connect requests.
+///
+public class OpenIddictClientAspNetCoreHandler : AuthenticationHandler,
+ IAuthenticationRequestHandler
+{
+ private readonly IOpenIddictClientDispatcher _dispatcher;
+ private readonly IOpenIddictClientFactory _factory;
+
+ ///
+ /// Creates a new instance of the class.
+ ///
+ public OpenIddictClientAspNetCoreHandler(
+ IOpenIddictClientDispatcher dispatcher,
+ IOpenIddictClientFactory factory,
+ IOptionsMonitor options,
+ ILoggerFactory logger,
+ UrlEncoder encoder,
+ ISystemClock clock)
+ : base(options, logger, encoder, clock)
+ {
+ _dispatcher = dispatcher;
+ _factory = factory;
+ }
+
+ ///
+ public async Task HandleRequestAsync()
+ {
+ // Note: the transaction may be already attached when replaying an ASP.NET Core request
+ // (e.g when using the built-in status code pages middleware with the re-execute mode).
+ var transaction = Context.Features.Get()?.Transaction;
+ if (transaction is null)
+ {
+ // Create a new transaction and attach the HTTP request to make it available to the ASP.NET Core handlers.
+ transaction = await _factory.CreateTransactionAsync();
+ transaction.Properties[typeof(HttpRequest).FullName!] = new WeakReference(Request);
+
+ // Attach the OpenIddict client transaction to the ASP.NET Core features
+ // so that it can retrieved while performing sign-in/sign-out operations.
+ Context.Features.Set(new OpenIddictClientAspNetCoreFeature { Transaction = transaction });
+ }
+
+ var context = new ProcessRequestContext(transaction);
+ await _dispatcher.DispatchAsync(context);
+
+ if (context.IsRequestHandled)
+ {
+ return true;
+ }
+
+ else if (context.IsRequestSkipped)
+ {
+ return false;
+ }
+
+ else if (context.IsRejected)
+ {
+ var notification = new ProcessErrorContext(transaction)
+ {
+ Error = context.Error ?? Errors.InvalidRequest,
+ ErrorDescription = context.ErrorDescription,
+ ErrorUri = context.ErrorUri,
+ Response = new OpenIddictResponse()
+ };
+
+ await _dispatcher.DispatchAsync(notification);
+
+ if (notification.IsRequestHandled)
+ {
+ return true;
+ }
+
+ else if (notification.IsRequestSkipped)
+ {
+ return false;
+ }
+
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0111));
+ }
+
+ return false;
+ }
+
+ ///
+ protected override async Task HandleAuthenticateAsync()
+ {
+ var transaction = Context.Features.Get()?.Transaction ??
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0112));
+
+ // Note: in many cases, the authentication token was already validated by the time this action is called
+ // (generally later in the pipeline, when using the pass-through mode). To avoid having to re-validate it,
+ // the authentication context is resolved from the transaction. If it's not available, a new one is created.
+ var context = transaction.GetProperty(typeof(ProcessAuthenticationContext).FullName!);
+ if (context is null)
+ {
+ context = new ProcessAuthenticationContext(transaction);
+ await _dispatcher.DispatchAsync(context);
+
+ // Store the context object in the transaction so it can be later retrieved by handlers
+ // that want to access the authentication result without triggering a new authentication flow.
+ transaction.SetProperty(typeof(ProcessAuthenticationContext).FullName!, context);
+ }
+
+ if (context.IsRequestHandled || context.IsRequestSkipped)
+ {
+ return AuthenticateResult.NoResult();
+ }
+
+ else if (context.IsRejected)
+ {
+ var properties = new AuthenticationProperties(new Dictionary
+ {
+ [Properties.Error] = context.Error,
+ [Properties.ErrorDescription] = context.ErrorDescription,
+ [Properties.ErrorUri] = context.ErrorUri
+ });
+
+ return AuthenticateResult.Fail(SR.GetResourceString(SR.ID0113), properties);
+ }
+
+ else
+ {
+ // A single main claims-based principal instance can be attached to an authentication ticket.
+ // To return the most appropriate one, the principal is selected based on the endpoint type.
+ // Independently of the selected main principal, all principals resolved from validated tokens
+ // are attached to the authentication properties bag so they can be accessed from user code.
+ var principal = context.EndpointType switch
+ {
+ // Note: the OpenIddict client handler can be used as a pure OAuth 2.0-only stack for
+ // delegation scenarios where the identity of the user is not needed. In this case,
+ // since no principal can be resolved from a token or a userinfo response to construct
+ // a user identity, a fake one containing an "unauthenticated" identity (i.e with its
+ // AuthenticationType property deliberately left to null) is used to allow ASP.NET Core
+ // to return a "successful" authentication result for these delegation-only scenarios.
+ OpenIddictClientEndpointType.Redirection =>
+ context.BackchannelIdentityTokenPrincipal ??
+ context.FrontchannelIdentityTokenPrincipal ??
+ new ClaimsPrincipal(new ClaimsIdentity()),
+
+ _ => null
+ };
+
+ if (principal is null)
+ {
+ return AuthenticateResult.NoResult();
+ }
+
+ var properties = new AuthenticationProperties
+ {
+ ExpiresUtc = principal.GetExpirationDate(),
+ IssuedUtc = principal.GetCreationDate(),
+
+ // Restore the return URL using the "target_link_uri" that was stored
+ // in the state token when the challenge operation started, if available.
+ RedirectUri = context.FrontchannelStateTokenPrincipal?.GetClaim(Claims.TargetLinkUri)
+ };
+
+ List? tokens = null;
+
+ // Attach the tokens to allow any ASP.NET Core component (e.g a controller)
+ // to retrieve them (e.g to make an API request to another application).
+
+ if (!string.IsNullOrEmpty(context.BackchannelAccessToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.BackchannelAccessToken,
+ Value = context.BackchannelAccessToken
+ });
+
+ properties.SetParameter(Properties.BackchannelAccessTokenPrincipal, context.BackchannelAccessTokenPrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.BackchannelIdentityToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.BackchannelIdentityToken,
+ Value = context.BackchannelIdentityToken
+ });
+
+ properties.SetParameter(Properties.BackchannelIdentityTokenPrincipal, context.BackchannelIdentityTokenPrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.BackchannelRefreshToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.BackchannelRefreshToken,
+ Value = context.BackchannelRefreshToken
+ });
+
+ properties.SetParameter(Properties.BackchannelRefreshTokenPrincipal, context.BackchannelRefreshTokenPrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.FrontchannelAccessToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.FrontchannelAccessToken,
+ Value = context.FrontchannelAccessToken
+ });
+
+ properties.SetParameter(Properties.FrontchannelAccessTokenPrincipal, context.FrontchannelAccessTokenPrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.FrontchannelAuthorizationCode))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.FrontchannelAuthorizationCode,
+ Value = context.FrontchannelAuthorizationCode
+ });
+
+ properties.SetParameter(Properties.FrontchannelAuthorizationCodePrincipal, context.FrontchannelAuthorizationCodePrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.FrontchannelIdentityToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.FrontchannelIdentityToken,
+ Value = context.FrontchannelIdentityToken
+ });
+
+ properties.SetParameter(Properties.FrontchannelIdentityTokenPrincipal, context.FrontchannelIdentityTokenPrincipal);
+ }
+
+ if (!string.IsNullOrEmpty(context.FrontchannelStateToken))
+ {
+ tokens ??= new(capacity: 1);
+ tokens.Add(new AuthenticationToken
+ {
+ Name = Tokens.FrontchannelStateToken,
+ Value = context.FrontchannelStateToken
+ });
+
+ properties.SetParameter(Properties.FrontchannelStateTokenPrincipal, context.FrontchannelStateTokenPrincipal);
+ }
+
+ if (tokens is { Count: > 0 })
+ {
+ properties.StoreTokens(tokens);
+ }
+
+ return AuthenticateResult.Success(new AuthenticationTicket(principal, properties,
+ OpenIddictClientAspNetCoreDefaults.AuthenticationScheme));
+ }
+ }
+
+ ///
+ protected override async Task HandleChallengeAsync(AuthenticationProperties? properties)
+ {
+ var transaction = Context.Features.Get()?.Transaction ??
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0112));
+
+ transaction.Properties[typeof(AuthenticationProperties).FullName!] = properties ?? new AuthenticationProperties();
+
+ var context = new ProcessChallengeContext(transaction)
+ {
+ Principal = new ClaimsPrincipal(new ClaimsIdentity()),
+ Request = new OpenIddictRequest()
+ };
+
+ await _dispatcher.DispatchAsync(context);
+
+ if (context.IsRequestHandled || context.IsRequestSkipped)
+ {
+ return;
+ }
+
+ else if (context.IsRejected)
+ {
+ var notification = new ProcessErrorContext(transaction)
+ {
+ Error = context.Error ?? Errors.InvalidRequest,
+ ErrorDescription = context.ErrorDescription,
+ ErrorUri = context.ErrorUri,
+ Response = new OpenIddictResponse()
+ };
+
+ await _dispatcher.DispatchAsync(notification);
+
+ if (notification.IsRequestHandled || context.IsRequestSkipped)
+ {
+ return;
+ }
+
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0111));
+ }
+ }
+
+ ///
+ protected override Task HandleForbiddenAsync(AuthenticationProperties? properties)
+ => HandleChallengeAsync(properties);
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlerFilters.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlerFilters.cs
new file mode 100644
index 00000000..975ca33b
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlerFilters.cs
@@ -0,0 +1,98 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.ComponentModel;
+using Microsoft.AspNetCore;
+using Microsoft.Extensions.Options;
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Contains a collection of event handler filters commonly used by the ASP.NET Core handlers.
+///
+[EditorBrowsable(EditorBrowsableState.Advanced)]
+public static class OpenIddictClientAspNetCoreHandlerFilters
+{
+ ///
+ /// Represents a filter that excludes the associated handlers if the
+ /// pass-through mode was not enabled for the authorization endpoint.
+ ///
+ public class RequireRedirectionEndpointPassthroughEnabled : IOpenIddictClientHandlerFilter
+ {
+ private readonly IOptionsMonitor _options;
+
+ public RequireRedirectionEndpointPassthroughEnabled(IOptionsMonitor options)
+ => _options = options;
+
+ public ValueTask IsActiveAsync(BaseContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return new ValueTask(_options.CurrentValue.EnableRedirectionEndpointPassthrough);
+ }
+ }
+
+ ///
+ /// Represents a filter that excludes the associated handlers if error pass-through was not enabled.
+ ///
+ public class RequireErrorPassthroughEnabled : IOpenIddictClientHandlerFilter
+ {
+ private readonly IOptionsMonitor _options;
+
+ public RequireErrorPassthroughEnabled(IOptionsMonitor options)
+ => _options = options;
+
+ public ValueTask IsActiveAsync(BaseContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return new ValueTask(_options.CurrentValue.EnableErrorPassthrough);
+ }
+ }
+
+ ///
+ /// Represents a filter that excludes the associated handlers if no ASP.NET Core request can be found.
+ ///
+ public class RequireHttpRequest : IOpenIddictClientHandlerFilter
+ {
+ public ValueTask IsActiveAsync(BaseContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return new ValueTask(context.Transaction.GetHttpRequest() is not null);
+ }
+ }
+
+ ///
+ /// Represents a filter that excludes the associated handlers if status code pages support was not enabled.
+ ///
+ public class RequireStatusCodePagesIntegrationEnabled : IOpenIddictClientHandlerFilter
+ {
+ private readonly IOptionsMonitor _options;
+
+ public RequireStatusCodePagesIntegrationEnabled(IOptionsMonitor options)
+ => _options = options;
+
+ public ValueTask IsActiveAsync(BaseContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return new ValueTask(_options.CurrentValue.EnableStatusCodePagesIntegration);
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.Authentication.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.Authentication.cs
new file mode 100644
index 00000000..0b826564
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.Authentication.cs
@@ -0,0 +1,108 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Collections.Immutable;
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.WebUtilities;
+
+namespace OpenIddict.Client.AspNetCore;
+
+public static partial class OpenIddictClientAspNetCoreHandlers
+{
+ public static class Authentication
+ {
+ public static ImmutableArray DefaultHandlers { get; } = ImmutableArray.Create(
+ /*
+ * Authorization request processing:
+ */
+ ProcessQueryRequest.Descriptor,
+
+ /*
+ * Redirection request extraction:
+ */
+ ExtractGetOrPostRequest.Descriptor,
+
+ /*
+ * Redirection request handling:
+ */
+ EnablePassthroughMode.Descriptor,
+
+ /*
+ * Redirection response handling:
+ */
+ AttachHttpResponseCode.Descriptor,
+ AttachCacheControlHeader.Descriptor,
+ ProcessPassthroughErrorResponse.Descriptor,
+ ProcessStatusCodePagesErrorResponse.Descriptor,
+ ProcessLocalErrorResponse.Descriptor);
+
+ ///
+ /// Contains the logic responsible of processing authorization requests using 302 redirects.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ProcessQueryRequest : IOpenIddictClientHandler
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(50_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(ApplyAuthorizationRequestContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ // Note: while initially not allowed by the core OAuth 2.0 specification, multiple parameters
+ // with the same name are used by derived drafts like the OAuth 2.0 token exchange specification.
+ // For consistency, multiple parameters with the same name are also supported by this endpoint.
+
+#if SUPPORTS_MULTIPLE_VALUES_IN_QUERYHELPERS
+ var location = QueryHelpers.AddQueryString(context.AuthorizationEndpoint,
+ from parameter in context.Request.GetParameters()
+ let values = (string?[]?) parameter.Value
+ where values is not null
+ from value in values
+ where !string.IsNullOrEmpty(value)
+ select KeyValuePair.Create(parameter.Key, value));
+#else
+ var location = context.AuthorizationEndpoint;
+
+ foreach (var (key, value) in
+ from parameter in context.Request.GetParameters()
+ let values = (string?[]?) parameter.Value
+ where values is not null
+ from value in values
+ where !string.IsNullOrEmpty(value)
+ select (parameter.Key, Value: value))
+ {
+ location = QueryHelpers.AddQueryString(location, key, value);
+ }
+#endif
+ response.Redirect(location);
+ context.HandleRequest();
+
+ return default;
+ }
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs
new file mode 100644
index 00000000..322192c4
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs
@@ -0,0 +1,919 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Collections.Immutable;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Security.Claims;
+using System.Text;
+using System.Text.Json;
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Diagnostics;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Microsoft.Net.Http.Headers;
+using Properties = OpenIddict.Client.AspNetCore.OpenIddictClientAspNetCoreConstants.Properties;
+
+namespace OpenIddict.Client.AspNetCore;
+
+[EditorBrowsable(EditorBrowsableState.Never)]
+public static partial class OpenIddictClientAspNetCoreHandlers
+{
+ public static ImmutableArray DefaultHandlers { get; } = ImmutableArray.Create(
+ /*
+ * Top-level request processing:
+ */
+ InferEndpointType.Descriptor,
+
+ /*
+ * Authentication processing:
+ */
+ ValidateCorrelationCookie.Descriptor,
+
+ /*
+ * Challenge processing:
+ */
+ GenerateCorrelationCookie.Descriptor,
+ ResolveHostChallengeParameters.Descriptor)
+ .AddRange(Authentication.DefaultHandlers);
+
+ ///
+ /// Contains the logic responsible of inferring the endpoint type from the request address.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class InferEndpointType : IOpenIddictClientHandler
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(int.MinValue + 50_000)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(ProcessRequestContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var request = context.Transaction.GetHttpRequest();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ context.EndpointType =
+ Matches(request, context.Options.RedirectionEndpointUris) ? OpenIddictClientEndpointType.Redirection :
+ OpenIddictClientEndpointType.Unknown;
+
+ return default;
+
+ static bool Matches(HttpRequest request, IReadOnlyList addresses)
+ {
+ for (var index = 0; index < addresses.Count; index++)
+ {
+ var address = addresses[index];
+ if (address.IsAbsoluteUri)
+ {
+ // If the request host is not available (e.g because HTTP/1.0 was used), ignore absolute URLs.
+ if (!request.Host.HasValue)
+ {
+ continue;
+ }
+
+ // Create a Uri instance using the request scheme and raw host and compare the two base addresses.
+ if (!Uri.TryCreate(request.Scheme + Uri.SchemeDelimiter + request.Host, UriKind.Absolute, out Uri? uri) ||
+ !uri.IsWellFormedOriginalString() || uri.Port != address.Port ||
+ !string.Equals(uri.Scheme, address.Scheme, StringComparison.OrdinalIgnoreCase) ||
+ !string.Equals(uri.Host, address.Host, StringComparison.OrdinalIgnoreCase))
+ {
+ continue;
+ }
+
+ var path = PathString.FromUriComponent(address);
+ if (AreEquivalent(path, request.PathBase + request.Path))
+ {
+ return true;
+ }
+ }
+
+ else if (address.OriginalString.StartsWith("/", StringComparison.OrdinalIgnoreCase))
+ {
+ var path = new PathString(address.OriginalString);
+ if (AreEquivalent(path, request.Path))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+
+ // ASP.NET Core's routing system ignores trailing slashes when determining
+ // whether the request path matches a registered route, which is not the case
+ // with PathString, that treats /connect/token and /connect/token/ as different
+ // addresses. To mitigate this inconsistency, a manual check is used here.
+ static bool AreEquivalent(PathString left, PathString right)
+ => left.Equals(right, StringComparison.OrdinalIgnoreCase) ||
+ left.Equals(right + "/", StringComparison.OrdinalIgnoreCase) ||
+ right.Equals(left + "/", StringComparison.OrdinalIgnoreCase);
+ }
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of extracting OpenID Connect requests from GET HTTP requests.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ExtractGetRequest : IOpenIddictClientHandler where TContext : BaseValidatingContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MinValue + 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var request = context.Transaction.GetHttpRequest();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ if (HttpMethods.IsGet(request.Method))
+ {
+ context.Transaction.Request = new OpenIddictRequest(request.Query);
+ }
+
+ else
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6137), request.Method);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.GetResourceString(SR.ID2084),
+ uri: SR.FormatID8000(SR.ID2084));
+
+ return default;
+ }
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of extracting OpenID Connect requests from GET or POST HTTP requests.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ExtractGetOrPostRequest : IOpenIddictClientHandler where TContext : BaseValidatingContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(ExtractGetRequest.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var request = context.Transaction.GetHttpRequest();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ if (HttpMethods.IsGet(request.Method))
+ {
+ context.Transaction.Request = new OpenIddictRequest(request.Query);
+ }
+
+ else if (HttpMethods.IsPost(request.Method))
+ {
+ // See http://openid.net/specs/openid-connect-core-1_0.html#FormSerialization
+ if (string.IsNullOrEmpty(request.ContentType))
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6138), HeaderNames.ContentType);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.FormatID2081(HeaderNames.ContentType),
+ uri: SR.FormatID8000(SR.ID2081));
+
+ return;
+ }
+
+ // May have media/type; charset=utf-8, allow partial match.
+ if (!request.ContentType.StartsWith("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase))
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6139), HeaderNames.ContentType, request.ContentType);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.FormatID2082(HeaderNames.ContentType),
+ uri: SR.FormatID8000(SR.ID2082));
+
+ return;
+ }
+
+ context.Transaction.Request = new OpenIddictRequest(await request.ReadFormAsync(request.HttpContext.RequestAborted));
+ }
+
+ else
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6137), request.Method);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.GetResourceString(SR.ID2084),
+ uri: SR.FormatID8000(SR.ID2084));
+
+ return;
+ }
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of extracting OpenID Connect requests from POST HTTP requests.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ExtractPostRequest : IOpenIddictClientHandler where TContext : BaseValidatingContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(ExtractGetOrPostRequest.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var request = context.Transaction.GetHttpRequest();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ if (HttpMethods.IsPost(request.Method))
+ {
+ // See http://openid.net/specs/openid-connect-core-1_0.html#FormSerialization
+ if (string.IsNullOrEmpty(request.ContentType))
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6138), HeaderNames.ContentType);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.FormatID2081(HeaderNames.ContentType),
+ uri: SR.FormatID8000(SR.ID2081));
+
+ return;
+ }
+
+ // May have media/type; charset=utf-8, allow partial match.
+ if (!request.ContentType.StartsWith("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase))
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6139), HeaderNames.ContentType, request.ContentType);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.FormatID2082(HeaderNames.ContentType),
+ uri: SR.FormatID8000(SR.ID2082));
+
+ return;
+ }
+
+ context.Transaction.Request = new OpenIddictRequest(await request.ReadFormAsync(request.HttpContext.RequestAborted));
+ }
+
+ else
+ {
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6137), request.Method);
+
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.GetResourceString(SR.ID2084),
+ uri: SR.FormatID8000(SR.ID2084));
+
+ return;
+ }
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of validating the correlation cookie that serves as a CSRF protection.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ValidateCorrelationCookie : IOpenIddictClientHandler
+ {
+ private readonly IOptionsMonitor _options;
+
+ public ValidateCorrelationCookie(IOptionsMonitor options)
+ => _options = options;
+
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(ValidateFrontchannelStateToken.Descriptor.Order + 500)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(ProcessAuthenticationContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ Debug.Assert(context.FrontchannelStateTokenPrincipal is { Identity: ClaimsIdentity }, SR.GetResourceString(SR.ID4006));
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var request = context.Transaction.GetHttpRequest();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ // Resolve the request forgery protection from the state token principal.
+ // If the claim cannot be found, this means the protection was disabled
+ // using a custom event handler. In this case, bypass the validation.
+ var claim = context.FrontchannelStateTokenPrincipal.GetClaim(Claims.RequestForgeryProtection);
+ if (string.IsNullOrEmpty(claim))
+ {
+ return default;
+ }
+
+ // Compute the name of the cookie name based on the prefix set in the options
+ // and the random request forgery protection claim restored from the state.
+ var name = new StringBuilder(_options.CurrentValue.CookieBuilder.Name)
+ .Append(Separators.Dot)
+ .Append(claim)
+ .ToString();
+
+ // Try to find the cookie matching the request forgery protection stored in the state.
+ //
+ // If the cookie cannot be found, this may indicate that the authorization response
+ // is unsolicited and potentially malicious. This may also be caused by an unadequate
+ // same-site configuration. In any case, the authentication demand MUST be rejected
+ // as it's impossible to ensure it's not a session fixation attack without the cookie.
+ var value = request.Cookies[name];
+ if (string.IsNullOrEmpty(value) || !string.Equals(value, "v1", StringComparison.Ordinal))
+ {
+ context.Reject(
+ error: Errors.InvalidRequest,
+ description: SR.GetResourceString(SR.ID2129),
+ uri: SR.FormatID8000(SR.ID2129));
+
+ return default;
+ }
+
+ // Note: when deleting a cookie, the same options used when creating it MUST be specified.
+ var options = _options.CurrentValue.CookieBuilder.Build(request.HttpContext);
+
+ // Return a response header asking the browser to delete the state cookie.
+ request.HttpContext.Response.Cookies.Delete(name, options);
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of resolving the additional challenge parameters stored in the ASP.NET
+ /// Core authentication properties specified by the application that triggered the challenge operation.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ResolveHostChallengeParameters : IOpenIddictClientHandler
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(ValidateChallengeDemand.Descriptor.Order - 500)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(ProcessChallengeContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ var properties = context.Transaction.GetProperty(typeof(AuthenticationProperties).FullName!);
+ if (properties is null)
+ {
+ return default;
+ }
+
+ // If an issuer was explicitly set, update the challenge context to use it.
+ if (properties.Items.TryGetValue(Properties.Issuer, out string? issuer) && !string.IsNullOrEmpty(issuer))
+ {
+ // Ensure the issuer set by the application is a valid absolute URI.
+ if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0306));
+ }
+
+ context.Issuer = uri;
+ }
+
+ // If a return URL was specified, use it as the target_link_uri claim.
+ if (!string.IsNullOrEmpty(properties.RedirectUri))
+ {
+ context.TargetLinkUri = properties.RedirectUri;
+ }
+
+ foreach (var parameter in properties.Parameters)
+ {
+ context.Parameters[parameter.Key] = parameter.Value switch
+ {
+ OpenIddictParameter value => value,
+ JsonElement value => new OpenIddictParameter(value),
+ bool value => new OpenIddictParameter(value),
+ int value => new OpenIddictParameter(value),
+ long value => new OpenIddictParameter(value),
+ string value => new OpenIddictParameter(value),
+ string[] value => new OpenIddictParameter(value),
+
+ _ => throw new InvalidOperationException(SR.GetResourceString(SR.ID0115))
+ };
+ }
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of creating a correlation cookie that serves as a CSRF countermeasure.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class GenerateCorrelationCookie : IOpenIddictClientHandler
+ {
+ private readonly IOptionsMonitor _options;
+
+ public GenerateCorrelationCookie(IOptionsMonitor options)
+ => _options = options;
+
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(AttachChallengeParameters.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(ProcessChallengeContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // Note: using a correlation cookie serves as an antiforgery protection as the request will
+ // always be rejected if a cookie corresponding to the request forgery protection claim
+ // persisted in the state token cannot be found. This protection is considered essential
+ // in OpenIddict and cannot be disabled via the options. Applications that prefer implementing
+ // a different protection strategy can set the request forgery protection claim to null or
+ // remove this handler from the handlers list and add a custom one using a different approach.
+
+ if (string.IsNullOrEmpty(context.RequestForgeryProtection))
+ {
+ return default;
+ }
+
+ Debug.Assert(context.StateTokenPrincipal is { Identity: ClaimsIdentity }, SR.GetResourceString(SR.ID4006));
+ Debug.Assert(!string.IsNullOrEmpty(context.StateToken), SR.GetResourceString(SR.ID4010));
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ var options = _options.CurrentValue.CookieBuilder.Build(response.HttpContext);
+
+ // Unless a value was explicitly set in the options, use the expiration date
+ // of the state token principal as the expiration date of the correlation cookie.
+ options.Expires ??= context.StateTokenPrincipal.GetExpirationDate();
+
+ // Compute a collision-resistant and hard-to-guess cookie name based on the prefix set
+ // in the options and the random request forgery protection claim generated earlier.
+ var name = new StringBuilder(_options.CurrentValue.CookieBuilder.Name)
+ .Append(Separators.Dot)
+ .Append(context.RequestForgeryProtection)
+ .ToString();
+
+ // Add the correlation cookie to the response headers.
+ response.Cookies.Append(name, "v1", options);
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of enabling the pass-through mode for the received request.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class EnablePassthroughMode : IOpenIddictClientHandler
+ where TContext : BaseRequestContext
+ where TFilter : IOpenIddictClientHandlerFilter
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MaxValue - 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ context.SkipRequest();
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of attaching an appropriate HTTP status code.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class AttachHttpResponseCode : IOpenIddictClientHandler where TContext : BaseRequestContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ Debug.Assert(context.Transaction.Response is not null, SR.GetResourceString(SR.ID4007));
+
+ response.StatusCode = context.Transaction.Response.Error switch
+ {
+ null => 200, // Note: the default code may be replaced by another handler (e.g when doing redirects).
+
+ _ => 400
+ };
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of attaching the appropriate HTTP response cache headers.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class AttachCacheControlHeader : IOpenIddictClientHandler where TContext : BaseRequestContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(AttachHttpResponseCode.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ // Prevent the response from being cached.
+ response.Headers[HeaderNames.CacheControl] = "no-store";
+ response.Headers[HeaderNames.Pragma] = "no-cache";
+ response.Headers[HeaderNames.Expires] = "Thu, 01 Jan 1970 00:00:00 GMT";
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of processing OpenID Connect responses that must be handled by another
+ /// middleware in the pipeline at a later stage (e.g an ASP.NET Core MVC action or a NancyFX module).
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ProcessPassthroughErrorResponse : IOpenIddictClientHandler
+ where TContext : BaseRequestContext
+ where TFilter : IOpenIddictClientHandlerFilter
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .AddFilter()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ Debug.Assert(context.Transaction.Response is not null, SR.GetResourceString(SR.ID4007));
+
+ if (string.IsNullOrEmpty(context.Transaction.Response.Error))
+ {
+ return default;
+ }
+
+ context.SkipRequest();
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of processing OpenID Connect responses handled by the status code pages middleware.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ProcessStatusCodePagesErrorResponse : IOpenIddictClientHandler
+ where TContext : BaseRequestContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(ProcessPassthroughErrorResponse>.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ Debug.Assert(context.Transaction.Response is not null, SR.GetResourceString(SR.ID4007));
+
+ if (string.IsNullOrEmpty(context.Transaction.Response.Error))
+ {
+ return default;
+ }
+
+ // Determine if the status code pages middleware has been enabled for this request.
+ // If it was not registered or enabled, let the default OpenIddict client handlers render
+ // a default error page instead of delegating the rendering to the status code middleware.
+ var feature = response.HttpContext.Features.Get();
+ if (feature is null || !feature.Enabled)
+ {
+ return default;
+ }
+
+ // Mark the request as fully handled to prevent the other OpenIddict client handlers
+ // from displaying the default error page and to allow the status code pages middleware
+ // to rewrite the response using the logic defined by the developer when registering it.
+ context.HandleRequest();
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of processing context responses that must be returned as plain-text.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ProcessLocalErrorResponse : IOpenIddictClientHandler
+ where TContext : BaseRequestContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(ProcessStatusCodePagesErrorResponse.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to ASP.NET Core requests. If the HTTP context cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another server stack.
+ var response = context.Transaction.GetHttpRequest()?.HttpContext.Response;
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0114));
+ }
+
+ Debug.Assert(context.Transaction.Response is not null, SR.GetResourceString(SR.ID4007));
+
+ if (string.IsNullOrEmpty(context.Transaction.Response.Error))
+ {
+ return;
+ }
+
+ // Don't return the state originally sent by the client application.
+ context.Transaction.Response.State = null;
+
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6143), context.Transaction.Response);
+
+ using var stream = new MemoryStream();
+ using var writer = new StreamWriter(stream);
+
+ foreach (var parameter in context.Transaction.Response.GetParameters())
+ {
+ // Ignore null or empty parameters, including JSON
+ // objects that can't be represented as strings.
+ var value = (string?) parameter.Value;
+ if (string.IsNullOrEmpty(value))
+ {
+ continue;
+ }
+
+ writer.Write(parameter.Key);
+ writer.Write(':');
+ writer.Write(value);
+ writer.WriteLine();
+ }
+
+ writer.Flush();
+
+ response.ContentLength = stream.Length;
+ response.ContentType = "text/plain;charset=UTF-8";
+
+ stream.Seek(offset: 0, loc: SeekOrigin.Begin);
+ await stream.CopyToAsync(response.Body, 4096, response.HttpContext.RequestAborted);
+
+ context.HandleRequest();
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of processing OpenID Connect responses that don't specify any parameter.
+ /// Note: this handler is not used when the OpenID Connect request is not initially handled by ASP.NET Core.
+ ///
+ public class ProcessEmptyResponse : IOpenIddictClientHandler
+ where TContext : BaseRequestContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MaxValue - 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ context.Logger.LogInformation(SR.GetResourceString(SR.ID6145));
+ context.HandleRequest();
+
+ return default;
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHelpers.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHelpers.cs
new file mode 100644
index 00000000..c2188c59
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHelpers.cs
@@ -0,0 +1,86 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using OpenIddict.Client;
+using OpenIddict.Client.AspNetCore;
+
+namespace Microsoft.AspNetCore;
+
+///
+/// Exposes companion extensions for the OpenIddict/ASP.NET Core integration.
+///
+public static class OpenIddictClientAspNetCoreHelpers
+{
+ ///
+ /// Retrieves the instance stored in the properties.
+ ///
+ /// The transaction instance.
+ /// The instance or null if it couldn't be found.
+ public static HttpRequest? GetHttpRequest(this OpenIddictClientTransaction transaction)
+ {
+ if (transaction is null)
+ {
+ throw new ArgumentNullException(nameof(transaction));
+ }
+
+ if (!transaction.Properties.TryGetValue(typeof(HttpRequest).FullName!, out object? property))
+ {
+ return null;
+ }
+
+ if (property is WeakReference reference && reference.TryGetTarget(out HttpRequest? request))
+ {
+ return request;
+ }
+
+ return null;
+ }
+
+ ///
+ /// Retrieves the instance stored in .
+ ///
+ /// The context instance.
+ /// The .
+ public static OpenIddictClientEndpointType GetOpenIddictClientEndpointType(this HttpContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return context.Features.Get()?.Transaction?.EndpointType ?? default;
+ }
+
+ ///
+ /// Retrieves the instance stored in .
+ ///
+ /// The context instance.
+ /// The instance or null if it couldn't be found.
+ public static OpenIddictRequest? GetOpenIddictClientRequest(this HttpContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return context.Features.Get()?.Transaction?.Request;
+ }
+
+ ///
+ /// Retrieves the instance stored in .
+ ///
+ /// The context instance.
+ /// The instance or null if it couldn't be found.
+ public static OpenIddictResponse? GetOpenIddictClientResponse(this HttpContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return context.Features.Get()?.Transaction?.Response;
+ }
+}
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreOptions.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreOptions.cs
new file mode 100644
index 00000000..f2b305ba
--- /dev/null
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreOptions.cs
@@ -0,0 +1,54 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.AspNetCore;
+
+namespace OpenIddict.Client.AspNetCore;
+
+///
+/// Provides various settings needed to configure the OpenIddict ASP.NET Core client integration.
+///
+public class OpenIddictClientAspNetCoreOptions : AuthenticationSchemeOptions
+{
+ ///
+ /// Gets or sets a boolean indicating whether the pass-through mode is enabled for the redirection endpoint.
+ /// When the pass-through mode is used, OpenID Connect requests are initially handled by OpenIddict.
+ /// Once validated, the rest of the request processing pipeline is invoked, so that OpenID Connect requests
+ /// can be handled at a later stage (in a custom middleware or in a MVC controller, for instance).
+ ///
+ public bool EnableRedirectionEndpointPassthrough { get; set; }
+
+ ///
+ /// Gets or sets a boolean indicating whether OpenIddict should allow the rest of the request processing pipeline
+ /// to be invoked when returning an error from the interactive authorization and logout endpoints.
+ /// When this option is enabled, special logic must be added to these actions to handle errors, that can be
+ /// retrieved using .
+ ///
+ ///
+ /// Important: the error pass-through mode cannot be used when the status code pages integration is enabled.
+ ///
+ public bool EnableErrorPassthrough { get; set; }
+
+ ///
+ /// Gets or sets a boolean indicating whether integration with the status code pages
+ /// middleware should be enabled or not. Once enabled, errors generated by the OpenIddict
+ /// interactive endpoints (e.g authorization or logout) can be handled by ASP.NET Core.
+ ///
+ public bool EnableStatusCodePagesIntegration { get; set; }
+
+ ///
+ /// Gets or sets the cookie builder used to create the cookies that are
+ /// used to protect against forged requests/session fixation attacks.
+ ///
+ public CookieBuilder CookieBuilder { get; set; } = new()
+ {
+ HttpOnly = true,
+ IsEssential = true,
+ Name = "OpenIddict.Client.RequestForgeryProtection",
+ SameSite = SameSiteMode.None,
+ SecurePolicy = CookieSecurePolicy.SameAsRequest
+ };
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddict.Client.SystemNetHttp.csproj b/src/OpenIddict.Client.SystemNetHttp/OpenIddict.Client.SystemNetHttp.csproj
new file mode 100644
index 00000000..ed9ca382
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddict.Client.SystemNetHttp.csproj
@@ -0,0 +1,33 @@
+
+
+
+ net461;netcoreapp3.1;net5.0;net6.0;netstandard2.0;netstandard2.1
+
+
+
+ System.Net.Http integration package for the OpenIddict client services.
+ $(PackageTags);http;httpclient;validation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpBuilder.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpBuilder.cs
new file mode 100644
index 00000000..84e937b5
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpBuilder.cs
@@ -0,0 +1,78 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.ComponentModel;
+using OpenIddict.Client.SystemNetHttp;
+using Polly;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Exposes the necessary methods required to configure the OpenIddict client/System.Net.Http integration.
+///
+public class OpenIddictClientSystemNetHttpBuilder
+{
+ ///
+ /// Initializes a new instance of .
+ ///
+ /// The services collection.
+ public OpenIddictClientSystemNetHttpBuilder(IServiceCollection services)
+ => Services = services ?? throw new ArgumentNullException(nameof(services));
+
+ ///
+ /// Gets the services collection.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public IServiceCollection Services { get; }
+
+ ///
+ /// Amends the default OpenIddict client/server integration configuration.
+ ///
+ /// The delegate used to configure the OpenIddict options.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public OpenIddictClientSystemNetHttpBuilder Configure(Action configuration)
+ {
+ if (configuration is null)
+ {
+ throw new ArgumentNullException(nameof(configuration));
+ }
+
+ Services.Configure(configuration);
+
+ return this;
+ }
+
+ ///
+ /// Replaces the default HTTP error policy used by the OpenIddict client services.
+ ///
+ /// The HTTP Polly error policy.
+ /// The .
+ public OpenIddictClientSystemNetHttpBuilder SetHttpErrorPolicy(IAsyncPolicy policy)
+ => Configure(options => options.HttpErrorPolicy = policy);
+
+ ///
+ /// Determines whether the specified object is equal to the current object.
+ ///
+ /// The object to compare with the current object.
+ /// true if the specified object is equal to the current object; otherwise, false.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override bool Equals(object? obj) => base.Equals(obj);
+
+ ///
+ /// Serves as the default hash function.
+ ///
+ /// A hash code for the current object.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override int GetHashCode() => base.GetHashCode();
+
+ ///
+ /// Returns a string that represents the current object.
+ ///
+ /// A string that represents the current object.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override string? ToString() => base.ToString();
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpConfiguration.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpConfiguration.cs
new file mode 100644
index 00000000..20976f44
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpConfiguration.cs
@@ -0,0 +1,77 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Diagnostics;
+using System.Net.Http.Headers;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Http;
+using Microsoft.Extensions.Options;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+///
+/// Contains the methods required to ensure that the OpenIddict client/System.Net.Http integration configuration is valid.
+///
+public class OpenIddictClientSystemNetHttpConfiguration : IConfigureOptions,
+ IConfigureNamedOptions
+{
+#if !SUPPORTS_SERVICE_PROVIDER_IN_HTTP_MESSAGE_HANDLER_BUILDER
+ private readonly IServiceProvider _serviceProvider;
+
+ public OpenIddictClientSystemNetHttpConfiguration(IServiceProvider serviceProvider)
+ => _serviceProvider = serviceProvider;
+#endif
+
+ public void Configure(OpenIddictClientOptions options)
+ {
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ // Register the built-in event handlers used by the OpenIddict System.Net.Http client components.
+ options.Handlers.AddRange(OpenIddictClientSystemNetHttpHandlers.DefaultHandlers);
+ }
+
+ public void Configure(HttpClientFactoryOptions options)
+ => Debug.Fail("This infrastructure method shouldn't be called.");
+
+ public void Configure(string name, HttpClientFactoryOptions options)
+ {
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ var assembly = typeof(OpenIddictClientSystemNetHttpOptions).Assembly.GetName();
+
+ if (!string.Equals(name, assembly.Name, StringComparison.Ordinal))
+ {
+ return;
+ }
+
+ options.HttpClientActions.Add(client =>
+ {
+ client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(
+ productName: assembly.Name!,
+ productVersion: assembly.Version!.ToString()));
+ });
+
+ options.HttpMessageHandlerBuilderActions.Add(builder =>
+ {
+#if SUPPORTS_SERVICE_PROVIDER_IN_HTTP_MESSAGE_HANDLER_BUILDER
+ var options = builder.Services.GetRequiredService>();
+#else
+ var options = _serviceProvider.GetRequiredService>();
+#endif
+ var policy = options.CurrentValue.HttpErrorPolicy;
+ if (policy is not null)
+ {
+ builder.AdditionalHandlers.Add(new PolicyHttpMessageHandler(policy));
+ }
+ });
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpExtensions.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpExtensions.cs
new file mode 100644
index 00000000..cded095c
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpExtensions.cs
@@ -0,0 +1,76 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Http;
+using Microsoft.Extensions.Options;
+using OpenIddict.Client;
+using OpenIddict.Client.SystemNetHttp;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Exposes extensions allowing to register the OpenIddict client/System.Net.Http integration services.
+///
+public static class OpenIddictClientSystemNetHttpExtensions
+{
+ ///
+ /// Registers the OpenIddict client/System.Net.Http integration services in the DI container.
+ ///
+ /// The services builder used by OpenIddict to register new services.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public static OpenIddictClientSystemNetHttpBuilder UseSystemNetHttp(this OpenIddictClientBuilder builder)
+ {
+ if (builder is null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ builder.Services.AddHttpClient();
+
+ // Register the built-in validation event handlers used by the OpenIddict System.Net.Http components.
+ // Note: the order used here is not important, as the actual order is set in the options.
+ builder.Services.TryAdd(OpenIddictClientSystemNetHttpHandlers.DefaultHandlers.Select(descriptor => descriptor.ServiceDescriptor));
+
+ // Register the built-in filters used by the default OpenIddict System.Net.Http event handlers.
+ builder.Services.TryAddSingleton();
+
+ // Note: TryAddEnumerable() is used here to ensure the initializers are registered only once.
+ builder.Services.TryAddEnumerable(new[]
+ {
+ ServiceDescriptor.Singleton, OpenIddictClientSystemNetHttpConfiguration>(),
+ ServiceDescriptor.Singleton, OpenIddictClientSystemNetHttpConfiguration>()
+ });
+
+ return new OpenIddictClientSystemNetHttpBuilder(builder.Services);
+ }
+
+ ///
+ /// Registers the OpenIddict client/System.Net.Http integration services in the DI container.
+ ///
+ /// The services builder used by OpenIddict to register new services.
+ /// The configuration delegate used to configure the client services.
+ /// This extension can be safely called multiple times.
+ /// The .
+ public static OpenIddictClientBuilder UseSystemNetHttp(
+ this OpenIddictClientBuilder builder, Action configuration)
+ {
+ if (builder is null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ if (configuration is null)
+ {
+ throw new ArgumentNullException(nameof(configuration));
+ }
+
+ configuration(builder.UseSystemNetHttp());
+
+ return builder;
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlerFilters.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlerFilters.cs
new file mode 100644
index 00000000..af1afac4
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlerFilters.cs
@@ -0,0 +1,31 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.ComponentModel;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+[EditorBrowsable(EditorBrowsableState.Advanced)]
+public static class OpenIddictClientSystemNetHttpHandlerFilters
+{
+ ///
+ /// Represents a filter that excludes the associated handlers if the metadata address of the issuer is not available.
+ ///
+ public class RequireHttpMetadataAddress : IOpenIddictClientHandlerFilter
+ {
+ public ValueTask IsActiveAsync(BaseExternalContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ return new ValueTask(
+ string.Equals(context.Address?.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(context.Address?.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase));
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Discovery.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Discovery.cs
new file mode 100644
index 00000000..c928a5f5
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Discovery.cs
@@ -0,0 +1,44 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Collections.Immutable;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+public static partial class OpenIddictClientSystemNetHttpHandlers
+{
+ public static class Discovery
+ {
+ public static ImmutableArray DefaultHandlers { get; } = ImmutableArray.Create(
+ /*
+ * Configuration request processing:
+ */
+ PrepareGetHttpRequest.Descriptor,
+ AttachQueryStringParameters.Descriptor,
+ SendHttpRequest.Descriptor,
+ DisposeHttpRequest.Descriptor,
+
+ /*
+ * Configuration response processing:
+ */
+ ExtractJsonHttpResponse.Descriptor,
+ DisposeHttpResponse.Descriptor,
+
+ /*
+ * Cryptography request processing:
+ */
+ PrepareGetHttpRequest.Descriptor,
+ AttachQueryStringParameters.Descriptor,
+ SendHttpRequest.Descriptor,
+ DisposeHttpRequest.Descriptor,
+
+ /*
+ * Configuration response processing:
+ */
+ ExtractJsonHttpResponse.Descriptor,
+ DisposeHttpResponse.Descriptor);
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Exchange.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Exchange.cs
new file mode 100644
index 00000000..c0d2e499
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.Exchange.cs
@@ -0,0 +1,115 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Collections.Immutable;
+using System.Diagnostics;
+using System.Net.Http.Headers;
+using System.Text;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+public static partial class OpenIddictClientSystemNetHttpHandlers
+{
+ public static class Exchange
+ {
+ public static ImmutableArray DefaultHandlers { get; } = ImmutableArray.Create(
+ /*
+ * Token request processing:
+ */
+ PreparePostHttpRequest.Descriptor,
+ AttachBasicAuthenticationCredentials.Descriptor,
+ AttachFormParameters.Descriptor,
+ SendHttpRequest.Descriptor,
+ DisposeHttpRequest.Descriptor,
+
+ /*
+ * Token response processing:
+ */
+ ExtractJsonHttpResponse.Descriptor,
+ DisposeHttpResponse.Descriptor);
+
+ ///
+ /// Contains the logic responsible of attaching the client credentials to the HTTP Authorization header.
+ ///
+ public class AttachBasicAuthenticationCredentials : IOpenIddictClientHandler
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler()
+ .SetOrder(AttachFormParameters.Descriptor.Order - 1000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(PrepareTokenRequestContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ Debug.Assert(context.Request is not null, SR.GetResourceString(SR.ID4008));
+
+ // This handler only applies to System.Net.Http requests. If the HTTP request cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var request = context.Transaction.GetHttpRequestMessage();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ // If no client identifier was attached to the request, skip the following logic.
+ if (string.IsNullOrEmpty(context.Request.ClientId))
+ {
+ return;
+ }
+
+ var configuration = await context.Registration.ConfigurationManager.GetConfigurationAsync(default) ??
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0140));
+
+ // Ensure the issuer resolved from the configuration matches the expected value.
+ if (configuration.Issuer != context.Issuer)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0307));
+ }
+
+ // The OAuth 2.0 specification recommends sending the client credentials using basic authentication.
+ // However, this authentication method is known to have compatibility issues with the way the
+ // client credentials are encoded (they MUST be formURL-encoded before being base64-encoded).
+ // To guarantee that the OpenIddict client handler can be used with servers implementing
+ // non-standard encoding, the client_secret_post is always preferred when it's explicitly
+ // listed as a supported client authentication method for the token endpoint.
+ // If client_secret_post is not listed or if the server returned an empty methods list,
+ // client_secret_basic is always used, as it MUST be implemented by all OAuth 2.0 servers.
+ //
+ // See https://tools.ietf.org/html/rfc8414#section-2
+ // and https://tools.ietf.org/html/rfc6749#section-2.3.1 for more information.
+ if (!configuration.TokenEndpointAuthMethodsSupported.Contains(ClientAuthenticationMethods.ClientSecretPost))
+ {
+ // Important: the credentials MUST be formURL-encoded before being base64-encoded.
+ var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(new StringBuilder()
+ .Append(EscapeDataString(context.Request.ClientId))
+ .Append(':')
+ .Append(EscapeDataString(context.Request.ClientSecret))
+ .ToString()));
+
+ // Attach the authorization header containing the client credentials to the HTTP request.
+ request.Headers.Authorization = new AuthenticationHeaderValue(Schemes.Basic, credentials);
+
+ // Remove the client credentials from the request payload to ensure they are not sent twice.
+ context.Request.ClientId = context.Request.ClientSecret = null;
+ }
+
+ static string? EscapeDataString(string? value)
+ => value is not null ? Uri.EscapeDataString(value).Replace("%20", "+") : null;
+ }
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.cs
new file mode 100644
index 00000000..cb1807f6
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHandlers.cs
@@ -0,0 +1,401 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Collections.Immutable;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Net.Http.Headers;
+using System.Text;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+[EditorBrowsable(EditorBrowsableState.Never)]
+public static partial class OpenIddictClientSystemNetHttpHandlers
+{
+ public static ImmutableArray DefaultHandlers { get; }
+ = ImmutableArray.Create()
+ .AddRange(Discovery.DefaultHandlers)
+ .AddRange(Exchange.DefaultHandlers);
+
+ ///
+ /// Contains the logic responsible of preparing an HTTP GET request message.
+ ///
+ public class PrepareGetHttpRequest : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MinValue + 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope",
+ Justification = "The HTTP request message is disposed later by a dedicated handler.")]
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ var request = new HttpRequestMessage(HttpMethod.Get, context.Address)
+ {
+ Headers =
+ {
+ Accept = { new MediaTypeWithQualityHeaderValue("application/json") },
+ AcceptCharset = { new StringWithQualityHeaderValue("utf-8") }
+ }
+ };
+
+ // Store the HttpRequestMessage in the transaction properties.
+ context.Transaction.SetProperty(typeof(HttpRequestMessage).FullName!, request);
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of preparing an HTTP POST request message.
+ ///
+ public class PreparePostHttpRequest : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(PrepareGetHttpRequest.Descriptor.Order + 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope",
+ Justification = "The HTTP request message is disposed later by a dedicated handler.")]
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ var request = new HttpRequestMessage(HttpMethod.Post, context.Address)
+ {
+ Headers =
+ {
+ Accept = { new MediaTypeWithQualityHeaderValue("application/json") },
+ AcceptCharset = { new StringWithQualityHeaderValue("utf-8") }
+ }
+ };
+
+ // Store the HttpRequestMessage in the transaction properties.
+ context.Transaction.SetProperty(typeof(HttpRequestMessage).FullName!, request);
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of attaching the query string parameters to the HTTP request.
+ ///
+ public class AttachQueryStringParameters : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(AttachFormParameters.Descriptor.Order - 1_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ Debug.Assert(context.Transaction.Request is not null, SR.GetResourceString(SR.ID4008));
+
+ // This handler only applies to System.Net.Http requests. If the HTTP request cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var request = context.Transaction.GetHttpRequestMessage();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ if (request.RequestUri is null || context.Transaction.Request.Count == 0)
+ {
+ return default;
+ }
+
+ var builder = new StringBuilder();
+
+ foreach (var (key, value) in
+ from parameter in context.Transaction.Request.GetParameters()
+ let values = (string?[]?) parameter.Value
+ where values is not null
+ from value in values
+ where !string.IsNullOrEmpty(value)
+ select (parameter.Key, Value: value))
+ {
+ if (builder.Length > 0)
+ {
+ builder.Append('&');
+ }
+
+ builder.Append(Uri.EscapeDataString(key));
+ builder.Append('=');
+ builder.Append(Uri.EscapeDataString(value));
+ }
+
+ // Compute the final request URI using the base address and the query string.
+ request.RequestUri = new UriBuilder(request.RequestUri) { Query = builder.ToString() }.Uri;
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of attaching the form parameters to the HTTP request.
+ ///
+ public class AttachFormParameters : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MaxValue - 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ Debug.Assert(context.Transaction.Request is not null, SR.GetResourceString(SR.ID4008));
+
+ // This handler only applies to System.Net.Http requests. If the HTTP request cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var request = context.Transaction.GetHttpRequestMessage();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ request.Content = new FormUrlEncodedContent(
+ from parameter in context.Transaction.Request.GetParameters()
+ let values = (string[]?) parameter.Value
+ where values is not null
+ from value in values
+ where !string.IsNullOrEmpty(value)
+ select new KeyValuePair(parameter.Key, value));
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of sending the HTTP request to the remote server.
+ ///
+ public class SendHttpRequest : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ private readonly IHttpClientFactory _factory;
+
+ public SendHttpRequest(IHttpClientFactory factory)
+ => _factory = factory;
+
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(DisposeHttpRequest.Descriptor.Order - 50_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to System.Net.Http requests. If the HTTP request cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var request = context.Transaction.GetHttpRequestMessage();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ var assembly = typeof(OpenIddictClientSystemNetHttpOptions).Assembly.GetName();
+ using var client = _factory.CreateClient(assembly.Name!);
+ if (client is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0174));
+ }
+
+#if SUPPORTS_HTTP_CLIENT_DEFAULT_REQUEST_VERSION
+ // If supported, import the HTTP version from the client instance.
+ request.Version = client.DefaultRequestVersion;
+#endif
+ var response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead);
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0175));
+ }
+
+ // Store the HttpResponseMessage in the transaction properties.
+ context.Transaction.SetProperty(typeof(HttpResponseMessage).FullName!, response);
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of disposing of the HTTP request message.
+ ///
+ public class DisposeHttpRequest : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MaxValue - 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to System.Net.Http requests. If the HTTP request cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var request = context.Transaction.GetHttpRequestMessage();
+ if (request is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ request.Dispose();
+
+ // Remove the request from the transaction properties.
+ context.Transaction.SetProperty(typeof(HttpRequestMessage).FullName!, null);
+
+ return default;
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of extracting the response from the JSON-encoded HTTP body.
+ ///
+ public class ExtractJsonHttpResponse : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(DisposeHttpResponse.Descriptor.Order - 50_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public async ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to System.Net.Http requests. If the HTTP response cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var response = context.Transaction.GetHttpResponseMessage();
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ // The status code is deliberately not validated to ensure even errored responses
+ // (typically in the 4xx range) can be deserialized and handled by the event handlers.
+
+ // Note: ReadFromJsonAsync() automatically validates the content type and the content encoding
+ // and transcode the response stream if a non-UTF-8 response is returned by the remote server.
+ context.Transaction.Response = await response.Content.ReadFromJsonAsync();
+ }
+ }
+
+ ///
+ /// Contains the logic responsible of disposing of the HTTP response message.
+ ///
+ public class DisposeHttpResponse : IOpenIddictClientHandler where TContext : BaseExternalContext
+ {
+ ///
+ /// Gets the default descriptor definition assigned to this handler.
+ ///
+ public static OpenIddictClientHandlerDescriptor Descriptor { get; }
+ = OpenIddictClientHandlerDescriptor.CreateBuilder()
+ .AddFilter()
+ .UseSingletonHandler>()
+ .SetOrder(int.MaxValue - 100_000)
+ .SetType(OpenIddictClientHandlerType.BuiltIn)
+ .Build();
+
+ ///
+ public ValueTask HandleAsync(TContext context)
+ {
+ if (context is null)
+ {
+ throw new ArgumentNullException(nameof(context));
+ }
+
+ // This handler only applies to System.Net.Http requests. If the HTTP response cannot be resolved,
+ // this may indicate that the request was incorrectly processed by another client stack.
+ var response = context.Transaction.GetHttpResponseMessage();
+ if (response is null)
+ {
+ throw new InvalidOperationException(SR.GetResourceString(SR.ID0173));
+ }
+
+ response.Dispose();
+
+ // Remove the response from the transaction properties.
+ context.Transaction.SetProperty(typeof(HttpResponseMessage).FullName!, null);
+
+ return default;
+ }
+ }
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHelpers.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHelpers.cs
new file mode 100644
index 00000000..9b290cc7
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpHelpers.cs
@@ -0,0 +1,31 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using OpenIddict.Client;
+
+namespace System.Net.Http;
+
+///
+/// Exposes companion extensions for the OpenIddict/System.Net.Http integration.
+///
+public static class OpenIddictClientSystemNetHttpHelpers
+{
+ ///
+ /// Gets the associated with the current context.
+ ///
+ /// The transaction instance.
+ /// The instance or null if it couldn't be found.
+ public static HttpRequestMessage? GetHttpRequestMessage(this OpenIddictClientTransaction transaction)
+ => transaction.GetProperty(typeof(HttpRequestMessage).FullName!);
+
+ ///
+ /// Gets the associated with the current context.
+ ///
+ /// The transaction instance.
+ /// The instance or null if it couldn't be found.
+ public static HttpResponseMessage? GetHttpResponseMessage(this OpenIddictClientTransaction transaction)
+ => transaction.GetProperty(typeof(HttpResponseMessage).FullName!);
+}
diff --git a/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpOptions.cs b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpOptions.cs
new file mode 100644
index 00000000..c31806b3
--- /dev/null
+++ b/src/OpenIddict.Client.SystemNetHttp/OpenIddictClientSystemNetHttpOptions.cs
@@ -0,0 +1,25 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+using System.Net;
+using Polly;
+using Polly.Extensions.Http;
+
+namespace OpenIddict.Client.SystemNetHttp;
+
+///
+/// Provides various settings needed to configure the OpenIddict client/System.Net.Http integration.
+///
+public class OpenIddictClientSystemNetHttpOptions
+{
+ ///
+ /// Gets or sets the HTTP Polly error policy used by the internal OpenIddict HTTP clients.
+ ///
+ public IAsyncPolicy HttpErrorPolicy { get; set; }
+ = HttpPolicyExtensions.HandleTransientHttpError()
+ .OrResult(response => response.StatusCode == HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(4, attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)));
+}
diff --git a/src/OpenIddict.Client/IOpenIddictClientDispatcher.cs b/src/OpenIddict.Client/IOpenIddictClientDispatcher.cs
new file mode 100644
index 00000000..eb401649
--- /dev/null
+++ b/src/OpenIddict.Client/IOpenIddictClientDispatcher.cs
@@ -0,0 +1,12 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ * See https://github.com/openiddict/openiddict-core for more information concerning
+ * the license and the contributors participating to this project.
+ */
+
+namespace OpenIddict.Client;
+
+public interface IOpenIddictClientDispatcher
+{
+ ValueTask DispatchAsync