翻译如下:
当创建身份时,其可以被分配由可信方发布的一个或多个声明。 索赔是名称值对,表示主题是什么,而不是主体可以做什么。 例如,您可能有驾驶执照,由当地驾驶执照颁发。 您的驾驶执照上有您的出生日期。 在这种情况下,声明名称将是DateOfBirth,声明值将是您的出生日期,例如1970年6月8日,并且发行人将是驾驶执照授权。 基于声明的授权最简单地检查声明的价值,并允许基于该值访问资源。 例如,如果您想访问夜总会,授权过程可能是:
保安员将评估您的出生日期的大小,以及他们是否信任发放者(驾驶执照当局),然后才允许您进入。
身份可以包含具有多个值的多个声明,并且可以包含多个相同类型的声明。
添加声明检查
基于声明的授权检查是声明性的 - 开发者将它们嵌入他们的代码内,针对控制器或控制器内的动作,指定当前用户必须拥有的声明,以及可选地声明必须拥有的值来访问所请求的资源。 声明要求是基于策略的,开发人员必须构建并注册表达声明要求的策略。
最简单的声明策略类型是查找声明的存在,而不检查值。
首先,你需要建立和注册的政策。 这是授权服务配置的一部分,通常配置在Startup.cs文件中的ConfigureServices()。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddAuthorization(options => { options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber")); }); }
在这种情况下,EmployeeOnly策略检查对当前身份的EmployeeNumber声明的存在。
然后,您可以使用AuthorizeAttribute属性上的Policy属性应用策略来指定策略名称;
[Authorize(Policy = "EmployeeOnly")] public IActionResult VacationBalance() { return View(); }
AuthorizeAttribute特性可以应用于整个控制器,在这种情况下,只有匹配策略的标识将被允许访问控制器上的任何操作。
[Authorize(Policy = "EmployeeOnly")] public class VacationController : Controller { public ActionResult VacationBalance() { } }
如果您具有受“AuthorizeAttribute”特性保护的控制器,但希望允许匿名访问特定操作,则应用AllowAnonymous Attribute属性;
[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.AddMvc(); services.AddAuthorization(options => { options.AddPolicy("Founders", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5")); } }
多重策略评估
如果将多个策略应用于控制器或操作,则在授予访问权之前所有策略必须通过。 例如;
[Authorize(Policy = "EmployeeOnly")] public class SalaryController : Controller { public ActionResult Payslip() { } [Authorize(Policy = "HumanResources")] public ActionResult UpdateSalary() { } }
在上面的示例中,任何满足EmployeeOnly策略的标识都可以访问Payslip操作,因为在控制器上强制执行该策略。 但是,为了调用UpdateSalary操作,身份必须同时满足EmployeeOnly策略和HumanResources策略。
如果你想要更复杂的政策,如生日申请的日期,计算从年龄,然后检查年龄是21岁或以上,那么你需要编写自定义策略处理程序。