Rooli-perusteinen käyttöoikeus (RBAC) on tehokas tapa hallita ja rajoittaa pääsyä sovelluksen resursseihin. ASP.NET Core Minimal API:ssa voidaan käyttää JWT-tunnuksia ja rooleja API-päätepisteiden suojaamiseen. Tämän lähestymistavan avulla varmistetaan, että vain oikeilla rooleilla varustetut käyttäjät voivat käyttää tiettyjä resursseja. Tässä käsitellään, kuinka määritetään roolit, luodaan käyttäjiä, suojataan päätepisteitä ja testataan niiden toimivuutta.

Rooli-perusteinen käyttöoikeus voidaan toteuttaa lisäämällä [Authorize]-attribuutti API-päätepisteisiin. Esimerkiksi, jos haluamme suojata päätepisteen, joka on vain "Manager"-roolille tarkoitettu, lisäämme seuraavanlaisen määritelmän:

csharp
app.MapGet("/manager", [Authorize(Roles = "Manager")] () => {
return Results.Ok(new { Message = "Tämä sisältö on vain managerille" }); });

Tässä määritelmässä päätepiste /manager on suojattu siten, että vain "Manager"-roolilla varustetut käyttäjät voivat käyttää sitä. Jos käyttäjä ei ole oikeassa roolissa, hänelle palautetaan virhetilanne (HTTP 403).

Vastaavalla tavalla voidaan suojata myös muita päätepisteitä. Esimerkiksi /adminmanager-päätepiste, joka on suojattu JWT-tunnuksella ja johon pääsevät vain "Admin"- ja "Manager"-roolit, määritellään seuraavasti:

csharp
app.MapGet("/adminmanager", [Authorize(Roles = "Admin,Manager")] () => { return Results.Ok(new { Message = "Tämä sisältö on vain adminille ja managerille" }); });

Seuraavaksi voimme määritellä testitiedoston (rbacapp.http), jossa testataan rooleihin perustuvia päätepisteitä ja niiden käyttöä. Tiedostossa määritellään erilaisia pyyntöjä ja tunnuksia, joita käytetään API-päätepisteiden testaamiseen. Esimerkiksi luodaan uusi käyttäjä ja saadaan JWT-tunnus kirjautumisen jälkeen:

http
@rbacapp_HostAddress = http://localhost:5289 @token = # Tässä tallennetaan JWT-tunnus ### Kirjautuminen ja JWT-tunnuksen saaminen POST {{rbacapp_HostAddress}}/login Accept: application/json Content-Type: application/json { "Username": "user3", "Password": "pass123" } ### Käyttäjäprofiili GET {{rbacapp_HostAddress}}/profile Authorization: Bearer {{token}} ### Manager-päätepiste GET {{rbacapp_HostAddress}}/manager Authorization: Bearer {{token}}

Tässä esimerkissä käyttäjän on ensin kirjauduttava sisään ja saava JWT-tunnus, jonka jälkeen hän voi käyttää eri päätepisteitä, kuten /profile tai /manager, mikäli hänellä on oikeat käyttöoikeudet.

Seuraava vaihe on tarkistaa API-päätepisteiden toimivuus rooliin perustuen. Jos käyttäjä, jolla on esimerkiksi "Admin"-rooli, yrittää käyttää päätepistettä, joka on suojattu vain "Manager"-roolille, hän saa virheilmoituksen (HTTP 403). Samoin, jos "Manager"-roolilla varustettu käyttäjä yrittää päästä "Admin"-roolille tarkoitetuille päätepisteille, hän saa myös virheilmoituksen.

API-päätepisteiden suojaaminen ja niiden testaus on tärkeä vaihe, kun toteutetaan rooliin perustuva käyttöoikeus. Tämä varmistaa, että järjestelmä noudattaa sovittuja käyttöoikeuksia ja estää pääsyn ei-toivotuille resursseille.

Tässä vaiheessa käyttäjien roolit ja tunnukset voidaan hallita ja testata helposti Scalar UI:n tai REST Clientin avulla. Scalar UI:ssä käyttäjä voi luoda rooleja, rekisteröidä käyttäjiä ja lisätä rooleja tietylle käyttäjälle, jotta päästään testaamaan rooliin perustuvaa käyttöoikeutta. On tärkeää muistaa, että käyttäjä voi käyttää vain niitä resursseja, joihin hänellä on roolin mukaiset oikeudet. Tämä estää väärinkäytöksiä ja takaa järjestelmän turvallisuuden.

RBAC:n toteuttaminen ja testaaminen API-päätepisteiden suojaamiseksi on olennainen osa web-sovelluksen turvallisuutta. Käyttöoikeuksien rajoittaminen roolien mukaan on tehokas tapa varmistaa, että vain oikeat käyttäjät pääsevät käsiksi arkaluonteisiin tietoihin ja toimintoihin.

Miten käyttää Entity Framework Core 9.0:aa olemassa olevan tietokannan kanssa ASP.NET Core Minimal API:ssa

Entity Framework Core (EF Core) on suosittu työkalu .NET-kehittäjille tietokannan hallintaan ja datan käsittelyyn. Sen avulla voidaan helposti luoda ja hallita tietokantaskeemaa, sekä suorittaa CRUD-toimintoja (luominen, lukeminen, päivittäminen ja poistaminen). Jos käytetään olemassa olevaa tietokantaa, EF Core tarjoaa kaksi pääasiallista lähestymistapaa: Code First ja Database First. Tässä luvussa tarkastellaan erityisesti Database First -lähestymistapaa ja sen käyttöä EF Core 9.0:n kanssa.

EF Core ja Database First

Kun käytetään olemassa olevaa tietokantaa, voidaan hyödyntää EF Core:n Database First -lähestymistapaa. Tämä tarkoittaa sitä, että tietokannan rakenne on jo määritelty, ja EF Core:n avulla luodaan malliluokat (entity classes) ja DbContext suoraan tietokannan pohjalta. Tämä menetelmä on erityisen hyödyllinen silloin, kun tietokannan hallinta on erillisen tiimin vastuulla, tai kun tietokanta on jo olemassa ja sitä käytetään uudessa sovelluksessa.

Aluksi täytyy käyttää EF Core:n komentorivityökaluja, kuten dotnet ef dbcontext scaffold, joka luo DbContext- ja entity-luokat olemassa olevasta tietokannasta. Näitä luokkia voidaan sitten muokata tarpeen mukaan, mutta on tärkeää muistaa, että jos scaffolding-toiminto suoritetaan uudelleen, aiemmat mukautukset voivat ylikirjoittautua.

Tietokannan ja mallien synkronointi

Tietokannan ja EF Core:n mallien välillä on tärkeää ylläpitää synkronointia. Kun tietokantaa muutetaan, kuten taulujen lisääminen, poistaminen tai kenttien muokkaaminen, täytyy myös EF Core -malleja päivittää vastaavasti. Tällöin on tarpeen suorittaa uudelleen scaffold-toiminto, ja joskus tehdä manuaalisia säätöjä malliluokissa. Tämä prosessi voi olla työläs, mutta se varmistaa, että sovellus ja tietokanta pysyvät linjassa.

Hyödyt ja käytön kannalta huomioitavat seikat

Database First -lähestymistavan etuna on nopea alkuun pääseminen olemassa olevan tietokannan kanssa. Tämä vähentää tarpeettoman koodin kirjoittamista, erityisesti tietokannan käsittelyyn liittyvää logiikkaa. Se sopii erityisesti projekteihin, joissa tietokannan rakenne hallitaan erillisen tiimin tai työkalun avulla.

Kuitenkin on tärkeää huomioida muutamia parhaita käytäntöjä. Ensinnäkin, versionhallinta on erityisen tärkeää. Code First -lähestymistavassa käytettävät migraatiot tulisi tallentaa versionhallintaan, jotta voidaan seurata muutoksia ajan mittaan. Tietokannan päivityksissä on myös tärkeää olla tarkkana, sillä muutokset tietokannan rakenteessa voivat edellyttää uudelleen scaffoldingia ja koodin mukauttamista.

Suorituskykyyn liittyen kannattaa kiinnittää huomiota siihen, miten tietoja ladataan. Lazy loading ja eager loading ovat keskeisiä tekijöitä, jotka voivat vaikuttaa sovelluksen tehokkuuteen. Generoidut SQL-kyselyt voivat myös olla tärkeä huomioon otettava seikka, sillä huonosti optimoidut kyselyt voivat heikentää suorituskykyä merkittävästi.

EF Core työkalut ja komentorivi

EF Core -työkalut ovat käytettävissä .NET-globaalina työkaluna, ja ne voidaan asentaa seuraavalla komennolla:
dotnet tool install --global dotnet-ef. Näiden työkalujen avulla voidaan suorittaa monia EF Core:n hallintaan liittyviä komentoja, kuten tietokannan migraatioiden luominen ja päivittäminen.

Esimerkiksi, jos haluat listata kaikki käytettävissä olevat komennot, käytä komentoa:
dotnet ef -h. Työkalut tekevät EF Core:n käytöstä huomattavasti helpompaa, sillä ne tarjoavat suoraviivaisia komentoja moniin yleisiin tehtäviin.

Käytännön harjoitus: EF Core 9.0 ja ASP.NET Core Minimal API

Seuraavassa harjoituksessa opit yhdistämään EF Core 9.0:n ASP.NET Core Minimal API:hin ja luomaan yksinkertaisen RESTful-sovelluksen, joka suorittaa CRUD-toimintoja SQL Server -tietokannassa. Harjoituksessa käytämme Code First -lähestymistapaa, jossa määritellään ensin malliluokat ja DbContext, ja tämän jälkeen käytetään migraatioita tietokannan luomiseen ja päivittämiseen.

  1. Projektin perustaminen
    Avaa komentorivi ja luo uusi ASP.NET Core Minimal API -projekti:
    dotnet new webapi. Tämän jälkeen avaa projekti Visual Studio Codessa:
    code ..

  2. EF Core:n asentaminen
    Asenna tarvittavat EF Core -paketit NuGetin kautta:
    dotnet add package Microsoft.EntityFrameworkCore.SqlServer
    dotnet add package Microsoft.EntityFrameworkCore.InMemory
    dotnet add package Microsoft.EntityFrameworkCore.Design.

  3. Mallin ja DbContextin luominen
    Luo mallit ja DbContext-luokat, jotka vastaavat tietokannan tauluja. Esimerkiksi luodaan Product-malli ja AppDbContext, jossa määritellään tietokannan rakenne ja toiminnot.

  4. DbContextin konfigurointi
    Määritä DbContext Program.cs-tiedostossa ja lisää yhteys tietokantaan konfiguroimalla se oikein appsettings.json-tiedostossa.

  5. CRUD-toimintojen toteuttaminen
    Toteuta HTTP-pyyntöjen käsittelijät CRUD-toimintoja varten:

  • GET-pyynnöt kaikkien ja yksittäisten tuotteiden hakemiseksi.

  • POST-pyyntö tuotteen lisäämiseksi tietokantaan.

  • PUT-pyyntö tuotteen päivittämiseksi.

  • DELETE-pyyntö tuotteen poistamiseksi.

  1. Tietokannan valmistelu ja migraatiot
    Varmista, että tietokannan yhteys on oikein määritelty ja suorita migraatiot luodaksesi tietokannan skeeman.

Tärkeää ymmärtää

EF Core 9.0:n ja ASP.NET Core Minimal API:n yhdistäminen tarjoaa tehokkaan tavan rakentaa RESTful-sovelluksia, mutta se tuo mukanaan myös haasteita. Tietokannan ja sovelluksen välisen synkronoinnin ylläpitäminen vaatii tarkkuutta ja huolellisuutta. Kun käytetään olemassa olevaa tietokantaa, on tärkeää ymmärtää, että muutokset tietokannassa voivat edellyttää manuaalisia säätöjä sovelluksen puolella. Näiden haasteiden hallinta on keskeistä, jotta sovellus toimii tehokkaasti ja luotettavasti pitkällä aikavälillä. EF Core:n tarjoamat työkalut ja migraatiot tekevät tietokannan hallinnan helpommaksi, mutta ne vaativat myös jatkuvaa huomiota ja päivityksiä.