Autorizace založená na deklarací identity v ASP.NET Core

Když je identita vytvořena, může být přiřazena jedna nebo více deklarací identity vystavených důvěryhodnou stranou. Deklarace identity je dvojice hodnot názvu, která představuje, co předmět je, ne to, co předmět může dělat. Můžete mít například řidičskou licenci, kterou vydala místní řidičská autorita. Vaše řidičská licence má datum narození. V tomto případě by DateOfBirthnázev deklarace identity byl , hodnota deklarace by byla vaše datum narození, například 8th June 1970 a vystavitel by byl řidičské licence. Autorizace založená na deklarací identity v nejjednodušším případě zkontroluje hodnotu deklarace identity a umožní přístup k prostředku na základě této hodnoty. Pokud například chcete mít přístup k nočnímu klubu, proces autorizace může být následující:

Bezpečnostní důstojník by před udělením přístupu vyhodnotil hodnotu vašeho data narození a jestli důvěřuje vystaviteli (řidičské autoritě).

Identita může obsahovat více deklarací identity s více hodnotami a může obsahovat více deklarací identity stejného typu.

Přidání kontrol deklarací identity

Kontroly autorizace založené na deklarací:

  • Jsou deklarativní.
  • Použijí se na Razor stránky, kontrolery nebo akce v rámci kontroleru.
  • Nelze použít na Razor úrovni obslužné rutiny stránky, musí být použity na stránku.

Deklarace identity v kódu určují deklarace identity, které musí aktuální uživatel mít, a volitelně hodnota, kterou musí deklarace identity obsahovat pro přístup k požadovanému prostředku. Požadavky na deklarace identity jsou založené na zásadách; vývojář musí vytvořit a zaregistrovat zásadu vyjadřující požadavky na deklarace identity.

Nejjednodušší typ zásad deklarací identity hledá přítomnost deklarace identity a nekontroluje hodnotu.

Sestavte a zaregistrujte zásadu a volejte UseAuthorization. Registrace zásad probíhá jako součást konfigurace autorizační služby, obvykle v Program.cs souboru:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthorization(options =>
{
   options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

V takovém případě EmployeeOnly zásada kontroluje přítomnost EmployeeNumber deklarace identity pro aktuální identitu.

Použijte zásadu Policy pomocí vlastnosti [Authorize] atributu k určení názvu zásady.

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Atribut [Authorize] lze použít na celý kontroler nebo Razor stránku. V takovém případě mají přístup k jakékoli akci na kontroleru pouze identity odpovídající zásadám.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Následující kód použije [Authorize] atribut na Razor stránku:

[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
}

Zásady nelze použít na Razor úrovni obslužné rutiny stránky, musí být použity na stránku.

Pokud máte kontroler, který je chráněný atributem [Authorize] , ale chcete povolit anonymní přístup ke konkrétním akcím, použijete AllowAnonymousAttribute tento atribut.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Vzhledem k tomu, že zásady nelze použít na Razor úrovni obslužné rutiny stránky, doporučujeme použít kontroler, pokud je nutné použít zásady na úrovni obslužné rutiny stránky. Zbytek aplikace, která nevyžaduje zásady na Razor úrovni obslužné rutiny stránky, může používat Razor stránky.

Většina deklarací identity má hodnotu. Při vytváření zásad můžete zadat seznam povolených hodnot. Následující příklad by byl úspěšný pouze pro zaměstnance, jejichž číslo zaměstnance bylo 1, 2, 3, 4 nebo 5.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Founders", policy =>
                      policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Přidání obecné kontroly deklarací identity

Pokud hodnota deklarace identity není jedinou hodnotou nebo je vyžadována transformace, použijte RequireAssertion. Další informace naleznete v tématu Použití func k plnění zásad.

Vyhodnocení více zásad

Pokud se na úrovni kontroleru a akcí použije více zásad, musí se před udělením přístupu předat všechny zásady:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Payslip()
    {
        return View();
    }

    [Authorize(Policy = "HumanResources")]
    public IActionResult UpdateSalary()
    {
        return View();
    }
}

V předchozím příkladu má každá identita, která splňuje EmployeeOnly zásady, přístup k Payslip akci, protože se tato zásada vynucuje na kontroleru. Aby však mohla volat UpdateSalary akci, musí identita splňovat zásady iEmployeeOnlyHumanResources zásady.

Pokud chcete složitější zásady, jako je například pořízení data narození, výpočet věku od něj a kontrola věku 21 nebo starší, musíte napsat vlastní obslužné rutiny zásad.

V následující ukázce musí obě metody obslužné rutiny stránky splňovat EmployeeOnly zásady i HumanResources zásady:

[Authorize(Policy = "EmployeeOnly")]
[Authorize(Policy = "HumanResources")]
public class SalaryModel : PageModel
{
    public ContentResult OnGetPayStub()
    {
        return Content("OnGetPayStub");
    }

    public ContentResult OnGetSalary()
    {
        return Content("OnGetSalary");
    }
}

Když je identita vytvořena, může být přiřazena jedna nebo více deklarací identity vystavených důvěryhodnou stranou. Deklarace identity je dvojice hodnot názvu, která představuje, co předmět je, ne to, co předmět může dělat. Můžete mít například řidičskou licenci, kterou vydala místní řidičská autorita. Vaše řidičská licence má datum narození. V tomto případě by DateOfBirthnázev deklarace identity byl , hodnota deklarace by byla vaše datum narození, například 8th June 1970 a vystavitel by byl řidičské licence. Autorizace založená na deklarací identity v nejjednodušším případě zkontroluje hodnotu deklarace identity a umožní přístup k prostředku na základě této hodnoty. Pokud například chcete mít přístup k nočnímu klubu, proces autorizace může být následující:

Bezpečnostní důstojník by před udělením přístupu vyhodnotil hodnotu vašeho data narození a jestli důvěřuje vystaviteli (řidičské autoritě).

Identita může obsahovat více deklarací identity s více hodnotami a může obsahovat více deklarací identity stejného typu.

Přidání kontrol deklarací identity

Kontroly autorizace založené na deklaraci identity jsou deklarativní – vývojář je vloží do kódu, proti kontroleru nebo akci v rámci kontroleru, určení deklarací identity, které musí aktuální uživatel mít, a volitelně hodnotu, kterou musí deklarace identity obsahovat pro přístup k požadovanému prostředku. Požadavky na deklarace identity jsou založené na zásadách, vývojář musí vytvořit a zaregistrovat zásadu vyjadřující požadavky na deklarace identity.

Nejjednodušší typ zásad deklarací identity hledá přítomnost deklarace identity a nekontroluje hodnotu.

Sestavte a zaregistrujte zásadu. Probíhá to jako součást konfigurace autorizační služby, která se obvykle účastní ConfigureServices() ve vašem Startup.cs souboru.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

Zavolat UseAuthorization .Configure Šablony webové aplikace ASP.NET Core vygenerují následující kód:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

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

V takovém případě EmployeeOnly zásada kontroluje přítomnost EmployeeNumber deklarace identity pro aktuální identitu.

Pak použijete zásadu Policy pomocí vlastnosti atributu [Authorize] k určení názvu zásady;

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Atribut [Authorize] lze použít na celý kontroler, v této instanci budou mít přístup k jakékoli akci na kontroleru pouze identity odpovídající zásadám.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

Pokud máte kontroler chráněný atributem [Authorize] , ale chcete povolit anonymní přístup ke konkrétním akcím, které tento atribut použijete AllowAnonymousAttribute .

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Většina deklarací identity má hodnotu. Při vytváření zásad můžete zadat seznam povolených hodnot. Následující příklad by byl úspěšný pouze pro zaměstnance, jejichž číslo zaměstnance bylo 1, 2, 3, 4 nebo 5.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

Přidání obecné kontroly deklarací identity

Pokud hodnota deklarace identity není jedinou hodnotou nebo je vyžadována transformace, použijte RequireAssertion. Další informace naleznete v tématu Použití func k plnění zásad.

Vyhodnocení více zásad

Pokud na kontroler nebo akci použijete více zásad, musí se před udělením přístupu předat všechny zásady. Příklad:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

Ve výše uvedeném příkladu má každá identita, která splňuje EmployeeOnly zásady, přístup k Payslip akci, protože se tato zásada vynucuje na kontroleru. Aby však bylo možné volat UpdateSalary akci, musí identita splňovat zásady iEmployeeOnlyHumanResources zásady.

Pokud chcete složitější zásady, například vzít datum narození, vypočítat věk od něj a pak zkontrolovat věk je 21 nebo starší, musíte napsat vlastní obslužné rutiny zásad.

Když je identita vytvořena, může být přiřazena jedna nebo více deklarací identity vystavených důvěryhodnou stranou. Deklarace identity je dvojice hodnot názvu, která představuje, co předmět je, ne to, co předmět může dělat. Můžete mít například řidičskou licenci, kterou vydala místní řidičská autorita. Vaše řidičská licence má datum narození. V tomto případě by DateOfBirthnázev deklarace identity byl , hodnota deklarace by byla vaše datum narození, například 8th June 1970 a vystavitel by byl řidičské licence. Autorizace založená na deklarací identity v nejjednodušším případě zkontroluje hodnotu deklarace identity a umožní přístup k prostředku na základě této hodnoty. Pokud například chcete mít přístup k nočnímu klubu, proces autorizace může být následující:

Bezpečnostní důstojník by před udělením přístupu vyhodnotil hodnotu vašeho data narození a jestli důvěřuje vystaviteli (řidičské autoritě).

Identita může obsahovat více deklarací identity s více hodnotami a může obsahovat více deklarací identity stejného typu.

Přidání kontrol deklarací identity

Kontroly autorizace založené na deklaraci identity jsou deklarativní – vývojář je vloží do kódu, proti kontroleru nebo akci v rámci kontroleru, určení deklarací identity, které musí aktuální uživatel mít, a volitelně hodnotu, kterou musí deklarace identity obsahovat pro přístup k požadovanému prostředku. Požadavky na deklarace identity jsou založené na zásadách, vývojář musí vytvořit a zaregistrovat zásadu vyjadřující požadavky na deklarace identity.

Nejjednodušší typ zásad deklarací identity hledá přítomnost deklarace identity a nekontroluje hodnotu.

Sestavte a zaregistrujte zásadu. Probíhá to jako součást konfigurace autorizační služby, která se obvykle účastní ConfigureServices() ve vašem Startup.cs souboru.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

V takovém případě EmployeeOnly zásada kontroluje přítomnost EmployeeNumber deklarace identity pro aktuální identitu.

Pak použijete zásadu Policy pomocí vlastnosti atributu [Authorize] k určení názvu zásady;

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

Atribut [Authorize] lze použít na celý kontroler, v této instanci budou mít přístup k jakékoli akci na kontroleru pouze identity odpovídající zásadám.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

Pokud máte kontroler chráněný atributem [Authorize] , ale chcete povolit anonymní přístup ke konkrétním akcím, které tento atribut použijete AllowAnonymousAttribute .

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Většina deklarací identity má hodnotu. Při vytváření zásad můžete zadat seznam povolených hodnot. Následující příklad by byl úspěšný pouze pro zaměstnance, jejichž číslo zaměstnance bylo 1, 2, 3, 4 nebo 5.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

Přidání obecné kontroly deklarací identity

Pokud hodnota deklarace identity není jedinou hodnotou nebo je vyžadována transformace, použijte RequireAssertion. Další informace naleznete v tématu Použití func k plnění zásad.

Vyhodnocení více zásad

Pokud na kontroler nebo akci použijete více zásad, musí se před udělením přístupu předat všechny zásady. Příklad:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

Ve výše uvedeném příkladu má každá identita, která splňuje EmployeeOnly zásady, přístup k Payslip akci, protože se tato zásada vynucuje na kontroleru. Aby však bylo možné volat UpdateSalary akci, musí identita splňovat zásady iEmployeeOnlyHumanResources zásady.

Pokud chcete složitější zásady, například vzít datum narození, vypočítat věk od něj a pak zkontrolovat věk je 21 nebo starší, musíte napsat vlastní obslužné rutiny zásad.