Sdílet prostřednictvím


Informace o autorizaci v mikroslužbách a webových aplikacích .NET

Návod

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.

eBook o architektuře mikroslužeb .NET pro kontejnerizované aplikace .NET, miniatura na obálce.

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í ověřovacích nosných tokenů JWT, middleware pro ověřování nosných tokenů JWT v ASP.NET Core naplní role uživatele na základě potvrzení 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ávce 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ávce.

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, aby mohl volat rozhraní API1, uživatel musí:

  • Být v roli Správce nebo Pokročilého uživatele a

  • Být v roli RemoteEmployee je třeba a

  • Splňte požadavek vlastní obslužné rutiny pro autorizaci CustomPolicy.

Provádějte autorizaci 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í metody service.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ávce.

Druhé AddPolicy volání ukazuje snadný způsob, jak vyžadovat, aby pro uživatele byla přítomna určitá deklarace identity. Metoda RequireClaim může volitelně přijímat očekávané hodnoty pro nárok. 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 middleware pro ověřování nositelem JWT, všechny vlastnosti JWT budou dostupné jako deklarace identity uživatele.

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í politiky u AddPolicy volání musíte také zaregistrovat vlastní obslužné rutiny požadavků prostřednictvím dependency injection (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");

Dodatečné zdroje