Hitelesítés engedélyezése a saját webes API-ban az Azure AD B2C használatával

A webes API-khoz való hozzáférés engedélyezéséhez csak olyan kéréseket tud kiszolgálni, amelyek az Azure Active Directory B2C (Azure AD B2C) által problémákat okozó érvényes hozzáférési jogkivonatot tartalmaznak. Ez a cikk bemutatja, hogyan engedélyezheti az Azure AD B2C-hitelesítést a webes API-ban. A cikkben ismertetett lépések elvégzése után csak azok a felhasználók jogosultak a webes API-végpontok meghívására, akik érvényes hozzáférési jogkivonatot szereznek be.

Előfeltételek

Mielőtt hozzákezdene, olvassa el az alábbi cikkek egyikét, amelyek a webes API-kat hívó alkalmazások hitelesítésének konfigurálását ismertetik. Ezután kövesse a cikkben leírt lépéseket a minta webes API saját webes API-ra való lecseréléséhez.

Áttekintés

A jogkivonatalapú hitelesítés biztosítja, hogy a webes API-hoz érkező kérések érvényes hozzáférési jogkivonatot tartalmazzanak.

Az alkalmazás a következő lépéseket hajtja végre:

  1. Az Azure AD B2C-vel hitelesíti a felhasználókat.

  2. A webes API-végponthoz szükséges engedélyekkel (hatókörökkel) rendelkező hozzáférési jogkivonatot szerez be.

  3. A http-kérés hitelesítési fejlécében a hozzáférési jogkivonatot az alábbi formátumban adja át tulajdonosi jogkivonatként:

    Authorization: Bearer <access token>
    

A webes API a következő lépéseket hajtja végre:

  1. Beolvassa a tulajdonosi jogkivonatot a HTTP-kérelem engedélyezési fejlécéből.

  2. Ellenőrzi a jogkivonatot.

  3. Ellenőrzi a jogkivonatban szereplő engedélyeket (hatóköröket).

  4. Beolvassa a jogkivonatban kódolt jogcímeket (nem kötelező).

  5. Válaszol a HTTP-kérésre.

Alkalmazásregisztráció áttekintése

Ahhoz, hogy az alkalmazás bejelentkezhessen az Azure AD B2C-vel, és meghívjon egy webes API-t, két alkalmazást kell regisztrálnia az Azure AD B2C címtárban.

  • A webes, mobil- vagy SPA-alkalmazásregisztrációval az alkalmazás bejelentkezhet az Azure AD B2C-vel. Az alkalmazásregisztrációs folyamat létrehoz egy alkalmazásazonosítót, más néven ügyfélazonosítót, amely egyedileg azonosítja az alkalmazást (például: 1. alkalmazásazonosító).

  • A webes API-regisztrációval az alkalmazás meghívhat egy védett webes API-t. A regisztráció elérhetővé teszi a webes API-engedélyeket (hatóköröket). Az alkalmazásregisztrációs folyamat létrehoz egy alkalmazásazonosítót, amely egyedileg azonosítja a webes API-t (például alkalmazásazonosító: 2). Adjon engedélyt az alkalmazásnak (alkalmazásazonosító: 1) a webes API-hatókörökhöz (alkalmazásazonosító: 2).

Az alkalmazásregisztrációkat és az alkalmazásarchitektúrát az alábbi diagram ismerteti:

Diagram of the application registrations and the application architecture for an app with web API.

A fejlesztőkörnyezet előkészítése

A következő szakaszokban egy új webes API-projektet hoz létre. Válassza ki a programozási nyelvet, ASP.NET Core-t vagy Node.js-t. Győződjön meg arról, hogy rendelkezik olyan számítógéppel, amely az alábbi szoftverek valamelyikét futtatja:

1. lépés: Védett webes API létrehozása

Hozzon létre egy új webes API-projektet. Először válassza ki a használni kívánt programozási nyelvet, ASP.NET Core vagy Node.js.

Használja az dotnet new parancsot. A dotnet new parancs létrehoz egy TodoList nevű új mappát a webes API-projektegységekkel. Nyissa meg a könyvtárat, majd nyissa meg a Visual Studio Code-ot.

dotnet new webapi -o TodoList
cd TodoList
code . 

Amikor a rendszer kéri, hogy "adja hozzá a szükséges eszközöket a projekthez", válassza az Igen lehetőséget.

2. lépés: A függőségek telepítése

Adja hozzá a hitelesítési kódtárat a webes API-projekthez. A hitelesítési kódtár elemzi a HTTP-hitelesítési fejlécet, ellenőrzi a jogkivonatot, és kinyeri a jogcímeket. További információkért tekintse át a könyvtár dokumentációját.

A hitelesítési kódtár hozzáadásához telepítse a csomagot az alábbi parancs futtatásával:

dotnet add package Microsoft.Identity.Web

3. lépés: A hitelesítési kódtár kezdeményezése

Adja hozzá a hitelesítési kódtár elindításához szükséges kódot.

Nyissa meg a Startup.cs fájlt, majd az osztály elején adja hozzá a következő using deklarációkat:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

Keresse meg a függvényt ConfigureServices(IServiceCollection services) . Ezután a services.AddControllers(); kódsor előtt adja hozzá a következő kódrészletet:

public void ConfigureServices(IServiceCollection services)
{
    // Adds Microsoft Identity platform (Azure AD B2C) support to protect this Api
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApi(options =>
    {
        Configuration.Bind("AzureAdB2C", options);

        options.TokenValidationParameters.NameClaimType = "name";
    },
    options => { Configuration.Bind("AzureAdB2C", options); });
    // End of the Microsoft Identity platform block    

    services.AddControllers();
}

Keresse meg a függvényt Configure . Ezután közvetlenül a app.UseRouting(); kódsor után adja hozzá a következő kódrészletet:

app.UseAuthentication();

A módosítás után a kódnak a következő kódrészlethez hasonlóan kell kinéznie:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();
    
    // Add the following line 
    app.UseAuthentication();
    // End of the block you add
    
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

4. lépés: A végpontok hozzáadása

Adjon hozzá két végpontot a webes API-hoz:

  • Névtelen /public végpont. Ez a végpont az aktuális dátumot és időt adja vissza. Segítségével névtelen hívásokkal hibakeresést végezhet a webes API-val.
  • Védett /hello végpont. Ez a végpont a jogcím értékét adja vissza a name hozzáférési jogkivonaton belül.

A névtelen végpont hozzáadása:

A /Controllers mappában vegyen fel egy PublicController.cs fájlt, majd adja hozzá a következő kódrészlethez:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace TodoList.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class PublicController : ControllerBase
    {
        private readonly ILogger<PublicController> _logger;

        public PublicController(ILogger<PublicController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new {date = DateTime.UtcNow.ToString()});
        }
    }
}

A védett végpont hozzáadása:

A /Controllers mappában adjon hozzá egy HelloController.cs fájlt, majd adja hozzá a következő kódhoz:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.Resource;

namespace TodoList.Controllers
{
    [Authorize]
    [RequiredScope("tasks.read")]
    [ApiController]
    [Route("[controller]")]
    public class HelloController : ControllerBase
    {

        private readonly ILogger<HelloController> _logger;
        private readonly IHttpContextAccessor _contextAccessor;

        public HelloController(ILogger<HelloController> logger, IHttpContextAccessor contextAccessor)
        {
            _logger = logger;
            _contextAccessor = contextAccessor;
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok( new { name = User.Identity.Name});
        }
    }
}

A HelloController vezérlőt az AuthorizeAttribute díszíti, amely csak a hitelesített felhasználók hozzáférését korlátozza.

A vezérlőt [RequiredScope("tasks.read")]a . A RequiredScopeAttribute ellenőrzi, hogy a webes API a megfelelő hatókörökkel van-e meghívva. tasks.read

5. lépés: A webkiszolgáló konfigurálása

Fejlesztői környezetben állítsa be a webes API-t a bejövő HTTP- vagy HTTPS-kérelmek portszámának figyelésére. Ebben a példában a HTTP-port 6000-et és a HTTPS-portot 6001-et használjuk. A webes API alap URI-ja HTTP-hez és https://localhost:6001 HTTPS-hez leszhttp://localhost:6000.

Adja hozzá a következő JSON-kódrészletet az appsettings.json fájlhoz .

"Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://localhost:6000"
      },
      "Https": {
         "Url": "https://localhost:6001"   
        }
    }
  }

6. lépés: A webes API konfigurálása

Konfigurációk hozzáadása konfigurációs fájlhoz. A fájl információkat tartalmaz az Azure AD B2C-identitásszolgáltatóról. A web API-alkalmazás ezen információk alapján ellenőrzi a webalkalmazás által tulajdonosi jogkivonatként áthaladó hozzáférési jogkivonatot.

A projekt gyökérmappájában nyissa meg az appsettings.json fájlt, majd adja hozzá a következő beállításokat:

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com",
    "Domain": "contoso.onmicrosoft.com",
    "ClientId": "<web-api-app-application-id>",
    "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
    "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
  },
  // More settings here
}

Az appsettings.json fájlban frissítse a következő tulajdonságokat:

Szakasz Key Érték
AzureAdB2C Példány Az Azure AD B2C-bérlő nevének első része (például https://contoso.b2clogin.com).
AzureAdB2C Tartomány Az Azure AD B2C-bérlő teljes bérlőneve (például contoso.onmicrosoft.com).
AzureAdB2C ClientID A webes API-alkalmazás azonosítója. Az előző ábrán ez az alkalmazás a következő alkalmazásazonosítóval: 2. A webes API-alkalmazásregisztrációs azonosító lekéréséről az előfeltételek című témakörben olvashat.
AzureAdB2C SignUpSignInPolicyId A felhasználói folyamatok vagy egyéni szabályzatok. A felhasználói folyamat vagy szabályzat beszerzésének módjáról az előfeltételek című témakörben olvashat.

7. lépés: A webes API futtatása és tesztelése

Végül futtassa a webes API-t az Azure AD B2C környezeti beállításaival.

A parancshéjban indítsa el a webalkalmazást a következő parancs futtatásával:

 dotnet run

A következő kimenetnek kell megjelennie, ami azt jelenti, hogy az alkalmazás működik, és készen áll a kérések fogadására.

Now listening on: http://localhost:6000

A program leállításához a parancshéjban válassza a Ctrl+C billentyűkombinációt. A parancs használatával újrafuttathatja az node app.js alkalmazást.

Tipp.

A parancs futtatásához használhatja a dotnet runVisual Studio Code hibakeresőt is. A Visual Studio Code beépített hibakeresője segít felgyorsítani a szerkesztési, fordítási és hibakeresési ciklust.

Nyisson meg egy böngészőt, és ugorjon a http://localhost:6000/public címre. A böngészőablakban az alábbi szövegnek kell megjelennie az aktuális dátummal és időponttal együtt.

8. lépés: A webes API meghívása az alkalmazásból

Próbálja meg hozzáférési jogkivonat nélkül meghívni a védett webes API-végpontot. Nyisson meg egy böngészőt, és ugorjon a http://localhost:6000/hello címre. Az API egy jogosulatlan HTTP-hibaüzenetet ad vissza, amely megerősíti, hogy a webes API védett egy tulajdonosi jogkivonattal.

Folytassa az alkalmazás konfigurálását a webes API meghívásához. Útmutatásért tekintse meg az Előfeltételek szakaszt .

Ebből a videóból megismerhet néhány ajánlott eljárást az Azure AD B2C API-val való integrálása során.

További lépések

Szerezze be a teljes példát a GitHubon: