ASP.Net Core : Geheime Daten aus dem Projekt entfernen in secrets
Wenn man in Visual Studio eine Asp.Net Core .Net5 Anwendung erstellt, dann werden im Development Status oft noch geheime Daten wie die Anbindung des SQL Servers als String eingebettet.
Man sollte diese Daten in die Projekt Secrets auslagern.
Dadurch werden die geheimen Passwörter und Loggins in eine Datei ausserhalb des Projekts ausgelagert.
In Visual Studio:
Über Project->Contextmenü->Manage User Secrets
Manage User Sectets: secrets.json
Findet man ebenfalls den Eintrag, der secrets.json Datei (Ausserhalb des Projects)
{ "ConnectionStrings:cnDatabase": "Server=.\\sqlexpress;Database=API_TimeRecord;Trusted_Connection=True;MultipleActiveResultSets=true" } |
Die Datei befindet sich ausserhalb des C# Asp.Net Core Projects und ist für die Produktiv-Umgebung in die Umgebungsvariablen zu speichern.
Verwalten über Asp.Net Core Connected Services
Man kann die Datenbankverbindung auch über die Connected Services verwalten.
Dabei wird der Connectionsstring ebenfalls in die secrets.json File ausserhalb des Projects gespeichert.
Hierzu klickt man auf Project->Connected Services->SQL Server Express LocalDB oder auf Secrets.json
Anmerkung: bei LocalDB wird immer versucht ein (localDB)\ Eintrag zu erstellen, welcher ebenfalls wie .\sqlexpress funktioniert.
Der Eintrag von .\sqlexpress wird dabei leider überspielt und nicht gespeichert. Deshalb kann man andere Strings besser direkt in die Manage User Secrets eintragen über das Project->Manage User Secrets
Einbinden der Secrets in eine C# CodeDatei
Man kann die Secrets und Settings Daten zur Laufzeit in C# einbinden durch die Verwendung von:
Configuration.GetConnectionString("cnDatabase")); |
In der startup.cs Datei muss man im ConfigureServices Code Block die Datenbank verbindung erstellen und dabei aus Secrets.json den Wert zur Laufzeit aus den Computer Umgebung Environment holen
services.AddDbContext<APITimerecord.Models.API_TimeRecordContext>( optionsBuilder => { optionsBuilder.UseSqlServer(Configuration.GetConnectionString("cnDatabase")); } );
|
Änderung der Database Context Datei
In der DBContext Datei kann man den Code-Block entfernen, in welchem sich der Connections String zur SQL Datenbank befindet
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // deleteline: if (!optionsBuilder.IsConfigured) // deleteline: { // deleteline: optionsBuilder.UseSqlServer("Server=.\\sqlexpress;Database=API_TimeRecord;Trusted_Connection=True;"); // deleteline: } }
|
Startup.cs
Asp.Net Core Web API
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;
namespace APITimerecord { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; }
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //*Database Connection as EF EntityFramework Model DBContext services.AddDbContext<APITimerecord.Models.API_TimeRecordContext>(optionsBuilder => { optionsBuilder.UseSqlServer(Configuration.GetConnectionString("cnDatabase")); });
services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "APITimerecord", Version = "v1" }); }); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "APITimerecord v1")); }
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }
|
Notwendige Einbindung Namespaces
Hinweis: man muss in den einzelnen Files bei Bedarf den Namespace Configuration einbinden.
Für optionsBuilder.UseSqlServer muss man using Microsoft.EntityFrameworkCore; einbinden
using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration
|
Umgebungsvariablen aus PowerShell bearbeiten
*wichtig für Produktivumgebung Produktionsserver WebServer
Die Umgebungsvariablen in dem Produktiv-Server können per CLI / Windows PowerShell verwaltet werden.
Dabei bitte die doppelten C# Backslash durch einfach Backslash ersetzen \
dotnet user-secrets set " ConnectionStrings: cnDatabase" " Server=.\sqlexpress;Database=API_TimeRecord;Trusted_Connection=True;MultipleActiveResultSets=true" |
Aus anderem Verzeichnis (Windows PowerShell)
Oder wie hier aus einem anderen Projektverzeichnis
dotnet user-secrets set "ConnectionStrings: cnDatabase" "Server=.\sqlexpress;Database=API_TimeRecord;Trusted_Connection=True;MultipleActiveResultSets=true" --project "D:\Programmierung\Web\APITimerecord\APITimerecord" |