Udostępnij za pośrednictwem


Autoryzacja oparta na oświadczeniach w usłudze ASP.NET Core

Po utworzeniu tożsamości można przypisać do niego jedno lub więcej oświadczeń wystawionych przez zaufaną firmę. Oświadczenie jest parą wartości nazwy, która reprezentuje temat, a nie to, co podmiot może zrobić. Na przykład może istnieć prawo jazdy wydane przez lokalny urząd prawa jazdy. Twoja licencja kierowcy ma swoją datę urodzenia. W takim przypadku nazwa roszczenia to DateOfBirth, wartość oświadczenia będzie twoją datą urodzenia, na przykład 8th June 1970 a wystawca będzie organem prawa jazdy. Autoryzacja oparta na oświadczeniach, najprościej, sprawdza wartość oświadczenia i umożliwia dostęp do zasobu na podstawie tej wartości. Jeśli na przykład chcesz uzyskać dostęp do klubu nocnego, proces autoryzacji może być:

Urzędnik ochrony drzwi oceni wartość twojego roszczenia urodzenia i czy ufa wystawcy (organowi prawa jazdy) przed udzieleniem dostępu.

Tożsamość może zawierać wiele oświadczeń z wieloma wartościami i może zawierać wiele oświadczeń tego samego typu.

Dodawanie kontroli oświadczeń

Sprawdzanie autoryzacji opartej na oświadczeniach:

  • Są deklaratywne.
  • Są stosowane do Razor stron, kontrolerów lub akcji w obrębie kontrolera.
  • Nie można zastosować ich na Razor poziomie obsługi strony. Należy je zastosować do strony.

Oświadczenia w kodzie określają oświadczenia, które bieżący użytkownik musi posiadać, i opcjonalnie wartość, którą oświadczenie musi przechowywać w celu uzyskania dostępu do żądanego zasobu. Wymagania dotyczące oświadczeń są oparte na zasadach; deweloper musi utworzyć i zarejestrować zasady wyrażające wymagania dotyczące oświadczeń.

Najprostszy typ zasad oświadczeń wyszukuje obecność oświadczenia i nie sprawdza wartości.

Skompiluj i zarejestruj zasady i wywołaj metodę UseAuthorization. Rejestrowanie zasad odbywa się w ramach konfiguracji usługi autoryzacji, zazwyczaj w Program.cs pliku:

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();

W takim przypadku EmployeeOnly zasady sprawdzają obecność EmployeeNumber oświadczenia w bieżącej tożsamości.

Zastosuj zasady przy użyciu właściwości w atrybucie Policy , [Authorize] aby określić nazwę zasad.

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

Atrybut [Authorize] można zastosować do całego kontrolera lub Razor strony, w tym przypadku tylko tożsamości pasujące do zasad mogą mieć dostęp do dowolnej akcji na kontrolerze.

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

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

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

Następujący kod stosuje [Authorize] atrybut do Razor strony:

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

    }
}

Nie można stosować zasad na Razor poziomie procedury obsługi strony. Należy je zastosować do strony.

Jeśli masz kontroler, który jest chroniony przez [Authorize] atrybut, ale chcesz zezwolić na anonimowy dostęp do określonych akcji, należy zastosować AllowAnonymousAttribute atrybut.

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

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

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

Ponieważ zasady nie mogą być stosowane na Razor poziomie procedury obsługi strony, zalecamy użycie kontrolera, gdy zasady muszą być stosowane na poziomie procedury obsługi strony. Pozostała część aplikacji, która nie wymaga zasad na Razor poziomie obsługi strony, może używać Razor stron.

Większość oświadczeń ma wartość. Podczas tworzenia zasad można określić listę dozwolonych wartości. Poniższy przykład powiedzie się tylko dla pracowników, których numer pracownika to 1, 2, 3, 4 lub 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();

Dodawanie sprawdzania oświadczeń ogólnych

Jeśli wartość oświadczenia nie jest pojedynczą wartością lub wymagane jest przekształcenie, użyj polecenia RequireAssertion. Aby uzyskać więcej informacji, zobacz Używanie func do spełnienia zasad.

Ocena wielu zasad

Jeśli na poziomie kontrolera i akcji zastosowano wiele zasad, wszystkie zasady muszą zostać przekazane przed udzieleniem dostępu:

[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();
    }
}

W poprzednim przykładzie każda tożsamość, która spełnia EmployeeOnly zasady, może uzyskać dostęp do Payslip akcji, ponieważ te zasady są wymuszane na kontrolerze. Jednak w celu wywołania UpdateSalary akcji tożsamość musi spełniać zarównoEmployeeOnly zasady, jak i HumanResources zasady.

Jeśli potrzebujesz bardziej skomplikowanych zasad, takich jak przyjęcie daty urodzenia, obliczenie wieku od niego, a następnie sprawdzenie, czy wiek wynosi 21 lat, musisz napisać niestandardowe procedury obsługi zasad.

W poniższym przykładzie obie metody obsługi stron muszą spełniać zarówno zasady, jak EmployeeOnly i HumanResources zasady:

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

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

Po utworzeniu tożsamości można przypisać do niego jedno lub więcej oświadczeń wystawionych przez zaufaną firmę. Oświadczenie jest parą wartości nazwy, która reprezentuje temat, a nie to, co podmiot może zrobić. Na przykład może istnieć prawo jazdy wydane przez lokalny urząd prawa jazdy. Twoja licencja kierowcy ma swoją datę urodzenia. W takim przypadku nazwa roszczenia to DateOfBirth, wartość oświadczenia będzie twoją datą urodzenia, na przykład 8th June 1970 a wystawca będzie organem prawa jazdy. Autoryzacja oparta na oświadczeniach, najprościej, sprawdza wartość oświadczenia i umożliwia dostęp do zasobu na podstawie tej wartości. Jeśli na przykład chcesz uzyskać dostęp do klubu nocnego, proces autoryzacji może być:

Urzędnik ochrony drzwi oceni wartość twojego roszczenia urodzenia i czy ufa wystawcy (organowi prawa jazdy) przed udzieleniem dostępu.

Tożsamość może zawierać wiele oświadczeń z wieloma wartościami i może zawierać wiele oświadczeń tego samego typu.

Dodawanie kontroli oświadczeń

Testy autoryzacji oparte na oświadczeniach są deklaratywne — deweloper osadza je w kodzie, względem kontrolera lub akcji w kontrolerze, określając oświadczenia, które bieżący użytkownik musi posiadać, i opcjonalnie wartość, którą musi przechowywać oświadczenie w celu uzyskania dostępu do żądanego zasobu. Wymagania dotyczące oświadczeń są oparte na zasadach. Deweloper musi utworzyć i zarejestrować zasady wyrażające wymagania dotyczące oświadczeń.

Najprostszy typ zasad oświadczeń wyszukuje obecność oświadczenia i nie sprawdza wartości.

Skompiluj i zarejestruj zasady. Odbywa się to w ramach konfiguracji usługi autoryzacji, która zwykle bierze udział w ConfigureServices()Startup.cs pliku.

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

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

Wywołaj metodę UseAuthorization w pliku Configure. Następujący kod jest generowany przez szablony aplikacji internetowej platformy ASP.NET Core:

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();
    });
}

W takim przypadku EmployeeOnly zasady sprawdzają obecność EmployeeNumber oświadczenia w bieżącej tożsamości.

Następnie należy zastosować zasady przy użyciu Policy właściwości atrybutu [Authorize] , aby określić nazwę zasad;

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

Atrybut [Authorize] można zastosować do całego kontrolera. W tym wystąpieniu tylko tożsamości pasujące do zasad będą mogły uzyskiwać dostęp do dowolnej akcji na kontrolerze.

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

Jeśli masz kontroler, który jest chroniony przez [Authorize] atrybut, ale chcesz zezwolić na anonimowy dostęp do określonych akcji, które stosujesz AllowAnonymousAttribute atrybut.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Większość oświadczeń ma wartość. Podczas tworzenia zasad można określić listę dozwolonych wartości. Poniższy przykład powiedzie się tylko dla pracowników, których numer pracownika to 1, 2, 3, 4 lub 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"));
    });
}

Dodawanie sprawdzania oświadczeń ogólnych

Jeśli wartość oświadczenia nie jest pojedynczą wartością lub wymagane jest przekształcenie, użyj polecenia RequireAssertion. Aby uzyskać więcej informacji, zobacz Używanie func do spełnienia zasad.

Ocena wielu zasad

W przypadku zastosowania wielu zasad do kontrolera lub akcji wszystkie zasady muszą zostać przekazane przed udzieleniem dostępu. Przykład:

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

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

W powyższym przykładzie każda tożsamość spełniająca EmployeeOnly zasady może uzyskać dostęp do Payslip akcji, ponieważ te zasady są wymuszane na kontrolerze. Jednak aby wywołać UpdateSalary akcję, tożsamość musi spełniać zarównoEmployeeOnly zasady, jak i HumanResources zasady.

Jeśli chcesz bardziej skomplikowanych zasad, takich jak przyjęcie daty urodzenia, obliczenie wieku od niego, sprawdzenie wieku wynosi 21 lub starsze, musisz napisać niestandardowe procedury obsługi zasad.

Po utworzeniu tożsamości można przypisać do niego jedno lub więcej oświadczeń wystawionych przez zaufaną firmę. Oświadczenie jest parą wartości nazwy, która reprezentuje temat, a nie to, co podmiot może zrobić. Na przykład może istnieć prawo jazdy wydane przez lokalny urząd prawa jazdy. Twoja licencja kierowcy ma swoją datę urodzenia. W takim przypadku nazwa roszczenia to DateOfBirth, wartość oświadczenia będzie twoją datą urodzenia, na przykład 8th June 1970 a wystawca będzie organem prawa jazdy. Autoryzacja oparta na oświadczeniach, najprościej, sprawdza wartość oświadczenia i umożliwia dostęp do zasobu na podstawie tej wartości. Jeśli na przykład chcesz uzyskać dostęp do klubu nocnego, proces autoryzacji może być:

Urzędnik ochrony drzwi oceni wartość twojego roszczenia urodzenia i czy ufa wystawcy (organowi prawa jazdy) przed udzieleniem dostępu.

Tożsamość może zawierać wiele oświadczeń z wieloma wartościami i może zawierać wiele oświadczeń tego samego typu.

Dodawanie kontroli oświadczeń

Testy autoryzacji oparte na oświadczeniach są deklaratywne — deweloper osadza je w kodzie, względem kontrolera lub akcji w kontrolerze, określając oświadczenia, które bieżący użytkownik musi posiadać, i opcjonalnie wartość, którą musi przechowywać oświadczenie w celu uzyskania dostępu do żądanego zasobu. Wymagania dotyczące oświadczeń są oparte na zasadach. Deweloper musi utworzyć i zarejestrować zasady wyrażające wymagania dotyczące oświadczeń.

Najprostszy typ zasad oświadczeń wyszukuje obecność oświadczenia i nie sprawdza wartości.

Skompiluj i zarejestruj zasady. Odbywa się to w ramach konfiguracji usługi autoryzacji, która zwykle bierze udział w ConfigureServices()Startup.cs pliku.

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

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

W takim przypadku EmployeeOnly zasady sprawdzają obecność EmployeeNumber oświadczenia w bieżącej tożsamości.

Następnie należy zastosować zasady przy użyciu Policy właściwości atrybutu [Authorize] , aby określić nazwę zasad;

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

Atrybut [Authorize] można zastosować do całego kontrolera. W tym wystąpieniu tylko tożsamości pasujące do zasad będą mogły uzyskiwać dostęp do dowolnej akcji na kontrolerze.

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

Jeśli masz kontroler, który jest chroniony przez [Authorize] atrybut, ale chcesz zezwolić na anonimowy dostęp do określonych akcji, które stosujesz AllowAnonymousAttribute atrybut.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Większość oświadczeń ma wartość. Podczas tworzenia zasad można określić listę dozwolonych wartości. Poniższy przykład powiedzie się tylko dla pracowników, których numer pracownika to 1, 2, 3, 4 lub 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"));
    });
}

Dodawanie sprawdzania oświadczeń ogólnych

Jeśli wartość oświadczenia nie jest pojedynczą wartością lub wymagane jest przekształcenie, użyj polecenia RequireAssertion. Aby uzyskać więcej informacji, zobacz Używanie func do spełnienia zasad.

Ocena wielu zasad

W przypadku zastosowania wielu zasad do kontrolera lub akcji wszystkie zasady muszą zostać przekazane przed udzieleniem dostępu. Przykład:

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

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

W powyższym przykładzie każda tożsamość spełniająca EmployeeOnly zasady może uzyskać dostęp do Payslip akcji, ponieważ te zasady są wymuszane na kontrolerze. Jednak aby wywołać UpdateSalary akcję, tożsamość musi spełniać zarównoEmployeeOnly zasady, jak i HumanResources zasady.

Jeśli chcesz bardziej skomplikowanych zasad, takich jak przyjęcie daty urodzenia, obliczenie wieku od niego, sprawdzenie wieku wynosi 21 lub starsze, musisz napisać niestandardowe procedury obsługi zasad.