Sdílet prostřednictvím


O autorizaci v mikroslužbách a webových aplikacích v technologii .NET

Tip

Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Po ověření musí ASP.NET základní webová rozhraní API autorizovat přístup. Tento proces umožňuje službě zpřístupnit rozhraní API některým ověřeným uživatelům, ale ne všem. Autorizace se dá provádět na základě rolí uživatelů nebo na základě vlastních zásad, které můžou zahrnovat kontrolu deklarací identity nebo jiné heuristiky.

Omezení přístupu ke směrování ASP.NET Core MVC je stejně snadné jako použití atributu Authorize na metodu akce (nebo u třídy kontroleru, pokud všechny akce kontroleru vyžadují autorizaci), jak je znázorněno v následujícím příkladu:

public class AccountController : Controller
{
    public ActionResult Login()
    {
    }

    [Authorize]
    public ActionResult Logout()
    {
    }
}

Ve výchozím nastavení přidání atributu Authorize bez parametrů omezí přístup ověřeným uživatelům pro daný kontroler nebo akci. Pokud chcete rozhraní API dále omezit tak, aby bylo dostupné jenom konkrétním uživatelům, můžete tento atribut rozšířit a určit požadované role nebo zásady, které uživatelé musí splňovat.

Implementace autorizace na základě role

ASP.NET Core Identity má integrovaný koncept rolí. Kromě uživatelů ASP.NET Core Identity ukládá informace o různých rolích používaných aplikací a sleduje, kteří uživatelé jsou přiřazeni k jakým rolím. Tato přiřazení lze změnit programově pomocí RoleManager typu, který aktualizuje role v trvalém úložišti, a UserManager typ, který může uživatelům udělit nebo odvolat role.

Pokud ověřujete pomocí nosných tokenů JWT, ASP.NET ověřovací middleware nosné metody Core JWT naplní role uživatele na základě deklarací rolí nalezených v tokenu. Pokud chcete omezit přístup k akci MVC nebo kontroleru uživatelům v konkrétních rolích, můžete do poznámky (atributu) zahrnout parametr Role, jak je znázorněno v následujícím fragmentu kódu:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

V tomto příkladu mají přístup k rozhraním API v kontroleru ControlPanel pouze uživatelé v rolích Správa istrator nebo PowerUser (například spuštění akce SetTime). Rozhraní API pro vypnutí je dále omezeno tak, aby umožňovalo přístup pouze uživatelům v roli Správa istrator.

Pokud chcete, aby byl uživatel v několika rolích, použijte více atributů Autorizace, jak je znázorněno v následujícím příkladu:

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

V tomto příkladu musí uživatel volat rozhraní API1:

  • Být v roli Správa istrator nebo PowerUser a

  • Být v roli RemoteEmployee a

  • Uspokojte vlastní obslužnou rutinu pro autorizaci CustomPolicy.

Implementace autorizace na základě zásad

Vlastní autorizační pravidla je možné zapsat také pomocí zásad autorizace. Tato část obsahuje přehled. Další informace najdete v ASP.NET Autorizační workshop.

Vlastní zásady autorizace se registrují v metodě Startup.ConfigureServices pomocí služby. Metoda AddAuthorization Tato metoda přebírá delegáta, který konfiguruje argument AuthorizationOptions.

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

Jak je znázorněno v příkladu, zásady je možné přidružit k různým typům požadavků. Po registraci zásad je možné je použít u akce nebo kontroleru předáním názvu zásady jako argumentu Policy atributu Authorize (například [Authorize(Policy="EmployeesOnly")]) Zásady mohou mít více požadavků, ne jenom jeden (jak je znázorněno v těchto příkladech).

V předchozím příkladu je první volání AddPolicy pouze alternativní způsob autorizace podle role. Pokud [Authorize(Policy="AdministratorsOnly")] se použije na rozhraní API, budou k němu mít přístup jenom uživatelé v roli Správa istratoru.

Druhé AddPolicy volání ukazuje snadný způsob, jak vyžadovat, aby pro uživatele byla přítomna určitá deklarace identity. Metoda RequireClaim také volitelně přebírá očekávané hodnoty pro deklaraci identity. Pokud jsou zadány hodnoty, požadavek je splněn pouze v případě, že uživatel má deklaraci správného typu i jednu ze zadaných hodnot. Pokud používáte ověřovací middleware nosné ověřování JWT, budou všechny vlastnosti JWT dostupné jako deklarace identity uživatelů.

Nejzajímavější zásada, která je zde uvedena, je ve třetí AddPolicy metodě, protože používá vlastní autorizační požadavek. Pomocí vlastních požadavků na autorizaci můžete mít velkou kontrolu nad tím, jak se autorizace provádí. Aby to fungovalo, musíte implementovat tyto typy:

Pokud uživatel požadavek splňuje, bude volání context.Succeed indikovat, že je uživatel autorizovaný. Pokud existuje více způsobů, jak může uživatel splnit požadavek na autorizaci, můžete vytvořit několik obslužných rutin.

Kromě registrace požadavků na vlastní zásady u AddPolicy volání musíte také zaregistrovat vlastní obslužné rutiny požadavků prostřednictvím injektáže závislostí (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).

Příklad vlastního požadavku na autorizaci a obslužné rutiny pro kontrolu věku uživatele (na DateOfBirth základě deklarace identity) je k dispozici v dokumentaci k autorizaci ASP.NET Core.

Autorizace a minimální apis

ASP.NET podporuje minimální rozhraní API jako alternativu k rozhraním API založeným na kontroleru. Zásady autorizace představují doporučený způsob konfigurace autorizace pro minimální rozhraní API, jak ukazuje tento příklad:

// Program.cs
builder.Services.AddAuthorizationBuilder()
  .AddPolicy("admin_greetings", policy =>
        policy
            .RequireRole("admin")
            .RequireScope("greetings_api"));

// build the app

app.MapGet("/hello", () => "Hello world!")
  .RequireAuthorization("admin_greetings");

Další materiály