Поделиться через


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

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

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

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

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

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

  • Декларативны.
  • Применяются к 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 утверждения в текущем identity.

Примените политику с помощью 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 уровне обработчика страниц, рекомендуется использовать контроллер, когда политики должны применяться на уровне обработчика страницы. Приложение rest , которое не требует политик на Razor уровне обработчика страниц, может использовать Razor Страницы.

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

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

Если требуется более сложные политики, такие как получение даты рождения, вычисление возраста из него, а затем проверка того, что возраст равен 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");
    }
}

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

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

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

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

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

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

Создайте и зарегистрируйте политику. Это происходит в рамках конфигурации службы авторизации, которая обычно участвует в 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 утверждения в текущем identity.

Затем вы применяете политику с помощью 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()
    {
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

Затем вы применяете политику с помощью 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()
    {
    }
}

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

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