Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

ASP.Net Core: Geheime Daten aus dem Projekt entfernen in secrets.json und Einbinden in C# Code

21.01.2021 (👁18581)

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"