Авторизация на основе утверждений в 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 или более старый возраст, вам нужно написать пользовательские обработчики политик.
ASP.NET Core