diff --git a/src/templating/.gitignore b/src/templating/.gitignore
new file mode 100644
index 0000000000..38c1bc46c0
--- /dev/null
+++ b/src/templating/.gitignore
@@ -0,0 +1,40 @@
+[Oo]bj/
+[Bb]in/
+TestResults/
+.nuget/
+*.sln.ide/
+_ReSharper.*/
+packages/
+artifacts/
+PublishProfiles/
+.vs/
+node_modules/
+debugSettings.json
+project.lock.json
+*.user
+*.suo
+*.cache
+*.docstates
+_ReSharper.*
+nuget.exe
+*net45.csproj
+*net451.csproj
+*k10.csproj
+*.psess
+*.vsp
+*.pidb
+*.userprefs
+*DS_Store
+*.ncrunchsolution
+*.*sdf
+*.ipch
+.settings
+*.sln.ide
+node_modules
+**/[Cc]ompiler/[Rr]esources/**/*.js
+.build/
+.testPublish/
+.vscode
+global.json
+.idea/
+*.binlog
\ No newline at end of file
diff --git a/src/templating/Directory.Build.props b/src/templating/Directory.Build.props
new file mode 100644
index 0000000000..dc99bb566e
--- /dev/null
+++ b/src/templating/Directory.Build.props
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ Microsoft ASP.NET Core
+ $(MSBuildThisFileDirectory)
+ https://github.com/aspnet/templating
+ git
+ true
+
+
+
+
+
+
diff --git a/src/templating/Directory.Build.targets b/src/templating/Directory.Build.targets
new file mode 100644
index 0000000000..0863fc67a8
--- /dev/null
+++ b/src/templating/Directory.Build.targets
@@ -0,0 +1,8 @@
+
+
+ $(MicrosoftNETCoreApp30PackageVersion)
+ $(NETStandardLibrary20PackageVersion)
+
+ 99.9
+
+
\ No newline at end of file
diff --git a/src/templating/NuGetPackageVerifier.json b/src/templating/NuGetPackageVerifier.json
new file mode 100644
index 0000000000..bc3d3ec447
--- /dev/null
+++ b/src/templating/NuGetPackageVerifier.json
@@ -0,0 +1,34 @@
+{
+ "Default": {
+ "rules": [
+ "DefaultCompositeRule"
+ ],
+ "packages": {
+ "Microsoft.AspNetCore.SpaTemplates": {
+ "packageTypes": [
+ "Template"
+ ]
+ },
+ "Microsoft.DotNet.Web.Client.ItemTemplates": {
+ "packageTypes": [
+ "Template"
+ ]
+ },
+ "Microsoft.DotNet.Web.ItemTemplates": {
+ "packageTypes": [
+ "Template"
+ ]
+ },
+ "Microsoft.DotNet.Web.ProjectTemplates.3.0": {
+ "packageTypes": [
+ "Template"
+ ]
+ },
+ "Microsoft.DotNet.Web.Spa.ProjectTemplates": {
+ "packageTypes": [
+ "Template"
+ ]
+ }
+ }
+ }
+}
diff --git a/src/templating/README.md b/src/templating/README.md
new file mode 100644
index 0000000000..fbd681e88d
--- /dev/null
+++ b/src/templating/README.md
@@ -0,0 +1,12 @@
+# Templates
+
+## Getting Started
+ASP.NET Templates provide project templates which are used in .NET Core for creating ASP.NET Core applications.
+
+This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo.
+
+## Building Templates
+- Running build.cmd in this repo requires NPM which can be installed from https://nodejs.org/en/.
+- The ASP.NET localhost development certificate must also be installed and trusted or else you'll get a test error "Certificate error: Navigation blocked".
+- `build.cmd` (or `build /t:package` to avoid tests) will produce NuGet packages for each class of template in the artifacts directory. These can be installed via `dotnet new -i {nugetpackage path}`
+- You also need to get the packages these templates depend on into your package cache or else `dotnet new` restore will fail. The easiest way to get them to run is by letting the build run at least 1 test.
diff --git a/src/templating/Templating.sln b/src/templating/Templating.sln
new file mode 100644
index 0000000000..e98539fcdb
--- /dev/null
+++ b/src/templating/Templating.sln
@@ -0,0 +1,78 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2036
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Test", "test\Templates.Test\Templates.Test.csproj", "{D43A4D24-D514-44C2-9438-54F6EDF58680}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ItemTemplates", "src\Microsoft.DotNet.Web.ItemTemplates\Microsoft.DotNet.Web.ItemTemplates.csproj", "{ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TemplatePackages", "TemplatePackages", "{0AD6E692-E423-408C-B523-DAFB19412E4B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.Spa.ProjectTemplates", "src\Microsoft.DotNet.Web.Spa.ProjectTemplates\Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj", "{402E62D1-7FD0-4E07-812C-0E385D98D6D9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.Client.ItemTemplates", "src\Microsoft.DotNet.Web.Client.ItemTemplates\Microsoft.DotNet.Web.Client.ItemTemplates.csproj", "{1731F6D9-1DFC-49D6-8F28-471194B1962C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ProjectTemplates", "src\Microsoft.DotNet.Web.ProjectTemplates\Microsoft.DotNet.Web.ProjectTemplates.csproj", "{260EBA09-DEF5-429C-99BF-90CA1456A576}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F34CD7D7-1E8F-41FA-AB4D-D86BFD3AC09B}"
+ ProjectSection(SolutionItems) = preProject
+ build\dependencies.props = build\dependencies.props
+ build\repo.props = build\repo.props
+ build\sources.props = build\sources.props
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{342602FC-9FF3-448D-B12D-F0E91B23DBBF}"
+ ProjectSection(SolutionItems) = preProject
+ test\Directory.Build.targets = test\Directory.Build.targets
+ test\GenerateTestProps.targets = test\GenerateTestProps.targets
+ test\TemplateTests.props.in = test\TemplateTests.props.in
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetToolsInstaller", "test\DotNetToolsInstaller\DotNetToolsInstaller.csproj", "{61F386CF-4356-4B7E-8A98-F09759E65AC9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D43A4D24-D514-44C2-9438-54F6EDF58680}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D43A4D24-D514-44C2-9438-54F6EDF58680}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D43A4D24-D514-44C2-9438-54F6EDF58680}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D43A4D24-D514-44C2-9438-54F6EDF58680}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {402E62D1-7FD0-4E07-812C-0E385D98D6D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {402E62D1-7FD0-4E07-812C-0E385D98D6D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {402E62D1-7FD0-4E07-812C-0E385D98D6D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {402E62D1-7FD0-4E07-812C-0E385D98D6D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1731F6D9-1DFC-49D6-8F28-471194B1962C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1731F6D9-1DFC-49D6-8F28-471194B1962C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1731F6D9-1DFC-49D6-8F28-471194B1962C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1731F6D9-1DFC-49D6-8F28-471194B1962C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {260EBA09-DEF5-429C-99BF-90CA1456A576}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {260EBA09-DEF5-429C-99BF-90CA1456A576}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {260EBA09-DEF5-429C-99BF-90CA1456A576}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {260EBA09-DEF5-429C-99BF-90CA1456A576}.Release|Any CPU.Build.0 = Release|Any CPU
+ {61F386CF-4356-4B7E-8A98-F09759E65AC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {61F386CF-4356-4B7E-8A98-F09759E65AC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {61F386CF-4356-4B7E-8A98-F09759E65AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {61F386CF-4356-4B7E-8A98-F09759E65AC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {D43A4D24-D514-44C2-9438-54F6EDF58680} = {342602FC-9FF3-448D-B12D-F0E91B23DBBF}
+ {ABC9D95C-7FBD-4F8D-827A-00942EA3D0C0} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
+ {402E62D1-7FD0-4E07-812C-0E385D98D6D9} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
+ {1731F6D9-1DFC-49D6-8F28-471194B1962C} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
+ {260EBA09-DEF5-429C-99BF-90CA1456A576} = {0AD6E692-E423-408C-B523-DAFB19412E4B}
+ {61F386CF-4356-4B7E-8A98-F09759E65AC9} = {342602FC-9FF3-448D-B12D-F0E91B23DBBF}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {E9B27B0D-4F85-431B-9C26-80CFE4393D36}
+ EndGlobalSection
+EndGlobal
diff --git a/src/templating/build/dependencies.props b/src/templating/build/dependencies.props
new file mode 100644
index 0000000000..cc2d436ce7
--- /dev/null
+++ b/src/templating/build/dependencies.props
@@ -0,0 +1,38 @@
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+
+
+ 0.9.9
+ 3.0.0-preview-181109-02
+ 3.0.0-alpha1-20181017.4
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-preview-181113-11
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-alpha1-10742
+ 3.0.0-preview-181113-11
+ 3.0.0-preview-181109-02
+ 3.0.0-preview-181109-02
+ 3.0.0-preview-181109-02
+ 3.0.0-preview-181113-11
+ 3.0.0-preview-181113-11
+ 3.0.0-preview1-26907-05
+ 3.0.0-alpha1-10742
+ 15.6.1
+ 2.0.3
+ 3.12.1
+ 17.17134.0
+ 3.12.1
+ 4.6.0-preview1-26907-04
+ 0.10.0
+ 2.3.1
+ 2.4.0
+
+
+
+
diff --git a/src/templating/build/repo.props b/src/templating/build/repo.props
new file mode 100644
index 0000000000..167382eba7
--- /dev/null
+++ b/src/templating/build/repo.props
@@ -0,0 +1,18 @@
+
+
+
+
+
+ Internal.AspNetCore.Universe.Lineup
+ https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/build/sources.props b/src/templating/build/sources.props
new file mode 100644
index 0000000000..9215df9751
--- /dev/null
+++ b/src/templating/build/sources.props
@@ -0,0 +1,17 @@
+
+
+
+
+ $(DotNetRestoreSources)
+
+ $(RestoreSources);
+ https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
+ https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json;
+ https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
+
+
+ $(RestoreSources);
+ https://api.nuget.org/v3/index.json;
+
+
+
diff --git a/src/templating/migrations/updateMigrations.cmd b/src/templating/migrations/updateMigrations.cmd
new file mode 100644
index 0000000000..9aaf19fb52
--- /dev/null
+++ b/src/templating/migrations/updateMigrations.cmd
@@ -0,0 +1,68 @@
+SET version=3.0.0-alpha1
+echo Make sure to have ran build.cmd once to ensure artifacts have been created.
+echo Generating version=%version%, edit updateMigrations.cmd to update the version.
+
+echo Generating migration for RazorPages-SqlLite--------------
+rd "Company.WebApplication1" /s /q
+mkdir "Company.WebApplication1"
+dotnet new razor --no-restore --auth Individual -i ..\artifacts\build\Microsoft.DotNet.Web.ProjectTemplates.*.nupkg -o Company.WebApplication1
+rd "Company.WebApplication1\Data\Migrations" /s /q
+powershell.exe -File .\updateProj.ps1
+cd Company.WebApplication1
+dotnet ef migrations add CreateIdentitySchema -o Data\Migrations
+cd ..
+move Company.WebApplication1\Data\Migrations\*.Designer.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
+move Company.WebApplication1\Data\Migrations\*_CreateIdentitySchema.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.cs
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('([0-9]{14})_CreateIdentitySchema', '00000000000000_CreateIdentitySchema') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs"
+copy "Company.WebApplication1\Data\Migrations\*" "..\src\Microsoft.DotNet.Web.ProjectTemplates\content\RazorPagesWeb-CSharp\Data\SqlLite"
+
+echo Generating migration for RazorPages-SqlServer(localb)--------------
+rd "Company.WebApplication1" /s /q
+mkdir "Company.WebApplication1"
+dotnet new razor --no-restore --auth Individual --use-local-db -i ..\artifacts\build\Microsoft.DotNet.Web.ProjectTemplates.*.nupkg -o Company.WebApplication1
+rd "Company.WebApplication1\Data\Migrations" /s /q
+powershell.exe -File .\updateProj.ps1
+cd Company.WebApplication1
+dotnet ef migrations add CreateIdentitySchema -o Data\Migrations
+cd ..
+move Company.WebApplication1\Data\Migrations\*.Designer.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
+move Company.WebApplication1\Data\Migrations\*_CreateIdentitySchema.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.cs
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('([0-9]{14})_CreateIdentitySchema', '00000000000000_CreateIdentitySchema') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs"
+copy "Company.WebApplication1\Data\Migrations\*" "..\src\Microsoft.DotNet.Web.ProjectTemplates\content\RazorPagesWeb-CSharp\Data\SqlServer"
+rd "Company.WebApplication1" /s /q
+
+echo Generating migration for StarterWeb-SqlServer(localb)--------------
+mkdir "Company.WebApplication1"
+dotnet new mvc --no-restore --auth Individual --use-local-db -i ..\artifacts\build\Microsoft.DotNet.Web.ProjectTemplates.*.nupkg -o Company.WebApplication1
+rd "Company.WebApplication1\Data\Migrations" /s /q
+powershell.exe -File .\updateProj.ps1
+cd Company.WebApplication1
+dotnet ef migrations add CreateIdentitySchema -o Data\Migrations
+cd ..
+move Company.WebApplication1\Data\Migrations\*.Designer.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
+move Company.WebApplication1\Data\Migrations\*_CreateIdentitySchema.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.cs
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('([0-9]{14})_CreateIdentitySchema', '00000000000000_CreateIdentitySchema') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs"
+copy "Company.WebApplication1\Data\Migrations\*" "..\src\Microsoft.DotNet.Web.ProjectTemplates\content\StarterWeb-CSharp\Data\SqlServer"
+
+echo Generating migration for StarterWeb-SqlLite--------------
+rd "Company.WebApplication1" /s /q
+mkdir "Company.WebApplication1"
+dotnet new mvc --no-restore --auth Individual -i ..\artifacts\build\Microsoft.DotNet.Web.ProjectTemplates.*.nupkg -o Company.WebApplication1
+rd "Company.WebApplication1\Data\Migrations" /s /q
+powershell.exe -File .\updateProj.ps1
+cd Company.WebApplication1
+dotnet ef migrations add CreateIdentitySchema -o Data\Migrations
+cd ..
+move Company.WebApplication1\Data\Migrations\*.Designer.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
+move Company.WebApplication1\Data\Migrations\*_CreateIdentitySchema.cs Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.cs
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('([0-9]{14})_CreateIdentitySchema', '00000000000000_CreateIdentitySchema') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs"
+powershell.exe -command "(Get-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs) -replace('[0-9].[0-9].[0-9]-[^-]*-[0-9]*', '%version%') | Set-Content Company.WebApplication1\Data\Migrations\ApplicationDbContextModelSnapshot.cs"
+copy "Company.WebApplication1\Data\Migrations\*" "..\src\Microsoft.DotNet.Web.ProjectTemplates\content\StarterWeb-CSharp\Data\SqlLite"
+rd "Company.WebApplication1" /s /q
diff --git a/src/templating/migrations/updateProj.ps1 b/src/templating/migrations/updateProj.ps1
new file mode 100644
index 0000000000..d689eb8d5f
--- /dev/null
+++ b/src/templating/migrations/updateProj.ps1
@@ -0,0 +1,5 @@
+$contents = Get-Content Company.WebApplication1\Company.WebApplication1.csproj -Raw
+$matches = [Regex]::Match($contents, 'Version=\"(?[^\"]+)\"');
+$appVer = $matches.Groups[1].Value
+$replace = 'App" Version="' + $appVer + '"';
+$contents -replace('App\"', $replace) | Set-Content Company.WebApplication1\Company.WebApplication1.csproj
diff --git a/src/templating/scripts/.gitignore b/src/templating/scripts/.gitignore
new file mode 100644
index 0000000000..28dd619ab6
--- /dev/null
+++ b/src/templating/scripts/.gitignore
@@ -0,0 +1,8 @@
+package-lock.json
+tmp/
+CustomHive/
+angular/
+mvc/
+razor/
+react/
+reactredux/
diff --git a/src/templating/scripts/Audit-Packages.ps1 b/src/templating/scripts/Audit-Packages.ps1
new file mode 100644
index 0000000000..204c78b123
--- /dev/null
+++ b/src/templating/scripts/Audit-Packages.ps1
@@ -0,0 +1,32 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param(
+ [switch]$fix = $false
+)
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+$contentDir = "$PSScriptRoot/../src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content"
+foreach ($package in $contentDir) {
+ $spaFrameworks = Get-ChildItem -Path $package -Directory
+
+ foreach ($spaFramework in $spaFrameworks) {
+ $spaFrameworkDir = Join-Path $contentDir $spaFramework
+ $clientApp = Join-Path $spaFrameworkDir "ClientApp"
+ Push-Location $clientApp
+ try {
+ Write-Output "Auditing $clientApp"
+ if ($fix) {
+ npm audit fix --force
+ }
+ else {
+ npm audit
+ }
+ }
+ finally {
+ Pop-Location
+ }
+ }
+}
diff --git a/src/templating/scripts/Run-Angular-Locally.ps1 b/src/templating/scripts/Run-Angular-Locally.ps1
new file mode 100644
index 0000000000..53f50b852f
--- /dev/null
+++ b/src/templating/scripts/Run-Angular-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "angular" "angular" "Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0.0-alpha1.nupkg" $true
diff --git a/src/templating/scripts/Run-Razor-Locally.ps1 b/src/templating/scripts/Run-Razor-Locally.ps1
new file mode 100644
index 0000000000..ee6d2d56f0
--- /dev/null
+++ b/src/templating/scripts/Run-Razor-Locally.ps1
@@ -0,0 +1,9 @@
+#!/usr/bin/env powershell
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "webapp" "webapp -au Individual" "Microsoft.DotNet.Web.ProjectTemplates.3.0.3.0.0-alpha1.nupkg" $false
diff --git a/src/templating/scripts/Run-React-Locally.ps1 b/src/templating/scripts/Run-React-Locally.ps1
new file mode 100644
index 0000000000..8707df6796
--- /dev/null
+++ b/src/templating/scripts/Run-React-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "react" "react" "Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0.0-alpha1.nupkg" $true
diff --git a/src/templating/scripts/Run-ReactRedux-Locally.ps1 b/src/templating/scripts/Run-ReactRedux-Locally.ps1
new file mode 100644
index 0000000000..be39c16a59
--- /dev/null
+++ b/src/templating/scripts/Run-ReactRedux-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "reactredux" "reactredux" "Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0.0-alpha1.nupkg" $true
diff --git a/src/templating/scripts/Run-Starterweb-Locally.ps1 b/src/templating/scripts/Run-Starterweb-Locally.ps1
new file mode 100644
index 0000000000..4eeff2e81b
--- /dev/null
+++ b/src/templating/scripts/Run-Starterweb-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "mvc" "mvc -au Individual" "Microsoft.DotNet.Web.ProjectTemplates.3.0.3.0.0-alpha1.nupkg" $false
diff --git a/src/templating/scripts/Test-Template.ps1 b/src/templating/scripts/Test-Template.ps1
new file mode 100644
index 0000000000..bb9b028a6f
--- /dev/null
+++ b/src/templating/scripts/Test-Template.ps1
@@ -0,0 +1,41 @@
+function Test-Template($templateName, $templateArgs, $templateNupkg, $isSPA) {
+ $tmpDir = "$PSScriptRoot/$templateName"
+ Remove-Item -Path $tmpDir -Recurse -ErrorAction Ignore
+
+ & "$PSScriptRoot/../build.cmd" /t:Package
+ Run-DotnetNew "--install", "$PSScriptRoot/../artifacts/build/$templateNupkg"
+
+ New-Item -ErrorAction Ignore -Path $tmpDir -ItemType Directory
+ Push-Location $tmpDir
+ try {
+ Run-DotnetNew $templateArgs, "--no-restore"
+
+ if ($templateArgs -match 'F#') {
+ $extension = "fsproj"
+ }
+ else {
+ $extension = "csproj"
+ }
+
+ $proj = "$tmpDir/$templateName.$extension"
+ $projContent = Get-Content -Path $proj -Raw
+ $projContent = $projContent -replace ('', "
+
+
+
+ ")
+ $projContent | Set-Content $proj
+
+ dotnet publish --configuration Release
+ dotnet bin\Release\netcoreapp2.2\publish\$templateName.dll
+ }
+ finally {
+ Pop-Location
+ Run-DotnetNew "--debug:reinit"
+ }
+}
+
+function Run-DotnetNew($arguments) {
+ $expression = "dotnet new $arguments"
+ Invoke-Expression $expression
+}
diff --git a/src/templating/src/Directory.Build.props b/src/templating/src/Directory.Build.props
new file mode 100644
index 0000000000..03608a0aa8
--- /dev/null
+++ b/src/templating/src/Directory.Build.props
@@ -0,0 +1,29 @@
+
+
+
+
+ false
+ False
+ False
+ False
+ 2008;8021
+ aspnet;templates
+ $(MSBuildThisFileDirectory)templates.nuspec
+ $(MSBuildProjectDirectory)
+
+
+
+
+ true
+ $(MSBuildThisFileDirectory)..\artifacts\build\
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Directory.Build.targets b/src/templating/src/Directory.Build.targets
new file mode 100644
index 0000000000..ca58cc72be
--- /dev/null
+++ b/src/templating/src/Directory.Build.targets
@@ -0,0 +1,12 @@
+
+
+ false
+ false
+
+ 99.9
+
+
+
+
+
+
diff --git a/src/templating/src/GenerateContent.targets b/src/templating/src/GenerateContent.targets
new file mode 100644
index 0000000000..96251c178b
--- /dev/null
+++ b/src/templating/src/GenerateContent.targets
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
new file mode 100644
index 0000000000..c78ecd9774
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
@@ -0,0 +1,11 @@
+
+
+
+ netcoreapp3.0
+ Web Client-Side File Templates for Microsoft Template Engine
+
+ To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/template.json
new file mode 100644
index 0000000000..9d379e9c9f
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/template.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "Style" ],
+ "name": "LESS Style Sheet",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "LESS is a language that compiles into CSS",
+ "groupIdentity": "Microsoft.DotNet.Web.ClientItems.Less",
+ "precedence": "100",
+ "identity": "Microsoft.DotNet.Web.ClientItems.Less",
+ "shortName": "less",
+ "sourceName": "styleSheet1",
+ "tags": {
+ "type": "item"
+ },
+ "primaryOutputs": [
+ {
+ "path": "styleSheet1.less"
+ }
+ ],
+ "defaultName": "styleSheet1",
+ "symbols": {
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens styleSheet1.less in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/styleSheet1.less b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/styleSheet1.less
new file mode 100644
index 0000000000..46800d16ad
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/styleSheet1.less
@@ -0,0 +1,2 @@
+body {
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/template.json
new file mode 100644
index 0000000000..f720f59f3d
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/template.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "Style" ],
+ "name": "SCSS Style Sheet (SASS)",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "SCSS is a language that compiles into CSS",
+ "groupIdentity": "Microsoft.DotNet.Web.ClientItems.Scss",
+ "precedence": "100",
+ "identity": "Microsoft.DotNet.Web.ClientItems.Scss",
+ "shortName": "scss",
+ "sourceName": "styleSheet1",
+ "tags": {
+ "type": "item"
+ },
+ "primaryOutputs": [
+ {
+ "path": "styleSheet1.scss"
+ }
+ ],
+ "defaultName": "styleSheet1",
+ "symbols": {
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens styleSheet1.scss in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/styleSheet1.scss b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/styleSheet1.scss
new file mode 100644
index 0000000000..46800d16ad
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/styleSheet1.scss
@@ -0,0 +1,2 @@
+body {
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json
new file mode 100644
index 0000000000..38be31e1d3
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "Script" ],
+ "name": "TypeScript file",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "A blank TypeScript source file",
+ "groupIdentity": "Microsoft.DotNet.Web.ClientItems.TypeScript",
+ "precedence": "100",
+ "identity": "Microsoft.DotNet.Web.ClientItems.TypeScript",
+ "shortName": "tsfile",
+ "sourceName": "file1",
+ "tags": {
+ "type": "item"
+ },
+ "primaryOutputs": [
+ {
+ "path": "file1.ts"
+ }
+ ],
+ "defaultName": "file1",
+ "symbols": {
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens file1.ts in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/file1.ts b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/file1.ts
new file mode 100644
index 0000000000..c031161736
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/file1.ts
@@ -0,0 +1 @@
+// Write your TypeScript code.
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
new file mode 100644
index 0000000000..3476cedd61
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
@@ -0,0 +1,10 @@
+
+
+
+ netcoreapp3.0
+ Web File Templates for Microsoft Template Engine
+
+ To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/template.json
new file mode 100644
index 0000000000..e58b009ae4
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/template.json
@@ -0,0 +1,70 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "ASP.NET" ],
+ "name": "Razor Page",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "A Razor page with or without a page model",
+ "tags": {
+ "language": "C#",
+ "type": "item"
+ },
+ "groupIdentity": "Microsoft.AspNetCore.Mvc.RazorPage",
+ "precedence": "100",
+ "identity": "Microsoft.AspNetCore.Mvc.RazorPage",
+ "shortName": "page",
+ "sourceName": "Index",
+ "primaryOutputs": [
+ { "path": "Index.cshtml" },
+ {
+ "path": "Index.cshtml.cs",
+ "condition": "(!no-pagemodel)"
+ }
+ ],
+ "defaultName": "Index",
+ "sources": [
+ {
+ "modifiers": [
+ {
+ "condition": "(no-pagemodel)",
+ "exclude": [
+ "Index.cshtml.cs"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "namespace": {
+ "description": "namespace for the generated code",
+ "replaces": "MyApp.Namespace",
+ "type": "parameter"
+ },
+ "no-pagemodel": {
+ "description": "create page without a PageModel",
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false"
+ },
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ },
+ "NameIsPage": {
+ "type": "computed",
+ "value": "(name == \"Page\")"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens Index.cshtml in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml
new file mode 100644
index 0000000000..4be0b7fe8d
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml
@@ -0,0 +1,6 @@
+@page
+@*#if (!no-pagemodel)*@
+@model MyApp.Namespace.IndexModel
+@*#endif*@
+@{
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml.cs b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml.cs
new file mode 100644
index 0000000000..45faf36c3e
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace MyApp.Namespace
+{
+#if NameIsPage
+ public class IndexModel : Microsoft.AspNetCore.Mvc.RazorPages.PageModel
+#else
+ public class IndexModel : PageModel
+#endif
+ {
+ public void OnGet()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/template.json
new file mode 100644
index 0000000000..1b42ce63b7
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/template.json
@@ -0,0 +1,46 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "ASP.NET" ],
+ "name": "MVC ViewImports",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "An MVC View Import Page",
+ "tags": {
+ "language": "C#",
+ "type": "item"
+ },
+ "groupIdentity": "Microsoft.AspNetCore.Mvc.ViewImports",
+ "precedence": "100",
+ "identity": "Microsoft.AspNetCore.Mvc.ViewImports",
+ "shortName": "viewimports",
+ "sourceName": "ignoreme",
+ "primaryOutputs": [
+ {
+ "path": "_ViewImports.cshtml"
+ }
+ ],
+ "defaultName": "_ViewImports",
+ "symbols": {
+ "namespace": {
+ "description": "namespace for the generated code",
+ "replaces": "MyApp.Namespace",
+ "type": "parameter"
+ },
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens _ViewImports.cshtml in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml
new file mode 100644
index 0000000000..041eb30479
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml
@@ -0,0 +1,2 @@
+@namespace MyApp.Namespace
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..94f4ee1014
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json
@@ -0,0 +1,3 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/template.json
new file mode 100644
index 0000000000..08d4427017
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/template.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [ "Web", "ASP.NET" ],
+ "name": "MVC ViewStart",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "An MVC ViewStart Page",
+ "tags": {
+ "language": "C#",
+ "type": "item"
+ },
+ "groupIdentity": "Microsoft.AspNetCore.Mvc.ViewStart",
+ "precedence": "100",
+ "identity": "Microsoft.AspNetCore.Mvc.ViewStart",
+ "shortName": "viewstart",
+ "sourceName": "ignoreme",
+ "primaryOutputs": [
+ {
+ "path": "_ViewStart.cshtml"
+ }
+ ],
+ "defaultName": "_ViewStart",
+ "symbols": {
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ }
+ },
+ "postActions": [
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens _ViewStart.cshtml in the editor",
+ "manualInstructions": [ ],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml
new file mode 100644
index 0000000000..1af6e49466
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "_Layout";
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/.gitignore b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/.gitignore
new file mode 100644
index 0000000000..dc70ec650b
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/.gitignore
@@ -0,0 +1,2 @@
+# This file is generated by the build
+content/*/*.*proj
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
new file mode 100644
index 0000000000..182ae2e7bf
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
@@ -0,0 +1,10 @@
+
+
+
+ netcoreapp3.0
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
new file mode 100644
index 0000000000..465baa7051
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
@@ -0,0 +1,15 @@
+
+
+
+ netcoreapp3.0
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
new file mode 100644
index 0000000000..b13e1d7352
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
@@ -0,0 +1,67 @@
+
+
+
+
+
+ netcoreapp3.0
+ Microsoft.DotNet.Web.ProjectTemplates.3.0
+ ASP.NET Core Web Template Pack for Microsoft Template Engine
+
+ To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
+
+
+
+
+
+
+
+
+
+
+
+
+ MicrosoftAspNetCoreAppPackageVersion=$(MicrosoftAspNetCoreAppPackageVersion);
+ MicrosoftAspNetCoreAuthenticationAzureADB2CUIPackageVersion=$(MicrosoftAspNetCoreAuthenticationAzureADB2CUIPackageVersion);
+ MicrosoftAspNetCoreAuthenticationAzureADUIPackageVersion=$(MicrosoftAspNetCoreAuthenticationAzureADUIPackageVersion);
+ MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion=$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion);
+ MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion=$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion);
+ MicrosoftAspNetCoreIdentityUIPackageVersion=$(MicrosoftAspNetCoreIdentityUIPackageVersion);
+ MicrosoftAspNetCorePackageVersion=$(MicrosoftAspNetCorePackageVersion);
+ MicrosoftEntityFrameworkCoreDesignPackageVersion=$(MicrosoftEntityFrameworkCoreDesignPackageVersion);
+ MicrosoftEntityFrameworkCoreSqlitePackageVersion=$(MicrosoftEntityFrameworkCoreSqlitePackageVersion);
+ MicrosoftEntityFrameworkCoreSqlServerPackageVersion=$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion);
+ MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion=$(MicrosoftEntityFrameworkCoreToolsDotNetPackageVersion);
+ MicrosoftEntityFrameworkCoreToolsPackageVersion=$(MicrosoftEntityFrameworkCoreToolsPackageVersion);
+ MicrosoftNETCoreApp30PackageVersion=$(MicrosoftNETCoreApp30PackageVersion);
+
+
+
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+ $(GeneratedContentProperties)
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in
new file mode 100644
index 0000000000..c7a7314001
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in
@@ -0,0 +1,12 @@
+
+
+
+ netcoreapp3.0
+ Company.RazorClassLibrary1
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
new file mode 100644
index 0000000000..373bb82df1
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
@@ -0,0 +1,31 @@
+
+
+
+ netcoreapp3.0
+ aspnet-Company.WebApplication1-0ce56475-d1db-490f-8af1-a881ea4fcd2d
+ 0
+ 1
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
new file mode 100644
index 0000000000..9c699ac86a
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
@@ -0,0 +1,31 @@
+
+
+
+ netcoreapp3.0
+ aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502
+ 0
+ 1
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
new file mode 100644
index 0000000000..9a933030f0
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
@@ -0,0 +1,18 @@
+
+
+
+ netcoreapp3.0
+ true
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in
new file mode 100644
index 0000000000..f7bec3772c
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in
@@ -0,0 +1,18 @@
+
+
+
+ netcoreapp3.0
+ aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502
+ 0
+ 1
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in
new file mode 100644
index 0000000000..7acc46b5fe
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in
@@ -0,0 +1,16 @@
+
+
+
+ netcoreapp3.0
+ True
+ InProcess
+ Company.WebApplication1
+
+
+
+
+
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.props b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.props
new file mode 100644
index 0000000000..7916bd8054
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.props
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.targets b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.targets
new file mode 100644
index 0000000000..0f803ab0e0
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.targets
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..79c2dc39e3
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "Framework": {
+ "longName": "framework"
+ },
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ },
+ "HttpPort": {
+ "isHidden": true
+ },
+ "HttpsPort": {
+ "isHidden": true
+ },
+ "ExcludeLaunchSettings": {
+ "longName": "exclude-launch-settings",
+ "shortName": ""
+ },
+ "NoHttps": {
+ "longName": "no-https",
+ "shortName": ""
+ }
+ },
+ "usageExamples": [
+ ""
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json
new file mode 100644
index 0000000000..2a6cd28774
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json
@@ -0,0 +1,136 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "Empty"
+ ],
+ "name": "ASP.NET Core Empty",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
+ "groupIdentity": "Microsoft.Web.Empty",
+ "precedence": "5000",
+ "identity": "Microsoft.Web.Empty.CSharp.3.0",
+ "shortName": "web",
+ "tags": {
+ "language": "C#",
+ "type": "project"
+ },
+ "sourceName": "Company.WebApplication1",
+ "preferNameDirectory": true,
+ "guids": [
+ "53bc9b9d-9d6a-45d4-8429-2a2761773502"
+ ],
+ "sources": [
+ {
+ "modifiers": [
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Properties/launchSettings.json"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "ExcludeLaunchSettings": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to exclude launchSettings.json from the generated template."
+ },
+ "HttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "HttpPortGenerated": {
+ "type": "generated",
+ "generator": "port"
+ },
+ "HttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpPort",
+ "fallbackVariableName": "HttpPortGenerated"
+ },
+ "replaces": "8080"
+ },
+ "HttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ },
+ "HttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 44300,
+ "high": 44399
+ }
+ },
+ "HttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpsPort",
+ "fallbackVariableName": "HttpsPortGenerated"
+ },
+ "replaces": "44300"
+ },
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "netcoreapp3.0",
+ "description": "Target netcoreapp3.0"
+ }
+ ],
+ "replaces": "netcoreapp3.0",
+ "defaultValue": "netcoreapp3.0"
+ },
+ "copyrightYear": {
+ "type": "generated",
+ "generator": "now",
+ "replaces": "copyrightYear",
+ "parameters": {
+ "format": "yyyy"
+ }
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ },
+ "NoHttps": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "Company.WebApplication1.csproj"
+ }
+ ],
+ "defaultName": "WebApplication1",
+ "postActions": [
+ {
+ "condition": "(!skipRestore)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3.host.json
new file mode 100644
index 0000000000..a4dca6b104
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3.host.json
@@ -0,0 +1,39 @@
+{
+ "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "name": {
+ "text": "Empty",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1011"
+ },
+ "description": {
+ "text": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1012"
+ },
+ "order": 100,
+ "icon": "vs-2017.3/Empty.png",
+ "learnMoreLink": "https://go.microsoft.com/fwlink/?LinkID=784883",
+ "uiFilters": [ "oneaspnet" ],
+ "supportsDocker": true,
+ "legacyTemplateIdentity": "Microsoft.NetCore.CSharp.EmptyWeb",
+ "supportedAuthentications": [
+ {
+ "auth": "None",
+ "authenticationType": "NoAuth",
+ "allowUnsecured": true
+ }
+ ],
+ "ports": [
+ {
+ "name": "HttpPort",
+ "useHttps": false
+ },
+ {
+ "name": "HttpsPort",
+ "useHttps": true
+ }
+ ],
+ "excludeLaunchSettings": false,
+ "minFullFrameworkVersion": "4.6.1",
+ "disableHttpsSymbol": "NoHttps"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3/Empty.png b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3/Empty.png
new file mode 100644
index 0000000000..ea4b7e2492
Binary files /dev/null and b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/vs-2017.3/Empty.png differ
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Program.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Program.cs
new file mode 100644
index 0000000000..4fda9f8d66
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Program.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+
+namespace Company.WebApplication1
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateWebHostBuilder(args).Build().Run();
+ }
+
+ public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
+ WebHost.CreateDefaultBuilder(args)
+ .UseStartup();
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json
new file mode 100644
index 0000000000..c327c4f218
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json
@@ -0,0 +1,40 @@
+{
+ "iisSettings": {
+ //#if (WindowsAuth)
+ "windowsAuthentication": true,
+ "anonymousAuthentication": false,
+ //#else
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ //#endif
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8080",
+ //#if(NoHttps)
+ "sslPort": 0
+ //#else
+ "sslPort": 44300
+ //#endif
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "Company.WebApplication1": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ //#if(NoHttps)
+ "applicationUrl": "http://localhost:5000",
+ //#else
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ //#endif
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Startup.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Startup.cs
new file mode 100644
index 0000000000..d039a38a68
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/Startup.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Company.WebApplication1
+{
+ public class Startup
+ {
+ // This method gets called by the runtime. Use this method to add services to the container.
+ // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+ public void ConfigureServices(IServiceCollection services)
+ {
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IHostingEnvironment env)
+ {
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+
+ app.Run(async (context) =>
+ {
+ await context.Response.WriteAsync("Hello World!");
+ });
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.Development.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.Development.json
new file mode 100644
index 0000000000..e203e9407e
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.json
new file mode 100644
index 0000000000..def9159a7d
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..2bfb0f6145
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "Framework": {
+ "longName": "framework"
+ },
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ },
+ "HttpPort": {
+ "isHidden": true
+ },
+ "HttpsPort": {
+ "isHidden": true
+ },
+ "ExcludeLaunchSettings": {
+ "longName": "exclude-launch-settings",
+ "shortName": ""
+ },
+ "NoHttps": {
+ "longName": "no-https",
+ "shortName": ""
+ }
+ },
+ "usageExamples": [
+ ""
+ ]
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json
new file mode 100644
index 0000000000..53429c688e
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json
@@ -0,0 +1,132 @@
+{
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "Empty"
+ ],
+ "name": "ASP.NET Core Empty",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
+ "groupIdentity": "Microsoft.Web.Empty",
+ "precedence": "5000",
+ "identity": "Microsoft.Web.Empty.FSharp.3.0",
+ "shortName": "web",
+ "tags": {
+ "language": "F#",
+ "type": "project"
+ },
+ "sourceName": "Company.WebApplication1",
+ "preferNameDirectory": true,
+ "sources": [
+ {
+ "modifiers": [
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Properties/launchSettings.json"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "ExcludeLaunchSettings": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to exclude launchSettings.json from the generated template."
+ },
+ "HttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "HttpPortGenerated": {
+ "type": "generated",
+ "generator": "port"
+ },
+ "HttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpPort",
+ "fallbackVariableName": "HttpPortGenerated"
+ },
+ "replaces": "8080"
+ },
+ "HttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ },
+ "HttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 44300,
+ "high": 44399
+ }
+ },
+ "HttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpsPort",
+ "fallbackVariableName": "HttpsPortGenerated"
+ },
+ "replaces": "44300"
+ },
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "netcoreapp3.0",
+ "description": "Target netcoreapp3.0"
+ }
+ ],
+ "replaces": "netcoreapp3.0",
+ "defaultValue": "netcoreapp3.0"
+ },
+ "copyrightYear": {
+ "type": "generated",
+ "generator": "now",
+ "replaces": "copyrightYear",
+ "parameters": {
+ "format": "yyyy"
+ }
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ },
+ "NoHttps": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "Company.WebApplication1.fsproj"
+ }
+ ],
+ "defaultName": "WebApplication1",
+ "postActions": [
+ {
+ "condition": "(!skipRestore)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3.host.json
new file mode 100644
index 0000000000..1aa6393b7e
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3.host.json
@@ -0,0 +1,37 @@
+{
+ "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "name": {
+ "text": "Empty",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1011"
+ },
+ "description": {
+ "text": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1012"
+ },
+ "order": 100,
+ "icon": "vs-2017.3/Empty.png",
+ "learnMoreLink": "https://go.microsoft.com/fwlink/?LinkID=784883",
+ "uiFilters": [ "oneaspnet" ],
+ "supportedAuthentications": [
+ {
+ "auth": "None",
+ "authenticationType": "NoAuth",
+ "allowUnsecured": true
+ }
+ ],
+ "supportsDocker": true,
+ "ports": [
+ {
+ "name": "HttpPort",
+ "useHttps": false
+ },
+ {
+ "name": "HttpsPort",
+ "useHttps": true
+ }
+ ],
+ "minFullFrameworkVersion": "4.6.1",
+ "disableHttpsSymbol": "NoHttps"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3/Empty.png b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3/Empty.png
new file mode 100644
index 0000000000..ea4b7e2492
Binary files /dev/null and b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/vs-2017.3/Empty.png differ
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Program.fs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Program.fs
new file mode 100644
index 0000000000..5173fe80c3
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Program.fs
@@ -0,0 +1,25 @@
+namespace Company.WebApplication1
+
+open System
+open System.Collections.Generic
+open System.IO
+open System.Linq
+open System.Threading.Tasks
+open Microsoft.AspNetCore
+open Microsoft.AspNetCore.Hosting
+open Microsoft.Extensions.Configuration
+open Microsoft.Extensions.Logging
+
+module Program =
+ let exitCode = 0
+
+ let CreateWebHostBuilder args =
+ WebHost
+ .CreateDefaultBuilder(args)
+ .UseStartup();
+
+ []
+ let main args =
+ CreateWebHostBuilder(args).Build().Run()
+
+ exitCode
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json
new file mode 100644
index 0000000000..ed04d08212
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json
@@ -0,0 +1,35 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8080",
+ //#if(NoHttps)
+ "sslPort": 0
+ //#else
+ "sslPort": 44300
+ //#endif
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "Company.WebApplication1": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ //#if(NoHttps)
+ "applicationUrl": "http://localhost:5000",
+ //#else
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ //#endif
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Startup.fs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Startup.fs
new file mode 100644
index 0000000000..2709a8aa3c
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/Startup.fs
@@ -0,0 +1,21 @@
+namespace Company.WebApplication1
+
+open System
+open Microsoft.AspNetCore.Builder
+open Microsoft.AspNetCore.Hosting
+open Microsoft.AspNetCore.Http
+open Microsoft.Extensions.DependencyInjection
+
+type Startup() =
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+ member this.ConfigureServices(services: IServiceCollection) =
+ ()
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ member this.Configure(app: IApplicationBuilder, env: IHostingEnvironment) =
+ if env.IsDevelopment() then
+ app.UseDeveloperExceptionPage() |> ignore
+
+ app.Run(fun context -> context.Response.WriteAsync("Hello World!")) |> ignore
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.Development.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.Development.json
new file mode 100644
index 0000000000..e203e9407e
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.json
new file mode 100644
index 0000000000..def9159a7d
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..709f1b9629
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "Framework": {
+ "longName": "framework",
+ "isHidden": true
+ },
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/template.json
new file mode 100644
index 0000000000..47000e198f
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/template.json
@@ -0,0 +1,80 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "Razor",
+ "Library",
+ "Razor Class Library"
+ ],
+ "name": "Razor Class Library",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "A project for creating a Razor class library that targets .NET Standard",
+ "groupIdentity": "Microsoft.Web.Razor",
+ "precedence": "5000",
+ "identity": "Microsoft.Web.Razor.Library.CSharp.3.0",
+ "shortName": "razorclasslib",
+ "tags": {
+ "language": "C#",
+ "type": "project"
+ },
+ "sourceName": "Company.RazorClassLibrary1",
+ "preferNameDirectory": true,
+ "symbols": {
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "netcoreapp3.0",
+ "description": "Target netcoreapp3.0"
+ }
+ ],
+ "defaultValue": "netcoreapp3.0"
+ },
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "Company.RazorClassLibrary1.csproj"
+ },
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "path": "Areas/MyFeature/Pages/Page1.cshtml"
+ }
+ ],
+ "defaultName": "RazorClassLibrary1",
+ "postActions": [
+ {
+ "condition": "(!skipRestore)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ },
+ {
+ "condition": "(HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor",
+ "manualInstructions": [],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "1"
+ },
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3.host.json
new file mode 100644
index 0000000000..0e58355fdc
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3.host.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "name": {
+ "text": "Razor Class Library",
+ "id": "1023",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}"
+ },
+ "description": {
+ "text": "A project template for creating a Razor class library.",
+ "id": "1024",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}"
+ },
+ "order": 305,
+ "icon": "vs-2017.3/RazorClassLibrary.ico",
+ "learnMoreLink": "https://go.microsoft.com/fwlink/?linkid=872103"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3/RazorClassLibrary.ico b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3/RazorClassLibrary.ico
new file mode 100644
index 0000000000..9d01cf3fd2
Binary files /dev/null and b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/vs-2017.3/RazorClassLibrary.ico differ
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml
new file mode 100644
index 0000000000..b39e1ae932
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml
@@ -0,0 +1,13 @@
+@page
+@model Company.RazorClassLibrary1.MyFeature.Pages.Page1Model
+
+
+
+
+
+
+ Page1
+
+
+
+
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml.cs
new file mode 100644
index 0000000000..07a0edacfc
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorClassLibrary-CSharp/Areas/MyFeature/Pages/Page1.cshtml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace Company.RazorClassLibrary1.MyFeature.Pages
+{
+ public class Page1Model : PageModel
+ {
+ public void OnGet()
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/dotnetcli.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..c39487b527
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,75 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "UseLocalDB": {
+ "longName": "use-local-db"
+ },
+ "AADInstance": {
+ "longName": "aad-instance",
+ "shortName": ""
+ },
+ "AAdB2CInstance": {
+ "longName": "aad-b2c-instance",
+ "shortName": ""
+ },
+ "SignUpSignInPolicyId": {
+ "longName": "susi-policy-id",
+ "shortName": "ssp"
+ },
+ "ResetPasswordPolicyId": {
+ "longName": "reset-password-policy-id",
+ "shortName": "rp"
+ },
+ "EditProfilePolicyId": {
+ "longName": "edit-profile-policy-id",
+ "shortName": "ep"
+ },
+ "OrgReadAccess": {
+ "longName": "org-read-access",
+ "shortName": "r"
+ },
+ "ClientId": {
+ "longName": "client-id",
+ "shortName": ""
+ },
+ "CallbackPath": {
+ "longName": "callback-path",
+ "shortName": ""
+ },
+ "Domain": {
+ "longName": "domain",
+ "shortName": ""
+ },
+ "TenantId": {
+ "longName": "tenant-id",
+ "shortName": ""
+ },
+ "Framework": {
+ "longName": "framework"
+ },
+ "HttpPort": {
+ "isHidden": true
+ },
+ "HttpsPort": {
+ "isHidden": true
+ },
+ "ExcludeLaunchSettings": {
+ "longName": "exclude-launch-settings",
+ "shortName": ""
+ },
+ "UserSecretsId": {
+ "isHidden": true
+ },
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ },
+ "NoHttps": {
+ "longName": "no-https",
+ "shortName": ""
+ }
+ },
+ "usageExamples": [
+ "--auth Individual"
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json
new file mode 100644
index 0000000000..183dda3ce7
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json
@@ -0,0 +1,348 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "MVC",
+ "Razor Pages"
+ ],
+ "name": "ASP.NET Core Web App",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "A project template for creating an ASP.NET Core application with example ASP.NET Razor Pages content",
+ "groupIdentity": "Microsoft.Web.RazorPages",
+ "precedence": "5000",
+ "identity": "Microsoft.Web.RazorPages.CSharp.3.0",
+ "shortName": [
+ "webapp",
+ "razor"
+ ],
+ "thirdPartyNotices": "https://aka.ms/aspnetcore-template-3pn-210",
+ "tags": {
+ "language": "C#",
+ "type": "project"
+ },
+ "sourceName": "Company.WebApplication1",
+ "preferNameDirectory": true,
+ "guids": [
+ "09732173-2cef-46b7-83db-1334bcb079d3", // Tenant ID
+ "0ce56475-d1db-490f-8af1-a881ea4fcd2d" // Client ID
+ ],
+ "sources": [
+ {
+ "copyOnly": [
+ "wwwroot/**"
+ ],
+ "modifiers": [
+ {
+ "condition": "(!OrganizationalAuth && !IndividualAuth)",
+ "exclude": [
+ "Pages/Shared/_LoginPartial.Identity.cshtml",
+ "Pages/Shared/_LoginPartial.OrgAuth.cshtml"
+ ]
+ },
+ {
+ "condition": "(OrganizationalAuth || IndividualB2CAuth)",
+ "rename": {
+ "Pages/Shared/_LoginPartial.OrgAuth.cshtml": "Pages/Shared/_LoginPartial.cshtml"
+ },
+ "exclude": [
+ "Pages/Shared/_LoginPartial.Identity.cshtml"
+ ]
+ },
+ {
+ "condition": "(IndividualLocalAuth)",
+ "rename": {
+ "Pages/Shared/_LoginPartial.Identity.cshtml": "Pages/Shared/_LoginPartial.cshtml"
+ },
+ "exclude": [
+ "Pages/Shared/_LoginPartial.OrgAuth.cshtml"
+ ]
+ },
+ {
+ "condition": "(!IndividualLocalAuth || UseLocalDB)",
+ "exclude": [
+ "app.db"
+ ]
+ },
+ {
+ "condition": "(!IndividualLocalAuth)",
+ "exclude": [
+ "Data/**",
+ "Areas/**"
+ ]
+ },
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Properties/launchSettings.json"
+ ]
+ },
+ {
+ "condition": "(IndividualLocalAuth && UseLocalDB)",
+ "rename": {
+ "Data/SqlServer/": "Data/Migrations/"
+ },
+ "exclude": [
+ "Data/SqlLite/**"
+ ]
+ },
+ {
+ "condition": "(IndividualLocalAuth && !UseLocalDB)",
+ "rename": {
+ "Data/SqlLite/": "Data/Migrations/"
+ },
+ "exclude": [
+ "Data/SqlServer/**"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "auth": {
+ "type": "parameter",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "None",
+ "description": "No authentication"
+ },
+ {
+ "choice": "Individual",
+ "description": "Individual authentication"
+ },
+ {
+ "choice": "IndividualB2C",
+ "description": "Individual authentication with Azure AD B2C"
+ },
+ {
+ "choice": "SingleOrg",
+ "description": "Organizational authentication for a single tenant"
+ },
+ {
+ "choice": "MultiOrg",
+ "description": "Organizational authentication for multiple tenants"
+ },
+ {
+ "choice": "Windows",
+ "description": "Windows authentication"
+ }
+ ],
+ "defaultValue": "None",
+ "description": "The type of authentication to use"
+ },
+ "AAdB2CInstance": {
+ "type": "parameter",
+ "datatype": "string",
+ "defaultValue": "https://login.microsoftonline.com/tfp/",
+ "replaces": "https:////login.microsoftonline.com/tfp/",
+ "description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth)."
+ },
+ "SignUpSignInPolicyId": {
+ "type": "parameter",
+ "datatype": "string",
+ "defaultValue": "",
+ "replaces": "MySignUpSignInPolicyId",
+ "description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth)."
+ },
+ "ResetPasswordPolicyId": {
+ "type": "parameter",
+ "datatype": "string",
+ "defaultValue": "",
+ "replaces": "MyResetPasswordPolicyId",
+ "description": "The reset password policy ID for this project (use with IndividualB2C auth)."
+ },
+ "EditProfilePolicyId": {
+ "type": "parameter",
+ "datatype": "string",
+ "defaultValue": "",
+ "replaces": "MyEditProfilePolicyId",
+ "description": "The edit profile policy ID for this project (use with IndividualB2C auth)."
+ },
+ "AADInstance": {
+ "type": "parameter",
+ "datatype": "string",
+ "defaultValue": "https://login.microsoftonline.com/",
+ "replaces": "https:////login.microsoftonline.com/",
+ "description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth)."
+ },
+ "ClientId": {
+ "type": "parameter",
+ "datatype": "string",
+ "replaces": "11111111-1111-1111-11111111111111111",
+ "description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth)."
+ },
+ "Domain": {
+ "type": "parameter",
+ "datatype": "string",
+ "replaces": "qualified.domain.name",
+ "description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth)."
+ },
+ "TenantId": {
+ "type": "parameter",
+ "datatype": "string",
+ "replaces": "22222222-2222-2222-2222-222222222222",
+ "description": "The TenantId ID of the directory to connect to (use with SingleOrg auth)."
+ },
+ "CallbackPath": {
+ "type": "parameter",
+ "datatype": "string",
+ "replaces": "/signin-oidc",
+ "defaultValue": "/signin-oidc",
+ "description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth)."
+ },
+ "OrgReadAccess": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth)."
+ },
+ "UserSecretsId": {
+ "type": "parameter",
+ "datatype": "string",
+ "replaces": "aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502",
+ "defaultValue": "aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502",
+ "description": "The ID to use for secrets (use with OrgReadAccess or Individual auth)."
+ },
+ "ExcludeLaunchSettings": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to exclude launchSettings.json in the generated template."
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ },
+ "HttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "HttpPortGenerated": {
+ "type": "generated",
+ "generator": "port"
+ },
+ "HttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpPort",
+ "fallbackVariableName": "HttpPortGenerated"
+ },
+ "replaces": "8080"
+ },
+ "HttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ },
+ "HttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 44300,
+ "high": 44399
+ }
+ },
+ "HttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "HttpsPort",
+ "fallbackVariableName": "HttpsPortGenerated"
+ },
+ "replaces": "44300"
+ },
+ "OrganizationalAuth": {
+ "type": "computed",
+ "value": "(auth == \"SingleOrg\" || auth == \"MultiOrg\")"
+ },
+ "WindowsAuth": {
+ "type": "computed",
+ "value": "(auth == \"Windows\")"
+ },
+ "MultiOrgAuth": {
+ "type": "computed",
+ "value": "(auth == \"MultiOrg\")"
+ },
+ "SingleOrgAuth": {
+ "type": "computed",
+ "value": "(auth == \"SingleOrg\")"
+ },
+ "IndividualLocalAuth": {
+ "type": "computed",
+ "value": "(auth == \"Individual\")"
+ },
+ "IndividualAuth": {
+ "type": "computed",
+ "value": "(auth == \"Individual\" || auth == \"IndividualB2C\")"
+ },
+ "IndividualB2CAuth": {
+ "type": "computed",
+ "value": "(auth == \"IndividualB2C\")"
+ },
+ "NoAuth": {
+ "type": "computed",
+ "value": "(!(IndividualAuth || OrganizationalAuth || WindowsAuth))"
+ },
+ "RequiresHttps": {
+ "type": "computed",
+ "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ },
+ "NoHttps": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ },
+ "UseLocalDB": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified."
+ },
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "netcoreapp3.0",
+ "description": "Target netcoreapp3.0"
+ }
+ ],
+ "replaces": "netcoreapp3.0",
+ "defaultValue": "netcoreapp3.0"
+ },
+ "copyrightYear": {
+ "type": "generated",
+ "generator": "now",
+ "replaces": "copyrightYear",
+ "parameters": {
+ "format": "yyyy"
+ }
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "Company.WebApplication1.csproj"
+ }
+ ],
+ "defaultName": "WebApplication1",
+ "postActions": [
+ {
+ "condition": "(!skipRestore)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3.host.json b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3.host.json
new file mode 100644
index 0000000000..7bff1c1eab
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3.host.json
@@ -0,0 +1,66 @@
+{
+ "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "name": {
+ "text": "Web Application",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1017"
+ },
+ "description": {
+ "text": "A project template for creating an ASP.NET Core application with example ASP.NET Razor Pages content.",
+ "package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
+ "id": "1018"
+ },
+ "order": 300,
+ "icon": "vs-2017.3/WebApplication.png",
+ "learnMoreLink": "https://go.microsoft.com/fwlink/?LinkID=784881",
+ "uiFilters": [ "oneaspnet" ],
+ "isApi": false,
+ "usesOidc": true,
+ "supportsDocker": true,
+ "legacyTemplateIdentity": "Microsoft.NetCore.CSharp.RazorPages",
+ "supportedAuthentications": [
+ {
+ "auth": "None",
+ "authenticationType": "NoAuth",
+ "allowUnsecured": true
+ },
+ {
+ "auth": "Individual",
+ "authenticationType": "IndividualAuth",
+ "b2cAuthenticationOptions": "CloudExisting"
+ },
+ {
+ "auth": "Individual",
+ "authenticationType": "IndividualAuth",
+ "b2cAuthenticationOptions": "Local"
+ },
+ {
+ "auth": "SingleOrg",
+ "authenticationType": "OrgAuth",
+ "orgAuthenticationOptions": "SSO"
+ },
+ {
+ "auth": "MultiOrg",
+ "authenticationType": "OrgAuth",
+ "orgAuthenticationOptions": "MultiOrg"
+ },
+ {
+ "auth": "Windows",
+ "authenticationType": "WindowsAuth"
+ }
+ ],
+ "ports": [
+ {
+ "name": "HttpPort",
+ "useHttps": false
+ },
+ {
+ "name": "HttpsPort",
+ "useHttps": true
+ }
+ ],
+ "excludeLaunchSettings": false,
+ "azureReplyUrlPortName": "HttpsPort",
+ "minFullFrameworkVersion": "4.6.1",
+ "disableHttpsSymbol": "NoHttps"
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3/WebApplication.png b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3/WebApplication.png
new file mode 100644
index 0000000000..572a095fa0
Binary files /dev/null and b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/vs-2017.3/WebApplication.png differ
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Areas/Identity/Pages/_ViewStart.cshtml b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Areas/Identity/Pages/_ViewStart.cshtml
new file mode 100644
index 0000000000..7bd9b6bb87
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Areas/Identity/Pages/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "/Pages/Shared/_Layout.cshtml";
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/ApplicationDbContext.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/ApplicationDbContext.cs
new file mode 100644
index 0000000000..a33a15e3e9
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/ApplicationDbContext.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+
+namespace Company.WebApplication1.Data
+{
+ public class ApplicationDbContext : IdentityDbContext
+ {
+ public ApplicationDbContext(DbContextOptions options)
+ : base(options)
+ {
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.Designer.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.Designer.cs
new file mode 100644
index 0000000000..33568e6189
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.Designer.cs
@@ -0,0 +1,229 @@
+//
+using System;
+using Company.WebApplication1.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ [Migration("00000000000000_CreateIdentitySchema")]
+ partial class CreateIdentitySchema
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.2.0-preview1");
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("SecurityStamp");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("ProviderKey")
+ .HasMaxLength(128);
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("Name")
+ .HasMaxLength(128);
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.cs
new file mode 100644
index 0000000000..ac844c831f
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/00000000000000_CreateIdentitySchema.cs
@@ -0,0 +1,217 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ public partial class CreateIdentitySchema : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "AspNetRoles",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false),
+ Name = table.Column(maxLength: 256, nullable: true),
+ NormalizedName = table.Column(maxLength: 256, nullable: true),
+ ConcurrencyStamp = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoles", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUsers",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false),
+ UserName = table.Column(maxLength: 256, nullable: true),
+ NormalizedUserName = table.Column(maxLength: 256, nullable: true),
+ Email = table.Column(maxLength: 256, nullable: true),
+ NormalizedEmail = table.Column(maxLength: 256, nullable: true),
+ EmailConfirmed = table.Column(nullable: false),
+ PasswordHash = table.Column(nullable: true),
+ SecurityStamp = table.Column(nullable: true),
+ ConcurrencyStamp = table.Column(nullable: true),
+ PhoneNumber = table.Column(nullable: true),
+ PhoneNumberConfirmed = table.Column(nullable: false),
+ TwoFactorEnabled = table.Column(nullable: false),
+ LockoutEnd = table.Column(nullable: true),
+ LockoutEnabled = table.Column(nullable: false),
+ AccessFailedCount = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUsers", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetRoleClaims",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ RoleId = table.Column(nullable: false),
+ ClaimType = table.Column(nullable: true),
+ ClaimValue = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserClaims",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ UserId = table.Column(nullable: false),
+ ClaimType = table.Column(nullable: true),
+ ClaimValue = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetUserClaims_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserLogins",
+ columns: table => new
+ {
+ LoginProvider = table.Column(maxLength: 128, nullable: false),
+ ProviderKey = table.Column(maxLength: 128, nullable: false),
+ ProviderDisplayName = table.Column(nullable: true),
+ UserId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey });
+ table.ForeignKey(
+ name: "FK_AspNetUserLogins_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserRoles",
+ columns: table => new
+ {
+ UserId = table.Column(nullable: false),
+ RoleId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId });
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserTokens",
+ columns: table => new
+ {
+ UserId = table.Column(nullable: false),
+ LoginProvider = table.Column(maxLength: 128, nullable: false),
+ Name = table.Column(maxLength: 128, nullable: false),
+ Value = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name });
+ table.ForeignKey(
+ name: "FK_AspNetUserTokens_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetRoleClaims_RoleId",
+ table: "AspNetRoleClaims",
+ column: "RoleId");
+
+ migrationBuilder.CreateIndex(
+ name: "RoleNameIndex",
+ table: "AspNetRoles",
+ column: "NormalizedName",
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserClaims_UserId",
+ table: "AspNetUserClaims",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserLogins_UserId",
+ table: "AspNetUserLogins",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserRoles_RoleId",
+ table: "AspNetUserRoles",
+ column: "RoleId");
+
+ migrationBuilder.CreateIndex(
+ name: "EmailIndex",
+ table: "AspNetUsers",
+ column: "NormalizedEmail");
+
+ migrationBuilder.CreateIndex(
+ name: "UserNameIndex",
+ table: "AspNetUsers",
+ column: "NormalizedUserName",
+ unique: true);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "AspNetRoleClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserLogins");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserRoles");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserTokens");
+
+ migrationBuilder.DropTable(
+ name: "AspNetRoles");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUsers");
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/ApplicationDbContextModelSnapshot.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/ApplicationDbContextModelSnapshot.cs
new file mode 100644
index 0000000000..836ae699c4
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlLite/ApplicationDbContextModelSnapshot.cs
@@ -0,0 +1,227 @@
+//
+using System;
+using Company.WebApplication1.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ partial class ApplicationDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.2.0-preview1");
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("SecurityStamp");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("ProviderKey")
+ .HasMaxLength(128);
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("Name")
+ .HasMaxLength(128);
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.Designer.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.Designer.cs
new file mode 100644
index 0000000000..49cf654246
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.Designer.cs
@@ -0,0 +1,236 @@
+//
+using System;
+using Company.WebApplication1.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ [Migration("00000000000000_CreateIdentitySchema")]
+ partial class CreateIdentitySchema
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.2.0-preview1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("SecurityStamp");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex")
+ .HasFilter("[NormalizedUserName] IS NOT NULL");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("ProviderKey")
+ .HasMaxLength(128);
+
+ b.Property("ProviderDisplayName");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("RoleId");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.Property("UserId");
+
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("Name")
+ .HasMaxLength(128);
+
+ b.Property("Value");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
+ {
+ b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.cs
new file mode 100644
index 0000000000..ef09a15377
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/00000000000000_CreateIdentitySchema.cs
@@ -0,0 +1,220 @@
+using System;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ public partial class CreateIdentitySchema : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "AspNetRoles",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false),
+ Name = table.Column(maxLength: 256, nullable: true),
+ NormalizedName = table.Column(maxLength: 256, nullable: true),
+ ConcurrencyStamp = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoles", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUsers",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false),
+ UserName = table.Column(maxLength: 256, nullable: true),
+ NormalizedUserName = table.Column(maxLength: 256, nullable: true),
+ Email = table.Column(maxLength: 256, nullable: true),
+ NormalizedEmail = table.Column(maxLength: 256, nullable: true),
+ EmailConfirmed = table.Column(nullable: false),
+ PasswordHash = table.Column(nullable: true),
+ SecurityStamp = table.Column(nullable: true),
+ ConcurrencyStamp = table.Column(nullable: true),
+ PhoneNumber = table.Column(nullable: true),
+ PhoneNumberConfirmed = table.Column(nullable: false),
+ TwoFactorEnabled = table.Column(nullable: false),
+ LockoutEnd = table.Column(nullable: true),
+ LockoutEnabled = table.Column(nullable: false),
+ AccessFailedCount = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUsers", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetRoleClaims",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ RoleId = table.Column(nullable: false),
+ ClaimType = table.Column(nullable: true),
+ ClaimValue = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserClaims",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
+ UserId = table.Column(nullable: false),
+ ClaimType = table.Column(nullable: true),
+ ClaimValue = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserClaims", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AspNetUserClaims_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserLogins",
+ columns: table => new
+ {
+ LoginProvider = table.Column(maxLength: 128, nullable: false),
+ ProviderKey = table.Column(maxLength: 128, nullable: false),
+ ProviderDisplayName = table.Column(nullable: true),
+ UserId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey });
+ table.ForeignKey(
+ name: "FK_AspNetUserLogins_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserRoles",
+ columns: table => new
+ {
+ UserId = table.Column(nullable: false),
+ RoleId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId });
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetRoles_RoleId",
+ column: x => x.RoleId,
+ principalTable: "AspNetRoles",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_AspNetUserRoles_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AspNetUserTokens",
+ columns: table => new
+ {
+ UserId = table.Column(nullable: false),
+ LoginProvider = table.Column(maxLength: 128, nullable: false),
+ Name = table.Column(maxLength: 128, nullable: false),
+ Value = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name });
+ table.ForeignKey(
+ name: "FK_AspNetUserTokens_AspNetUsers_UserId",
+ column: x => x.UserId,
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetRoleClaims_RoleId",
+ table: "AspNetRoleClaims",
+ column: "RoleId");
+
+ migrationBuilder.CreateIndex(
+ name: "RoleNameIndex",
+ table: "AspNetRoles",
+ column: "NormalizedName",
+ unique: true,
+ filter: "[NormalizedName] IS NOT NULL");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserClaims_UserId",
+ table: "AspNetUserClaims",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserLogins_UserId",
+ table: "AspNetUserLogins",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AspNetUserRoles_RoleId",
+ table: "AspNetUserRoles",
+ column: "RoleId");
+
+ migrationBuilder.CreateIndex(
+ name: "EmailIndex",
+ table: "AspNetUsers",
+ column: "NormalizedEmail");
+
+ migrationBuilder.CreateIndex(
+ name: "UserNameIndex",
+ table: "AspNetUsers",
+ column: "NormalizedUserName",
+ unique: true,
+ filter: "[NormalizedUserName] IS NOT NULL");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "AspNetRoleClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserClaims");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserLogins");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserRoles");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUserTokens");
+
+ migrationBuilder.DropTable(
+ name: "AspNetRoles");
+
+ migrationBuilder.DropTable(
+ name: "AspNetUsers");
+ }
+ }
+}
diff --git a/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/ApplicationDbContextModelSnapshot.cs b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/ApplicationDbContextModelSnapshot.cs
new file mode 100644
index 0000000000..e5d4616c81
--- /dev/null
+++ b/src/templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Data/SqlServer/ApplicationDbContextModelSnapshot.cs
@@ -0,0 +1,234 @@
+//
+using System;
+using Company.WebApplication1.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Company.WebApplication1.Data.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ partial class ApplicationDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.2.0-preview1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Name")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasName("RoleNameIndex")
+ .HasFilter("[NormalizedName] IS NOT NULL");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("RoleId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AccessFailedCount");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken();
+
+ b.Property("Email")
+ .HasMaxLength(256);
+
+ b.Property("EmailConfirmed");
+
+ b.Property("LockoutEnabled");
+
+ b.Property("LockoutEnd");
+
+ b.Property("NormalizedEmail")
+ .HasMaxLength(256);
+
+ b.Property("NormalizedUserName")
+ .HasMaxLength(256);
+
+ b.Property("PasswordHash");
+
+ b.Property("PhoneNumber");
+
+ b.Property("PhoneNumberConfirmed");
+
+ b.Property("SecurityStamp");
+
+ b.Property("TwoFactorEnabled");
+
+ b.Property("UserName")
+ .HasMaxLength(256);
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasName("UserNameIndex")
+ .HasFilter("[NormalizedUserName] IS NOT NULL");
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ClaimType");
+
+ b.Property("ClaimValue");
+
+ b.Property("UserId")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
+ {
+ b.Property("LoginProvider")
+ .HasMaxLength(128);
+
+ b.Property("ProviderKey")
+ .HasMaxLength(128);
+
+ b.Property