diff --git a/aspnetcore/security/app-secrets.md b/aspnetcore/security/app-secrets.md index 14a6cec4c227..6745ee704bea 100644 --- a/aspnetcore/security/app-secrets.md +++ b/aspnetcore/security/app-secrets.md @@ -225,14 +225,38 @@ If your project targets .NET Framework, install the [Microsoft.Extensions.Config In ASP.NET Core 2.0 or later, the user secrets configuration source is automatically added in development mode when the project calls to initialize a new instance of the host with preconfigured defaults. `CreateDefaultBuilder` calls when the is : +::: moniker-end + +::: moniker range=">= aspnetcore-2.0 <= aspnetcore-2.2" + [!code-csharp[](app-secrets/samples/2.x/UserSecrets/Program.cs?name=snippet_CreateWebHostBuilder&highlight=2)] +::: moniker-end + +::: moniker range=">= aspnetcore-3.0" + +[!code-csharp[](app-secrets/samples/3.x/UserSecrets/Program.cs?name=snippet_CreateHostBuilder&highlight=2)] + +::: moniker-end + +::: moniker range=">= aspnetcore-2.0" + When `CreateDefaultBuilder` isn't called, add the user secrets configuration source explicitly by calling in the `Startup` constructor. Call `AddUserSecrets` only when the app runs in the Development environment, as shown in the following example: +::: moniker-end + +::: moniker range=">= aspnetcore-2.0 <= aspnetcore-2.2" + [!code-csharp[](app-secrets/samples/1.x/UserSecrets/Startup.cs?name=snippet_StartupConstructor&highlight=12)] ::: moniker-end +::: moniker range=">= aspnetcore-3.0" + +[!code-csharp[](app-secrets/samples/3.x/UserSecrets/Startup2.cs?name=snippet_StartupConstructor&highlight=12)] + +::: moniker-end + ::: moniker range="<= aspnetcore-1.1" Install the [Microsoft.Extensions.Configuration.UserSecrets](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.UserSecrets) NuGet package. diff --git a/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup.cs b/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup.cs index 316c404b2d65..b4183d62f559 100644 --- a/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup.cs +++ b/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup.cs @@ -39,9 +39,9 @@ public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app) { - var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; app.Run(async (context) => { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; await context.Response.WriteAsync($"Secret is {result}"); }); } diff --git a/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup3.cs b/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup3.cs index 5c81fa166f27..d3e8362e0b3a 100644 --- a/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup3.cs +++ b/aspnetcore/security/app-secrets/samples/1.x/UserSecrets/Startup3.cs @@ -29,9 +29,9 @@ public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app) { - var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; app.Run(async (context) => { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; await context.Response.WriteAsync($"Secret is {result}"); }); } diff --git a/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup.cs b/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup.cs index b08f727088a2..0248fe6ffd48 100644 --- a/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup.cs +++ b/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup.cs @@ -25,9 +25,9 @@ public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app) { - var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; app.Run(async (context) => { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; await context.Response.WriteAsync($"Secret is {result}"); }); } diff --git a/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup3.cs b/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup3.cs index d9ee576711a1..835f773ff3f9 100644 --- a/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup3.cs +++ b/aspnetcore/security/app-secrets/samples/2.x/UserSecrets/Startup3.cs @@ -29,9 +29,9 @@ public void ConfigureServices(IServiceCollection services) public void Configure(IApplicationBuilder app) { - var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; app.Run(async (context) => { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; await context.Response.WriteAsync($"Secret is {result}"); }); } diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Models/MovieSettings.cs b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Models/MovieSettings.cs new file mode 100644 index 000000000000..3605c4866a41 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Models/MovieSettings.cs @@ -0,0 +1,11 @@ +namespace UserSecrets.Models +{ + #region snippet_MovieSettingsClass + public class MovieSettings + { + public string ConnectionString { get; set; } + + public string ServiceApiKey { get; set; } + } + #endregion +} diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Program.cs b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Program.cs new file mode 100644 index 000000000000..fe109c3b33a3 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Program.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace UserSecrets +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + #region snippet_CreateHostBuilder + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + #endregion + } +} diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup.cs b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup.cs new file mode 100644 index 000000000000..0248fe6ffd48 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace UserSecrets +{ + #region snippet_StartupClass + public class Startup + { + private string _moviesApiKey = null; + + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + public void ConfigureServices(IServiceCollection services) + { + _moviesApiKey = Configuration["Movies:ServiceApiKey"]; + } + + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; + await context.Response.WriteAsync($"Secret is {result}"); + }); + } + } + #endregion snippet_StartupClass +} diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup2.cs b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup2.cs new file mode 100644 index 000000000000..87bd9408dd89 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/Startup2.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace UserSecrets +{ + #region snippet_StartupClass + public class Startup + { + private string _moviesApiKey = null; + + #region snippet_StartupConstructor + public Startup(IWebHostEnvironment env) + { + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", + optional: false, + reloadOnChange: true) + .AddEnvironmentVariables(); + + if (env.IsDevelopment()) + { + builder.AddUserSecrets(); + } + + Configuration = builder.Build(); + } + #endregion snippet_StartupConstructor + + public IConfiguration Configuration { get; } + + public void ConfigureServices(IServiceCollection services) + { + _moviesApiKey = Configuration["Movies:ServiceApiKey"]; + } + + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null"; + await context.Response.WriteAsync($"Secret is {result}"); + }); + } + } + #endregion snippet_StartupClass +} diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/UserSecrets.csproj b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/UserSecrets.csproj new file mode 100644 index 000000000000..0e53764817ac --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/UserSecrets.csproj @@ -0,0 +1,10 @@ + + + + + netcoreapp3.1 + 79a3edd0-2092-40a2-a04d-dcb46d5ca9ed + + + + diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings-unsecure.json b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings-unsecure.json new file mode 100644 index 000000000000..14a8ebb8c3a3 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings-unsecure.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true" + } +} \ No newline at end of file diff --git a/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings.json b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings.json new file mode 100644 index 000000000000..c71cf511a8a4 --- /dev/null +++ b/aspnetcore/security/app-secrets/samples/3.x/UserSecrets/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true" + } +} \ No newline at end of file