Compare commits

...

56 Commits

Author SHA1 Message Date
995eb10df8 f 2026-06-19 14:57:50 +02:00
b495c231e0 change https to gitea 2026-06-19 14:37:41 +02:00
0fb95e78f7 changed login form
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-06-11 11:05:42 +02:00
77d7bb758d added apk commands
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-06-11 09:33:52 +02:00
707e39e70a added pvc saving of Key
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-06-11 08:05:59 +02:00
f096aa9b0a added Login Authentication
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-06-10 13:14:15 +02:00
72a891887e added functionality to add Jenkins Build Number as Label to Image
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-13 10:39:04 +02:00
3e752c909b changed back to "@/contrib/html.tpl"
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-13 10:14:55 +02:00
ebd021eeb7 updated documentation in Dockerfile und Jenkinsfile and updated to --template "html"
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-13 10:10:04 +02:00
06caba6243 changed Dockerfile and Program.cs
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-12 12:46:05 +02:00
da97867c33 changed Dockerfile to allow chown
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-12 12:32:56 +02:00
981201dc02 added Sqlite Integration to Program.cs
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-12 12:20:18 +02:00
251776b9fd Complete Rebuild of Project from HelloWorld to Blazer WebApp
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-12 09:16:44 +02:00
e784b7996c reordered the pipeline steps -> build after trivy scan 2026-05-11 21:47:57 +02:00
89410a8b07 changed build process and include dotnet restore before trivy scan 2026-05-11 21:07:18 +02:00
47ea86224a fixed reportFiles Parameter Line
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-07 12:04:17 +02:00
dacd8fd7c4 fixed missing comma
Some checks failed
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-07 12:03:20 +02:00
08b1417605 changed Trivy Security Jenkins
Some checks failed
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-07 12:02:29 +02:00
b9b06263d8 Umstellen auf alpine Versionen
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-07 11:54:27 +02:00
83ff4e89e9 added report creation for trivy image scan
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-07 11:43:48 +02:00
4106136782 remove --push-retry 5 for tests 2026-05-07 11:41:40 +02:00
46f26e947b added trivy image scan and branch master check 2026-05-07 11:23:06 +02:00
6b96f83e51 added push-retry for kaniko
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-07 10:45:20 +02:00
2f43fb824d changed kaniko stage to add dns resolv
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-07 09:42:31 +02:00
2a2cda8351 changed to insecure for image push
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 14:49:22 +02:00
05c9550185 changed Dockerfile double to single quotes
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 14:45:45 +02:00
7883ea0d0e added Image sending to Gitea
Some checks failed
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 14:41:48 +02:00
ac94391ae4 added Testfolder to Copy in Dockerfile
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-06 13:54:38 +02:00
ad354bbeaf corrected csproj COPY statement in Dockerfile
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 13:32:35 +02:00
08a3edaef2 fixed Dockerfile FROM STatements
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 13:22:54 +02:00
bce0feb57f changed Dockerfile FROM Statements again
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 13:15:18 +02:00
10c5b522d2 changed Dockerfile From statements to mcr.
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 13:07:17 +02:00
4e9042c386 added image to pod template
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 12:54:11 +02:00
56f51f14cc added User app to Dockerfile
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 12:44:00 +02:00
23e44dc29f added Dockerfile and Kaniko Build Stage
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 12:39:16 +02:00
6b52e54ef1 fixed trivy scanners option
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-06 11:51:08 +02:00
f6736d2f31 changed trivy scanners option
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 11:47:08 +02:00
0e2d69fa02 changed trify scanners option
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 11:38:21 +02:00
3d0b7aca06 changed trivy scanners options
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 11:36:17 +02:00
a9df25085a added Trivy scanners
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-06 08:51:05 +02:00
d4f1d2a755 changed to valid Newtonsoft.Json version
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-06 07:56:04 +02:00
942cc3f2cf fixed Jenkinsfile post
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-05 15:52:48 +02:00
7ecef99153 added Info Message to Build Status Page when Trivy Check failed
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-05 15:50:05 +02:00
0122db15f2 added vulnerable (outdated) package to test Trivy
Some checks failed
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-05 15:39:28 +02:00
5454f03ddb removed Workspace Check and added Log Rotation
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 15:09:24 +02:00
7f4b77cb0d added Trivy Report
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 14:41:45 +02:00
eb24ab21a1 removed test file creating
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 14:34:07 +02:00
218e625d8f corrected container name
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 14:30:47 +02:00
cdcc55a487 added workspace check
Some checks failed
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head There was a failure building this commit
2026-05-05 14:27:17 +02:00
d00ad9cddc added trivy scanning
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 14:05:39 +02:00
cf992d544c test firing again of Jenkins 2026-05-05 10:53:17 +02:00
5e921c92d2 test firing of Jenkins 2026-05-05 10:23:59 +02:00
a60e0349f1 test firing of jenkins 2026-05-05 10:18:56 +02:00
020af2c437 changed back dotnet test cmd
All checks were successful
Tests / Declarative: Post Actions passed: 1
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 09:56:26 +02:00
c8ec4b3254 changed dotnet test cmd
All checks were successful
Tests / Declarative: Post Actions No test results found
csharp-secdevops-pipeline-pod/pipeline/head This commit looks good
2026-05-05 09:50:01 +02:00
fab08c5bb3 updated project structure 2026-05-05 09:44:07 +02:00
62 changed files with 942 additions and 6433 deletions

12
.gitignore vendored Normal file
View File

@@ -0,0 +1,12 @@
# .NET Build-Artefakte
bin/
obj/
# Kompilierte Bibliotheken
*.so
*.dll
*.exe
*.pdb
# Datenbank-Dateien (lokale SQLite)
*.db

20
Components/App.razor Normal file
View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="SecDevOpsLab.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
</head>
<body>
<Routes />
<script src="_framework/blazor.web.js"></script>
</body>
</html>

View File

@@ -0,0 +1,23 @@
@inherits LayoutComponentBase
<div class="page">
<div class="sidebar">
<NavMenu />
</div>
<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>

View File

@@ -0,0 +1,96 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}
.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}

View File

@@ -0,0 +1,30 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">SecDevOpsLab</a>
</div>
</div>
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="weather">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
</NavLink>
</div>
</nav>
</div>

View File

@@ -0,0 +1,105 @@
.navbar-toggler {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand {
font-size: 1.1rem;
}
.bi {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item ::deep a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item ::deep .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler {
display: none;
}
.nav-scrollable {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}

View File

@@ -0,0 +1,32 @@
@page "/books"
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
@using SecDevOpsLab.Models
@using SecDevOpsLab.Data
@inject AppDbContext Db
@rendermode InteractiveServer
<h3>Bücherverwaltung</h3>
<input @bind="newBook.Title" placeholder="Titel" />
<input @bind="newBook.Author" placeholder="Autor" />
<button @onclick="Save">Speichern</button>
<hr />
<ul>
@foreach (var b in bookList) {
<li>@b.Title von @b.Author</li>
}
</ul>
@code {
private Book newBook = new();
private List<Book> bookList = new();
protected override async Task OnInitializedAsync() => bookList = await Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync(Db.Books);
private async Task Save() {
Db.Books.Add(newBook);
await Db.SaveChangesAsync();
newBook = new();
bookList = await Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync(Db.Books);
}
}

View File

@@ -0,0 +1,19 @@
@page "/counter"
@rendermode InteractiveServer
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

View File

@@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
@code{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private string? RequestId { get; set; }
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
protected override void OnInitialized() =>
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
}

View File

@@ -0,0 +1,7 @@
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.

View File

@@ -0,0 +1,40 @@
@page "/login"
@using System.Security.Claims
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Authentication.Cookies
@inject NavigationManager Navigation
<h3>SecDevOps Lab Login</h3>
@if (!string.IsNullOrEmpty(errorMessage))
{
<div class="alert alert-danger">@errorMessage</div>
}
@* Wichtig: Ein traditionelles HTML-Formular nutzen, um Cookies setzen zu können *@
<form action="/api/auth/login" method="post">
<AntiforgeryToken />
<div class="mb-3">
<label class="form-label">Benutzername</label>
<input type="text" name="username" class="form-control" required />
</div>
<div class="mb-3">
<label class="form-label">Passwort</label>
<input type="password" name="password" class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Einloggen</button>
</form>
@code {
private string? errorMessage;
protected override void OnInitialized()
{
// Falls ein Fehler beim Login auftrat, fangen wir ihn über die URL ab
var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
if (Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue("error", out var error))
{
errorMessage = "Ungültige Zugangsdaten.";
}
}
}

View File

@@ -0,0 +1,64 @@
@page "/weather"
@attribute [StreamRendering]
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
// Simulate asynchronous loading to demonstrate streaming rendering
await Task.Delay(500);
var startDate = DateOnly.FromDateTime(DateTime.Now);
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
}).ToArray();
}
private class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

6
Components/Routes.razor Normal file
View File

@@ -0,0 +1,6 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
<FocusOnNavigate RouteData="routeData" Selector="h1" />
</Found>
</Router>

10
Components/_Imports.razor Normal file
View File

@@ -0,0 +1,10 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using SecDevOpsLab
@using SecDevOpsLab.Components

8
Data/AppDbContext.cs Normal file
View File

@@ -0,0 +1,8 @@
namespace SecDevOpsLab.Data;
using Microsoft.EntityFrameworkCore;
using SecDevOpsLab.Models;
public class AppDbContext : DbContext {
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Book> Books => Set<Book>();
}

51
Dockerfile Normal file
View File

@@ -0,0 +1,51 @@
# Basis Image das für die Build Umgebung verwendet wird
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build-env
# Wechseln ins Arbeitsverzeichnis
WORKDIR /app
# Kopieren der Projektdatei in Arbeitsverzeichnis
COPY *.csproj ./
# Laden der Abhängigkeiten
RUN dotnet restore
# Kopieren des restlichen Quellcodes
COPY . ./
# Kompilieren eds Quellcodes (Projektdatei muss nicht zwingend angegeben werden)
RUN dotnet publish "SecDevOpsLab.csproj" -c Release -o out
# Noch schlangere Basis Image für die Runtime Umgebung
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
# Wechseln ins Arbeitsverzeichnis
WORKDIR /app
# Öffnen des Ports für die Web-App (Standard bei .NET 8 Web-Apps ist 8080)
EXPOSE 8080
# Konfigurieren des integrierten Kestrel-Webserver einer ASP.NET Core App
ENV ASPNETCORE_URLS=http://+:8080
# Wechseln auf root (nur kurz)
USER root
# OS patchen
RUN apk update && apk upgrade --no-cache
# Ändern des File Owner (wichtig dass die Sqlite DB geschrieben werden kann)
RUN mkdir -p /app/data && chown -R app:app /app/data && chmod -R 775 /app/data
# Wechsel auf non-root User (app ist ein vorinstallierter User von Microsoft)
USER app
# Kopieren der fertigen Binärdateien aus der Build Umgebung
COPY --from=build-env /app/out .
# Definieren eines Arguments, das dann beim kaniko Aufruf mitübergeben wird
ARG JENKINS_BUILD=unknown
# Schreiben des Inhalts des übergebenen Werts des Arguments als Label in das Image
# kubectl get pods --show-labels
# kubectl get pod <pod-name> -n bookmanager-apps -o jsonpath='{.status.containerStatuses[*].imageID}'
# kubectl get pods -L jenkins.build.number
LABEL org.opencontainers.image.version=${JENKINS_BUILD} \
managed-by="Jenkins"
# Festlegen des Start Befehls
ENTRYPOINT ["dotnet", "SecDevOpsLab.dll"]

154
Jenkinsfile vendored
View File

@@ -1,7 +1,8 @@
pipeline {
agent {
kubernetes {
// Definiert den Pod mit dem .NET 8 SDK Image
// Definieren des Pod mit 3 Containern als Build Agent, Trivy und Kaniko
yaml '''
apiVersion: v1
kind: Pod
@@ -12,55 +13,176 @@ pipeline {
command:
- cat
tty: true
- name: trivy
image: aquasec/trivy:latest
command:
- cat
tty: true
- name: kaniko
image: gcr.io/kaniko-project/executor:v1.23.1-debug
command: ["sleep"]
args: ["99d"]
'''
}
}
options {
// Aktivieren von Log Rotation:
// *) Letzten 10 Builds werden aufbewahrt
// ** Builds, die älter als 7 Tage sind, werden gelöscht
buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '10', daysToKeepStr: '7'))
}
stages {
// Auschecken der Sourcen zum App Projekt
stage('Checkout Source') {
steps {
// Ersetze 'dein-user' und 'dein-repo' durch die Namen aus Gitea
git url: 'http://130.61.26.230:30080/dev-master/secdevops-csharp-app.git',
git url: 'https://gitea.dagobert84.duckdns.org/dev-master/secdevops-csharp-app.git',
branch: 'master'
}
}
stage('Security: Trivy Scan') {
steps {
// Ausführen des 'dotnet restore' für den nachfolgenden Trivy Scan, der diese wiederhergestellte Dateien/NuGet Pakete und Abhängigkeiten scanned
// Generiert automatisch das obj/ mit der project.assets.json
// Alle Container eines Pods teilen sich das Jenkins Arbeitsverzeichnis
container('dotnet8') {
sh 'dotnet restore'
}
// Ausführen des Trivy Scans
//
// Wichtig: trivy ersetzt -> dotnet list package --vulnerable --include-transitive
container('trivy') {
// Erzeugen des Directory zum Speichern des Reports
sh 'mkdir -p reports'
// Ausführen des Scans hinsichtlich Vulnerabilities, Miskonfigurationen, Secrets und Licences im Jenkins Arbeitsverzeichnis
// Abbruch bei bei kritischen Fehlern (--exit-code 1 --severity HIGH,CRITICAL)
sh 'trivy fs --scanners vuln,misconfig,secret,license --exit-code 1 --severity HIGH,CRITICAL --format template --template "@/contrib/html.tpl" -o reports/trivy-fs-report.html .'
}
}
}
// Kompilieren der Anwendung (DLLs werden erzeugt)
// Schritt muss gar nicht durchgeführt werden, da kaniko das Image erzeugt
stage('Build with .NET 8') {
steps {
// Führt den Build-Befehl im spezialisierten Container aus
container('dotnet8') {
sh 'dotnet --version' // Zur Bestätigung der Version
sh 'dotnet build'
sh 'dotnet build --configuration Release' // optimierter Build Prozess ohne Debug und ungenutzt Pfade
}
}
}
stage('Unit Tests') {
steps {
container('dotnet8') {
//stage('Unit Tests') {
// steps {
// container('dotnet8') {
// Erstellt eine XML-Datei im Format 'junit', die Jenkins lesen kann
sh 'dotnet test MyHelloWorld.Tests/MyHelloWorld.Tests.csproj --no-build --configuration Release --logger "junit;LogFileName=results.xml;MethodDisplay=ClassAndMethod"'
}
}
}
// sh 'dotnet test --configuration Release'
// sh 'dotnet test --configuration Release --logger "junit;LogFileName=results.xml"'
// }
//}
//}
stage('Set Build Name') {
steps {
script {
// Setzt den Namen des aktuellen Laufs auf die Version + Build-Nummer
// Setzen des Namen des aktuellen Laufs auf die Version + Build-Nummer
currentBuild.displayName = "v1.0.0-build-${env.BUILD_NUMBER}"
}
}
}
stage('Docker Build & Push') {
when {
branch 'master'
}
steps {
container('kaniko') {
// Stellt die Informationen aus dem Token in Form von Umgebungsvariablen der Jenkins Pipeline zur Verfügung
// Nachfolgend werden diese Credentials im JSON Format in config.json geschrieben
// Vorgehen ist zwar nicht extrem sicher, aber die Lebenszeit im Container ist kurz, dass diese base64 kodierten Daten zurückverwandelt werden könnten
// Erzeugen des Directory zum Speichern des Reports, falls das bei einem vorigen Schritt nicht durchgeführt wurde
sh 'mkdir -p reports'
withCredentials([usernamePassword(credentialsId: 'gitea-registry-token',
usernameVariable: 'GITEA_USER',
passwordVariable: 'GITEA_TOKEN')]) {
sh '''
# WORKAROUND: Dem Container beibringen, wer git.example.com ist, ansonsten funktioniert das Übertragen des Images an Git nicht!!!
#echo "130.61.26.230 git.example.com" >> /etc/hosts
# Erstellt die Docker-Konfiguration für Kaniko
# Das $(echo ...) Kommando kombiniert User und Token für den Login
echo "{\\"auths\\":{\\"https://gitea.dagobert84.duckdns.org\\":{\\"auth\\":\\"\$(echo -n \${GITEA_USER}:\${GITEA_TOKEN} | base64)\\"}}}" > /kaniko/.docker/config.json
# Der Bau- und Push-Befehl
# Wir taggen das Image mit 'latest' UND der Build-Nummer zur Sicherheit
/kaniko/executor --context `pwd` \
--dockerfile `pwd`/Dockerfile \
--insecure \
--build-arg JENKINS_BUILD=${BUILD_NUMBER} \
--destination https://gitea.dagobert84.duckdns.org/dev-master/secdevops-csharp-app:latest \
--destination https://gitea.dagobert84.duckdns.org/dev-master/secdevops-csharp-app:${BUILD_NUMBER}
'''
}
}
}
}
stage('Security: Trivy Image Scan') {
when {
branch 'master'
}
steps {
// Trivy Scan wird auf das Image im Git Repository angewendet. Das Image wird heruntergeladen.
container('trivy') {
// 1. Scan ausführen und als HTML-Report speichern (Achte auf den neuen Dateinamen)
sh '''
trivy image --insecure \
--severity HIGH,CRITICAL \
--format template \
--template "@/contrib/html.tpl" \
--exit-code 1 \
-o reports/trivy-image-report.html \
https://gitea.dagobert84.duckdns.org/dev-master/secdevops-csharp-app:latest
'''
// Den Scan ein zweites Mal kurz ohne Report ausführen, damit die Pipeline bei Lücken blockiert
// sh 'trivy image --insecure --exit-code 1 --severity HIGH,CRITICAL 130.61.26.230:30080/dev-master/secdevops-csharp-app:latest'
}
}
}
}
post {
failure {
script {
currentBuild.description = "Build Fehler. Ev. Sicherheits-Check fehlgeschlagen! Details im Trivy Security Report."
}
}
always {
// Sammelt die Testergebnisse ein (die wir im Test-Schritt erzeugen)
// Das **/ bedeutet: Suche in allen Unterordnern nach .xml Dateien
junit testResults: '**/TestResults/*.xml', allowEmptyResults: true
// Suchen und Einelen von etwaigen Testreports von JUnit. Keine Vorhanden? -auch ok
junit testResults: '**/*.xml', allowEmptyResults: true
// Meldet den Status zurück, wenn das Gitea-Plugin korrekt konfiguriert ist
// Verwenden des HTML Publisher Modules zum Schreiben der gefundenen Testreports in das Build Menu und speichert den HTML Bericht dann historisch ab (keepAll)
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'reports',
reportFiles: 'trivy-fs-report.html,trivy-image-report.html',
reportName: 'Trivy Security Report'
])
// Schreiben des Build Status in das Build Log
echo "Pipeline beendet: ${currentBuild.result}"
}
}

8
Models/Books.cs Normal file
View File

@@ -0,0 +1,8 @@
namespace SecDevOpsLab.Models;
using System.ComponentModel.DataAnnotations;
public class Book {
public int Id { get; set; }
[Required] public string Title { get; set; } = string.Empty;
[Required] public string Author { get; set; } = string.Empty;
}

View File

@@ -1,28 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="JunitXml.TestLogger" Version="8.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MyHelloWorld\SecDevOpsLab.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,21 +0,0 @@
using Xunit;
using MyHelloWorld; // Dein Namespace der Haupt-App
namespace MyHelloWorld.Tests
{
public class HelloTests
{
[Fact]
public void GetGreeting_ShouldReturnCorrectText()
{
// Arrange
var generator = new HelloGenerator();
// Act
var result = generator.GetGreeting();
// Assert
Assert.Equal("Hello World", result);
}
}
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -1,22 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("MyHelloWorld.Tests")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8102197b03a6563eddf51c4271ba610610e08a33")]
[assembly: System.Reflection.AssemblyProductAttribute("MyHelloWorld.Tests")]
[assembly: System.Reflection.AssemblyTitleAttribute("MyHelloWorld.Tests")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
83683f5ec3f8c06b41aface5b1c6a7736955f6f9de7d85076a1a42c3896199a9

View File

@@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = MyHelloWorld.Tests
build_property.ProjectDir = C:\Users\HermanH\SecDevOpsLab\MyHelloWorld.Tests\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -1,9 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using global::Xunit;

View File

@@ -1,150 +0,0 @@
{
"format": 1,
"restore": {
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\MyHelloWorld.Tests.csproj": {}
},
"projects": {
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\MyHelloWorld.Tests.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\MyHelloWorld.Tests.csproj",
"projectName": "MyHelloWorld.Tests",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\MyHelloWorld.Tests.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj": {
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"JunitXml.TestLogger": {
"target": "Package",
"version": "[8.0.0, )"
},
"Microsoft.NET.Test.Sdk": {
"target": "Package",
"version": "[17.8.0, )"
},
"coverlet.collector": {
"target": "Package",
"version": "[6.0.0, )"
},
"xunit": {
"target": "Package",
"version": "[2.5.3, )"
},
"xunit.runner.visualstudio": {
"target": "Package",
"version": "[2.5.3, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
},
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"projectName": "SecDevOpsLab",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\HermanH\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\HermanH\.nuget\packages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)xunit.runner.visualstudio\2.5.3\build\net6.0\xunit.runner.visualstudio.props" Condition="Exists('$(NuGetPackageRoot)xunit.runner.visualstudio\2.5.3\build\net6.0\xunit.runner.visualstudio.props')" />
<Import Project="$(NuGetPackageRoot)xunit.core\2.5.3\build\xunit.core.props" Condition="Exists('$(NuGetPackageRoot)xunit.core\2.5.3\build\xunit.core.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.testplatform.testhost\17.8.0\build\netcoreapp3.1\Microsoft.TestPlatform.TestHost.props" Condition="Exists('$(NuGetPackageRoot)microsoft.testplatform.testhost\17.8.0\build\netcoreapp3.1\Microsoft.TestPlatform.TestHost.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.props" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\netcoreapp3.1\Microsoft.NET.Test.Sdk.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\netcoreapp3.1\Microsoft.NET.Test.Sdk.props')" />
<Import Project="$(NuGetPackageRoot)junitxml.testlogger\8.0.0\build\netstandard2.0\JUnitXml.TestLogger.props" Condition="Exists('$(NuGetPackageRoot)junitxml.testlogger\8.0.0\build\netstandard2.0\JUnitXml.TestLogger.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Pkgxunit_analyzers Condition=" '$(Pkgxunit_analyzers)' == '' ">C:\Users\HermanH\.nuget\packages\xunit.analyzers\1.4.0</Pkgxunit_analyzers>
</PropertyGroup>
</Project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)xunit.core\2.5.3\build\xunit.core.targets" Condition="Exists('$(NuGetPackageRoot)xunit.core\2.5.3\build\xunit.core.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\netcoreapp3.1\Microsoft.NET.Test.Sdk.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\netcoreapp3.1\Microsoft.NET.Test.Sdk.targets')" />
<Import Project="$(NuGetPackageRoot)coverlet.collector\6.0.0\build\netstandard1.0\coverlet.collector.targets" Condition="Exists('$(NuGetPackageRoot)coverlet.collector\6.0.0\build\netstandard1.0\coverlet.collector.targets')" />
</ImportGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,99 +0,0 @@
{
"version": 2,
"dgSpecHash": "cMCqBPi36D8=",
"success": true,
"projectFilePath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld.Tests\\MyHelloWorld.Tests.csproj",
"expectedPackageFiles": [
"C:\\Users\\HermanH\\.nuget\\packages\\coverlet.collector\\6.0.0\\coverlet.collector.6.0.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\junitxml.testlogger\\8.0.0\\junitxml.testlogger.8.0.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.codecoverage\\17.8.0\\microsoft.codecoverage.17.8.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.net.test.sdk\\17.8.0\\microsoft.net.test.sdk.17.8.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.netcore.platforms\\1.1.0\\microsoft.netcore.platforms.1.1.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.netcore.targets\\1.1.0\\microsoft.netcore.targets.1.1.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.8.0\\microsoft.testplatform.objectmodel.17.8.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.testplatform.testhost\\17.8.0\\microsoft.testplatform.testhost.17.8.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\microsoft.win32.primitives\\4.3.0\\microsoft.win32.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\netstandard.library\\1.6.1\\netstandard.library.1.6.1.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\nuget.frameworks\\6.5.0\\nuget.frameworks.6.5.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.native.system.io.compression\\4.3.0\\runtime.native.system.io.compression.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.native.system.net.http\\4.3.0\\runtime.native.system.net.http.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.native.system.security.cryptography.apple\\4.3.0\\runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple\\4.3.0\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl\\4.3.0\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.appcontext\\4.3.0\\system.appcontext.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.buffers\\4.3.0\\system.buffers.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.collections.concurrent\\4.3.0\\system.collections.concurrent.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.console\\4.3.0\\system.console.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.diagnostics.diagnosticsource\\4.3.0\\system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.diagnostics.tools\\4.3.0\\system.diagnostics.tools.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.globalization.calendars\\4.3.0\\system.globalization.calendars.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.globalization.extensions\\4.3.0\\system.globalization.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.io.compression\\4.3.0\\system.io.compression.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.io.compression.zipfile\\4.3.0\\system.io.compression.zipfile.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.linq.expressions\\4.3.0\\system.linq.expressions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.net.http\\4.3.0\\system.net.http.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.net.sockets\\4.3.0\\system.net.sockets.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.objectmodel\\4.3.0\\system.objectmodel.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.emit\\4.3.0\\system.reflection.emit.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.emit.ilgeneration\\4.3.0\\system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.emit.lightweight\\4.3.0\\system.reflection.emit.lightweight.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.extensions\\4.3.0\\system.reflection.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime.interopservices.runtimeinformation\\4.3.0\\system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.runtime.numerics\\4.3.0\\system.runtime.numerics.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.algorithms\\4.3.0\\system.security.cryptography.algorithms.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.cng\\4.3.0\\system.security.cryptography.cng.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.csp\\4.3.0\\system.security.cryptography.csp.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.encoding\\4.3.0\\system.security.cryptography.encoding.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.openssl\\4.3.0\\system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.primitives\\4.3.0\\system.security.cryptography.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.security.cryptography.x509certificates\\4.3.0\\system.security.cryptography.x509certificates.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.text.encoding.extensions\\4.3.0\\system.text.encoding.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.text.regularexpressions\\4.3.0\\system.text.regularexpressions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.threading.tasks.extensions\\4.3.0\\system.threading.tasks.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.threading.timer\\4.3.0\\system.threading.timer.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.xml.readerwriter\\4.3.0\\system.xml.readerwriter.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\system.xml.xdocument\\4.3.0\\system.xml.xdocument.4.3.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit\\2.5.3\\xunit.2.5.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.abstractions\\2.0.3\\xunit.abstractions.2.0.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.analyzers\\1.4.0\\xunit.analyzers.1.4.0.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.assert\\2.5.3\\xunit.assert.2.5.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.core\\2.5.3\\xunit.core.2.5.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.extensibility.core\\2.5.3\\xunit.extensibility.core.2.5.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.extensibility.execution\\2.5.3\\xunit.extensibility.execution.2.5.3.nupkg.sha512",
"C:\\Users\\HermanH\\.nuget\\packages\\xunit.runner.visualstudio\\2.5.3\\xunit.runner.visualstudio.2.5.3.nupkg.sha512"
],
"logs": []
}

View File

@@ -1,10 +0,0 @@
namespace MyHelloWorld
{
public class HelloGenerator
{
public string GetGreeting()
{
return "Hello World";
}
}
}

View File

@@ -1,6 +0,0 @@
using MyHelloWorld;
var generator = new HelloGenerator();
string message = generator.GetGreeting();
Console.WriteLine(message);

View File

@@ -1,66 +0,0 @@
{
"format": 1,
"restore": {
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj": {}
},
"projects": {
"C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"projectName": "SecDevOpsLab",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\HermanH\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\HermanH\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -1,71 +0,0 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"C:\\Users\\HermanH\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"projectName": "SecDevOpsLab",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"version": 2,
"dgSpecHash": "WtqJwqDQoLM=",
"success": true,
"projectFilePath": "C:\\Users\\HermanH\\SecDevOpsLab\\MyHelloWorld\\SecDevOpsLab.csproj",
"expectedPackageFiles": [],
"logs": []
}

108
Program.cs Normal file
View File

@@ -0,0 +1,108 @@
// Importieren des Entity Frameworks für den Zugriff auf die DB
using Microsoft.EntityFrameworkCore;
// Importieren der Klassen
using SecDevOpsLab.Data;
using SecDevOpsLab.Components;
// NEU: Namespaces für Authentifizierung und Routing hinzufügen
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
// SECDEVOPS: Namespaces für Data Protection hinzufügen
using System.IO;
using Microsoft.AspNetCore.DataProtection;
// Initialisieren des Web Builders, der den Server und die Umgebung vorbereitet
var builder = WebApplication.CreateBuilder(args);
// ==========================================
// SECDEVOPS: Data Protection für K8s PVC & Key-Rotation
// ==========================================
var keysFolder = new DirectoryInfo(@"/app/data/dp-keys");
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(keysFolder)
.SetApplicationName("SecDevOpsLabApp"); // Bindet die Keys fix an diese App (Wichtig für Replicas)
// NEU: Blazor-Authentifizierungsdienste registrieren
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/login"; // Wohin unberechtigte Nutzer geleitet werden
options.ExpireTimeSpan = TimeSpan.FromHours(2);
});
// NEU: Erlaubt Blazor-Komponenten, den Login-Status abzufragen
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped<AuthenticationStateProvider, ServerAuthenticationStateProvider>();
// Hinzufügen des Blazor Service und die Interagierbarkeit des Frontends
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
// Registrieren des Datenbankzugriffs (Sqlite)
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlite("Data Source=data/books.db"));
// Bauen des Webservers, der App
var app = builder.Build();
// Erstellen eines temporären Scopes
using (var scope = app.Services.CreateScope())
{
// Holen des DB Services
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
// Erstellen der books.db automatisch sofern nicht bereits vorhanden
db.Database.EnsureCreated();
}
// Hinzufügen einer Fehlerbehandlung -> Fehler wird auf der Website angezeigt
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
// Erlauben des Zugriffs auf wwwroot Dir
app.UseStaticFiles();
// NEU: Authentifizierungs-Middleware aktivieren (MUSS vor Antiforgery stehen!)
app.UseAuthentication();
app.UseAuthorization();
// Schützen vor CSRF Attacken
app.UseAntiforgery();
// Verknüpfen der Razor Seiten mit den entsprechenden URLs
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
// ==========================================
// SCHRITT 3: HIER EINGEFÜGT (Login-Endpunkt)
// ==========================================
app.MapPost("/api/auth/login", async (
[FromForm] string username,
[FromForm] string password,
HttpContext httpContext) =>
{
// Statischer User (Für SecDevOps später via Environment Variable aus K8s-Secret laden!)
const string StaticUser = "admin";
const string StaticPassword = "DevOpsPassword2026!";
if (username == StaticUser && password == StaticPassword)
{
var claims = new List<Claim> { new Claim(ClaimTypes.Name, username) };
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
return Results.Redirect("/"); // Erfolgreich eingeloggt -> zur Startseite
}
return Results.Redirect("/login?error=true"); // Fehler -> zurück zum Login
});
// Webserver wird gestartet. Port 8080 wird eröffnet
app.Run();

View File

@@ -0,0 +1,29 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:26392",
"sslPort": 0
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5206",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,10 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.*" />
</ItemGroup>
</Project>

View File

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyHelloWorld.Tests", "MyHelloWorld.Tests\MyHelloWorld.Tests.csproj", "{5962021C-5AF5-4D00-9B19-2E13B4691D50}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecDevOpsLab", "SecDevOpsLab.csproj", "{90755B21-35C0-4AC0-88FC-110950C366E4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -14,9 +14,9 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5962021C-5AF5-4D00-9B19-2E13B4691D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5962021C-5AF5-4D00-9B19-2E13B4691D50}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5962021C-5AF5-4D00-9B19-2E13B4691D50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5962021C-5AF5-4D00-9B19-2E13B4691D50}.Release|Any CPU.Build.0 = Release|Any CPU
{90755B21-35C0-4AC0-88FC-110950C366E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{90755B21-35C0-4AC0-88FC-110950C366E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{90755B21-35C0-4AC0-88FC-110950C366E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{90755B21-35C0-4AC0-88FC-110950C366E4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

11
_Imports.razor Normal file
View File

@@ -0,0 +1,11 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using SecDevOpsLab
@using SecDevOpsLab.Components
@using SecDevOpsLab.Models
@using SecDevOpsLab.Data

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

9
appsettings.json Normal file
View File

@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -1,22 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("SecDevOpsLab")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a06ad295ff53ef3ef054f007568f9408d3ac3926")]
[assembly: System.Reflection.AssemblyProductAttribute("SecDevOpsLab")]
[assembly: System.Reflection.AssemblyTitleAttribute("SecDevOpsLab")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
4c184d0afcea7e7f2eab2f0260a6f8caf058b8b036b468bd9db571ad88a567d6

View File

@@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = SecDevOpsLab
build_property.ProjectDir = C:\Users\HermanH\SecDevOpsLab\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,66 +0,0 @@
{
"format": 1,
"restore": {
"C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj": {}
},
"projects": {
"C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj",
"projectName": "SecDevOpsLab",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\HermanH\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\HermanH\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -1,71 +0,0 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"C:\\Users\\HermanH\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj",
"projectName": "SecDevOpsLab",
"projectPath": "C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj",
"packagesPath": "C:\\Users\\HermanH\\.nuget\\packages\\",
"outputPath": "C:\\Users\\HermanH\\SecDevOpsLab\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\HermanH\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"version": 2,
"dgSpecHash": "jCxL11Qh9Sk=",
"success": true,
"projectFilePath": "C:\\Users\\HermanH\\SecDevOpsLab\\SecDevOpsLab.csproj",
"expectedPackageFiles": [],
"logs": []
}

51
wwwroot/app.css Normal file
View File

@@ -0,0 +1,51 @@
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
a, .btn-link {
color: #006bb7;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}
.content {
padding-top: 1.1rem;
}
h1:focus {
outline: none;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid #e50000;
}
.validation-message {
color: #e50000;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.darker-border-checkbox.form-check-input {
border-color: #929292;
}

7
wwwroot/bootstrap/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
wwwroot/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB