Αφού ολοκληρώσαμε τον σχεδιασμό της αρχιτεκτονικής, στο άρθρο Εισαγωγή στο Clean Architecture το σύστημα είναι έτοιμο να δεχτεί τα πρώτα του αιτήματα. Το Clean Architecture solution μας έχει σαφώς διαχωρισμένα layers: το Domain layer ορίζει τις οντότητες και τα interfaces των repositories, το Application layer διαχειρίζεται την επιχειρησιακή λογική μέσω services και DTOs, ενώ το Infrastructure layer υλοποιεί τις βάσεις δεδομένων και την πρόσβαση στα δεδομένα μέσω Entity Framework. Τώρα, το επόμενο βήμα είναι η δημιουργία του Presentation layer, δηλαδή του API, το οποίο θα λειτουργεί ως η “εισόδος” για τον έξω κόσμο, είτε αυτός είναι ένας front-end client είτε εργαλεία δοκιμής όπως το Postman ή το Swagger.
Στο Presentation layer, οι controllers είναι υπεύθυνοι να μεταφράζουν τα αιτήματα HTTP σε κλήσεις προς τα services του Application layer. Έτσι, όταν ένα αίτημα ζητά πληροφορίες για τους φοιτητές, ο StudentsController δεν χρειάζεται να γνωρίζει πώς αποθηκεύονται τα δεδομένα ή πώς λειτουργεί το Entity Framework. Το μόνο που κάνει είναι να καλέσει τα αντίστοιχα methods του IStudentService, να λάβει πίσω τα DTOs και να τα επιστρέψει στον client. Αυτός ο διαχωρισμός επιτρέπει στο API να παραμείνει καθαρό και ανεξάρτητο από τις τεχνολογίες της βάσης ή την υλοποίηση των repositories.
Με αυτή τη δομή, η επικοινωνία ανάμεσα στα layers γίνεται αυστηρά μέσω interfaces και services. Ο controller διαβιβάζει αιτήματα και λαμβάνει αποτελέσματα σε μορφή DTOs. Το Application layer χειρίζεται όλη τη λογική: δημιουργεί, ενημερώνει, διαγράφει και εγγράφει φοιτητές σε μαθήματα, ενώ επικοινωνεί με τα repositories που βρίσκονται στο Infrastructure layer. Με αυτόν τον τρόπο διασφαλίζεται ότι κάθε layer γνωρίζει μόνο το άμεσο επόμενο και παραμένει αποκομμένο από το υπόλοιπο σύστημα, διευκολύνοντας το testing, τη συντήρηση και μελλοντικές αλλαγές.
Αφού ολοκληρωθεί η υλοποίηση των controllers, το API θα είναι πλήρως λειτουργικό, επιτρέποντας CRUD λειτουργίες και ειδικές ενέργειες όπως η εγγραφή φοιτητών σε μαθήματα. Στη συνέχεια, θα μπορέσουμε να προσθέσουμε ασφάλεια με JWT authentication, διασφαλίζοντας ότι μόνο εξουσιοδοτημένοι χρήστες μπορούν να αλληλοεπιδρούν με το σύστημα. Αυτό θα ολοκληρώσει το βασικό στήσιμο του backend, το οποίο θα είναι έτοιμο να υποστηρίξει ένα front-end client, είτε πρόκειται για React, Angular ή οποιοδήποτε άλλο εργαλείο παρουσίασης.
Προσθήκη JWT Authentication
1.Προσθήκη απαραίτητων πακέτων
Στο Presentation project (Web/API) προσθέστε τα NuGet πακέτα:
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
⚠️ Προσοχή στις εκδόσεις: πρέπει να είναι συμβατές με .NET 8
2.Ρυθμίσεις στο appsettings.json
Δημιουργήστε ένα section για το JWT:
"Jwt": {
"Key": "mysupersecretkey_12345!",
"Issuer": "MySchoolAPI",
"Audience": "MySchoolClient",
"ExpireMinutes": 60
}
Η Key πρέπει να είναι τουλάχιστον 16 χαρακτήρες. Αργότερα μπορεί να μεταφερθεί σε User Secrets ή Key Vault για μεγαλύτερη ασφάλεια.
3.Διαβάζουμε τις ρυθμίσεις στο Program.cs
var jwtSettings = builder.Configuration.GetSection("Jwt");
var secretKey = jwtSettings["Key"];
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
4.Ρύθμιση Authentication και Authorization
builder.Services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = key,
ClockSkew = TimeSpan.Zero
};
});
5.Ενεργοποίηση Middleware στο Program.cs
Πριν τα MapControllers():
app.UseAuthentication();
app.UseAuthorization();
Αυτό επιτρέπει στα endpoints να προστατευτούν με [Authorize].
6.Σήμανση Controllers/Endpoints
Στους Controllers που θέλετε προστατευμένους:
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class StudentsController : ControllerBase
Για endpoints που θέλετε δημόσια, χρησιμοποιήστε:
[AllowAnonymous]
7.Δημιουργία και χρήση Token
- Δημιουργήστε ένα endpoint στο AuthenticationController π.χ. /api/auth/login.
- Επιστρέψτε ένα JWT token με το σωστό Issuer, Audience και ExpireMinutes.
- Χρησιμοποιείστε το token για να καλείτε τα [Authorize] endpoints.
Προσθήκη swagger
1.Προσθήκη JWT στο Swagger (προαιρετικό)
Για να δοκιμάζετε τα προστατευμένα endpoints:
`builder.Services.AddSwaggerGen(c =>
{
c.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
{
Name = "Authorization",
Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http,
Scheme = "Bearer",
BearerFormat = "JWT",
In = Microsoft.OpenApi.Models.ParameterLocation.Header,
Description = "Enter 'Bearer' [space] and then your valid token."
});
c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
{
{
new Microsoft.OpenApi.Models.OpenApiSecurityScheme
{
Reference = new Microsoft.OpenApi.Models.OpenApiReference
{
Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
Array.Empty<string>()
}
});
});`
Στο Swagger UI θα εμφανιστεί κουμπί “Authorize”, όπου μπορείτε να βάλετε το JWT token.
2.Ενεργοποίηση Middleware για Swagger
Πριν τα MapControllers(), πρόσθεσε:
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
Τώρα το Swagger UI θα είναι διαθέσιμο στο /swagger/index.html.
3.Χρήση JWT στο Swagger UI
- Τρέξε την εφαρμογή σου.
- Άνοιξε το Swagger UI (π.χ. https://localhost:5001/swagger).
- Πάνω δεξιά θα δεις το κουμπί Authorize.
- Κάνε paste το JWT token που σου δίνει το login endpoint, με το format:
Bearer <your_token_here>
- Τώρα όλα τα requests σε endpoints με [Authorize] θα στέλνουν αυτόματα το token.
Τα δημόσια endpoints με [AllowAnonymous] δεν χρειάζονται token και δουλεύουν κανονικά.
Bonus Tips
- Μπορείς να ορίσεις διαφορετικά API versions με SwaggerDoc.
- Αν θέλεις να δοκιμάζεις πολλαπλά tokens για διαφορετικούς ρόλους, το Swagger UI σου επιτρέπει να αλλάζεις το token στο κουμπί Authorize ανά πάσα στιγμή.
- Για μεγαλύτερη ασφάλεια, κράτα το secret key εκτός του appsettings.json σε User Secrets ή Key Vault.
Κατέβασε το project με την υλοποίηση controllers και την προσθήκη jwt και swagger από τον παρακάτω σύνδεσμο.
Εισαγωγή στο Clean Architecture
Πώς δουλεύει το JWT σε ένα Client Flow
Εδώ θα βρείς το solution ολοκληρωμένο με προσθήκη README.md
Η Σημασία του README σε Ένα Πρότζεκτ .NET
nikosst
Top comments (0)