當身份被建立時,可能會被指派一個或多個由受信任方發出的權利要求。 宣告是成對的名稱和數值,代表主體的身分,而不是主體可以執行的動作。 例如,您可能擁有由當地駕駛執照授權機構簽發的駕照。 您的駕駛執照有您的出生日期。 在此情況下,宣告名稱會是 DateOfBirth,宣告值會是您的出生日期,例如 8th June 1970,簽發者會是駕駛執照授權單位。 最簡單的宣告型授權會檢查宣告的值,並允許根據該值存取資源。 例如,如果您想要進入夜總會,授權程序可能是:
大門保安人員讓您入場之前,會先評估出生日期宣告的值,以及他們是否信任簽發者 (駕駛執照授權單位)。
同一身份可以包含多個具有多個值的權利要求,也可以包含多個相同類型的權利要求。
新增宣告檢查
宣告型授權檢查:
- 為宣告式。
- 會套用至控制器內的 Razor Pages、控制器或動作。
- 無法在 Razor Page 處理常式層級套用,必須套用至 Page。
程式碼中的宣告會指定目前使用者必須擁有的宣告,並選擇性地指定宣告必須保留的值來存取要求的資源。 宣告需求屬於原則型,開發人員必須建置並註冊表示宣告需求的原則。
最簡單的宣告原則類型會尋找宣告是否存在,而且不會檢查其值。
建置和註冊原則並呼叫 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 Page:
[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
public void OnGet()
{
}
}
原則無法在 Razor 頁面處理常式層級套用,必須將原則套用至 Page。
如果您有受 [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 Page 處理常式層級,因此當原則必須在頁面處理常式層級套用時,建議您使用控制器。 應用程式中不涉及頁面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 Web 應用程式範本所產生:
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 歲或更大,則您需要撰寫自訂原則處理常式。