ASP.Net Core : Geheime Daten aus dem Projekt entfernen
in secrets
ASP.Net Core: Geheime Daten aus dem Projekt entfernen in
secrets.json und Einbinden in C# Code
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"
|