Авторизация на основе утверждений в ASP.NET Core

При создании удостоверения может быть назначено одно или несколько утверждений, выданных доверенной стороной. Утверждение — это пара "имя-значение", которая представляет собой предмет, а не то, что он может делать. Например, у вас может быть водительская лицензия, выданная местным центром вождения. Ваш водительская лицензия имеет дату рождения на нем. В этом случае имя утверждения будет DateOfBirth, значение утверждения будет вашей датой рождения, например 8th June 1970 , издателем будет орган вождения лицензии. Авторизация на основе утверждений, на самом простом этапе, проверка значение утверждения и разрешает доступ к ресурсу на основе этого значения. Например, если вы хотите получить доступ к ночному клубу, процесс авторизации может быть следующим:

Сотрудник по безопасности двери будет оценивать значение вашего утверждения о рождении и указывает, доверяют ли они издателю (органу водительской лицензии) перед предоставлением доступа.

Удостоверение может содержать несколько утверждений с несколькими значениями и содержать несколько утверждений одного типа.

Добавление проверка утверждений

Проверка авторизации на основе утверждений:

  • Декларативны.
  • Применяются к Razor страницам, контроллерам или действиям в контроллере.
  • Не удается применить на Razor уровне обработчика страницы, их необходимо применить к странице.

Утверждения в коде указывают утверждения, которым должен обладать текущий пользователь, и при необходимости значение, которое должно храниться для доступа к запрошенным ресурсам. Требования к утверждениям основаны на политике; Разработчик должен создать и зарегистрировать политику, в соответствии с требованиями к утверждениям.

Самый простой тип политики утверждений ищет наличие утверждения и не проверка значение.

Создание и регистрация политики и вызова UseAuthorization. Регистрация политики выполняется в рамках конфигурации службы авторизации, обычно в Program.cs файле:

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

В этом случае EmployeeOnly политика проверка для наличия EmployeeNumber утверждения в текущем удостоверении.

Примените политику с помощью Policy свойства атрибута [Authorize] , чтобы указать имя политики.

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

Атрибут [Authorize] может применяться ко всему контроллеру или Razor странице, в этом случае доступ к любому действию контроллера разрешен только удостоверениям, соответствующим политике.

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

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

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

Следующий код применяет [Authorize] атрибут к Razor странице:

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

    }
}

Политики нельзя применять на Razor уровне обработчика страницы, их необходимо применить к странице.

Если у вас есть контроллер, защищенный атрибутом [Authorize] , но требуется разрешить анонимный доступ к определенным действиям, применяется AllowAnonymousAttribute атрибут.

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

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

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

Так как политики нельзя применять на Razor уровне обработчика страниц, рекомендуется использовать контроллер, когда политики должны применяться на уровне обработчика страницы. Остальная часть приложения, для которых не требуются политики на Razor уровне обработчика страниц, может использовать Razor Pages.

Большинство утверждений приходят со значением. При создании политики можно указать список разрешенных значений. Следующий пример будет успешным только для сотрудников, число сотрудников которых составило 1, 2, 3, 4 или 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();

Добавление универсального утверждения проверка

Если значение утверждения не является одним значением или преобразованием является обязательным, используйте RequireAssertion. Дополнительные сведения см. в разделе "Использование func" для выполнения политики.

Оценка нескольких политик

Если на уровне контроллера и действия применяются несколько политик, все политики должны передаваться перед предоставлением доступа:

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

В предыдущем примере любое удостоверение, которое выполняет EmployeeOnly политику, может получить доступ к Payslip действию, так как эта политика применяется на контроллере. Однако для вызова UpdateSalary действия удостоверение должно выполнять как политику, такEmployeeOnly и HumanResources политику.

Если требуется более сложные политики, такие как получение даты рождения, вычисление возраста от него, а затем проверка, что возраст составляет 21 или более старый, необходимо написать пользовательские обработчики политик.

В следующем примере оба метода обработчика страницы должны выполнять как политику, такEmployeeOnly и HumanResources политику:

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

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

При создании удостоверения может быть назначено одно или несколько утверждений, выданных доверенной стороной. Утверждение — это пара "имя-значение", которая представляет собой предмет, а не то, что он может делать. Например, у вас может быть водительская лицензия, выданная местным центром вождения. Ваш водительская лицензия имеет дату рождения на нем. В этом случае имя утверждения будет DateOfBirth, значение утверждения будет вашей датой рождения, например 8th June 1970 , издателем будет орган вождения лицензии. Авторизация на основе утверждений, на самом простом этапе, проверка значение утверждения и разрешает доступ к ресурсу на основе этого значения. Например, если вы хотите получить доступ к ночному клубу, процесс авторизации может быть следующим:

Сотрудник по безопасности двери будет оценивать значение вашего утверждения о рождении и указывает, доверяют ли они издателю (органу водительской лицензии) перед предоставлением доступа.

Удостоверение может содержать несколько утверждений с несколькими значениями и содержать несколько утверждений одного типа.

Добавление проверка утверждений

Проверка авторизации на основе утверждений декларативны. Разработчик внедряет их в код, против контроллера или действия в контроллере, указывая утверждения, которым должен обладать текущий пользователь, и, при необходимости, значение утверждения должно храниться для доступа к запрошенному ресурсу. Требования к утверждениям основаны на политике, разработчик должен создать и зарегистрировать политику, выражающую требования к утверждениям.

Самый простой тип политики утверждений ищет наличие утверждения и не проверка значение.

Создайте и зарегистрируйте политику. Это происходит в рамках конфигурации службы авторизации, которая обычно участвует в ConfigureServices() файле Startup.cs .

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

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

Вызовите UseAuthorization в Configure. Следующий код создается шаблонами веб-приложений 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();
    });
}

В этом случае EmployeeOnly политика проверка для наличия EmployeeNumber утверждения в текущем удостоверении.

Затем вы применяете политику с помощью Policy свойства атрибута [Authorize] , чтобы указать имя политики;

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

Атрибут может применяться ко всему контроллеру. В [Authorize] этом экземпляре только удостоверения, соответствующие политике, будут разрешены доступ к любому действию на контроллере.

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

Если у вас есть контроллер, защищенный атрибутом [Authorize] , но требуется разрешить анонимный доступ к определенным действиям, применяемым атрибутом AllowAnonymousAttribute .

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Большинство утверждений приходят со значением. При создании политики можно указать список разрешенных значений. Следующий пример будет выполнен только для сотрудников, число сотрудников которых составило 1, 2, 3, 4 или 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"));
    });
}

Добавление универсального утверждения проверка

Если значение утверждения не является одним значением или преобразованием является обязательным, используйте RequireAssertion. Дополнительные сведения см. в разделе "Использование func" для выполнения политики.

Оценка нескольких политик

При применении нескольких политик к контроллеру или действию все политики должны передаваться перед предоставлением доступа. Например:

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

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

В приведенном выше примере любое удостоверение, которое выполняет EmployeeOnly политику, может получить доступ к Payslip действию, так как эта политика применяется на контроллере. Однако для вызова UpdateSalary действия удостоверение должно выполнять как политику, такEmployeeOnly и HumanResources политику.

Если требуется более сложные политики, такие как получение утверждения на дату рождения, вычисление возраста от него, то проверка возраст составляет 21 или более старый, необходимо написать пользовательские обработчики политик.

При создании удостоверения может быть назначено одно или несколько утверждений, выданных доверенной стороной. Утверждение — это пара "имя-значение", которая представляет собой предмет, а не то, что он может делать. Например, у вас может быть водительская лицензия, выданная местным центром вождения. Ваш водительская лицензия имеет дату рождения на нем. В этом случае имя утверждения будет DateOfBirth, значение утверждения будет вашей датой рождения, например 8th June 1970 , издателем будет орган вождения лицензии. Авторизация на основе утверждений, на самом простом этапе, проверка значение утверждения и разрешает доступ к ресурсу на основе этого значения. Например, если вы хотите получить доступ к ночному клубу, процесс авторизации может быть следующим:

Сотрудник по безопасности двери будет оценивать значение вашего утверждения о рождении и указывает, доверяют ли они издателю (органу водительской лицензии) перед предоставлением доступа.

Удостоверение может содержать несколько утверждений с несколькими значениями и содержать несколько утверждений одного типа.

Добавление проверка утверждений

Проверка авторизации на основе утверждений декларативны. Разработчик внедряет их в код, против контроллера или действия в контроллере, указывая утверждения, которым должен обладать текущий пользователь, и, при необходимости, значение утверждения должно храниться для доступа к запрошенному ресурсу. Требования к утверждениям основаны на политике, разработчик должен создать и зарегистрировать политику, выражающую требования к утверждениям.

Самый простой тип политики утверждений ищет наличие утверждения и не проверка значение.

Создайте и зарегистрируйте политику. Это происходит в рамках конфигурации службы авторизации, которая обычно участвует в ConfigureServices() файле Startup.cs .

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

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

В этом случае EmployeeOnly политика проверка для наличия EmployeeNumber утверждения в текущем удостоверении.

Затем вы применяете политику с помощью Policy свойства атрибута [Authorize] , чтобы указать имя политики;

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

Атрибут может применяться ко всему контроллеру. В [Authorize] этом экземпляре только удостоверения, соответствующие политике, будут разрешены доступ к любому действию на контроллере.

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

Если у вас есть контроллер, защищенный атрибутом [Authorize] , но требуется разрешить анонимный доступ к определенным действиям, применяемым атрибутом AllowAnonymousAttribute .

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Большинство утверждений приходят со значением. При создании политики можно указать список разрешенных значений. Следующий пример будет выполнен только для сотрудников, число сотрудников которых составило 1, 2, 3, 4 или 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"));
    });
}

Добавление универсального утверждения проверка

Если значение утверждения не является одним значением или преобразованием является обязательным, используйте RequireAssertion. Дополнительные сведения см. в разделе "Использование func" для выполнения политики.

Оценка нескольких политик

При применении нескольких политик к контроллеру или действию все политики должны передаваться перед предоставлением доступа. Например:

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

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

В приведенном выше примере любое удостоверение, которое выполняет EmployeeOnly политику, может получить доступ к Payslip действию, так как эта политика применяется на контроллере. Однако для вызова UpdateSalary действия удостоверение должно выполнять как политику, такEmployeeOnly и HumanResources политику.

Если требуется более сложные политики, такие как получение утверждения на дату рождения, вычисление возраста от него, то проверка возраст составляет 21 или более старый, необходимо написать пользовательские обработчики политик.