asp.netcore权限认证

asp.netcore权限认证

2023年6月20日发(作者:)

e权限认证⼀、简单授权 Core 中的授权通过 AuthorizeAttribute 和其各种参数来控制。 在其页⾯中,通过

[Authorize] 属性应⽤于控制器、操作或 Razor 页⾯,限制对已通过⾝份验证的⽤户的访问。⽰例如下:[Authorize]

public class AccountController : Controller {

public ActionResult Login() {

}

public ActionResult Logout() { } }如果要对操作(⽽不是控制器)应⽤授权,请将属性应⽤于

AuthorizeAttribute 操作本⾝⽰例如下:public class AccountController : Controller {

public ActionResult Login() {

}

[Authorize]

public ActionResult Logout() {

}

}你还可以使⽤属性,以

AllowAnonymous 允许未通过⾝份验证的⽤户访问各个操作。 例如:[Authorize]

public class AccountController : Controller {

[AllowAnonymous]

public ActionResult Login() {

}

public ActionResult Logout() {

}

}⼆、基于⾓⾊的授权基于⾓⾊的授权检查是声明性 — 的,开发⼈员将其嵌⼊到代码中、控制器或控制器内的操作,指定当前⽤户必须是其成员的⾓⾊才能访问请求的资源。例如,以下代码将访问权限限制为属于⾓⾊成员的⽤户的任何操作:[Authorize(Roles = "Administrator")]

public class AdministrationController : Controller { }多⾓⾊可以定义如下:[Authorize(Roles = "HRManager,Finance")]

public class SalaryController : Controller { }如果应⽤多个属性,则访问⽤户必须是所有指定⾓⾊的成员;下⾯的⽰例要求⽤户必须是

PowerUser 和⾓⾊的成员

ControlPanelUser 。[Authorize(Roles = "PowerUser")][Authorize(Roles = "ControlPanelUser")]

public class ControlPanelController : Controller { }三、基于策略的授权基于策略的授权,其实就是要求⽤户必须满⾜指定的策略要求,这个策略⼀般都是⽤户的⼀些基本信息,如名字、⾓⾊或者其他,我们⾸先要在在配置函数中,添加⼀个策略如下:public void ConfigureServices(IServiceCollection services){ trollersWithViews(); orPages(); horization(options => { icy("EmployeeOnly", policy => eClaim("EmployeeNumber")); });}如以上代码,要求⽤户的claim信息中包含EmployeeNumber属性 var claims = new List() { new Claim(,username), new Claim("UserId",ng()), new Claim(, roleName), new Claim("EmployeeNumber",“1"),

};那么在控制器中,只需要以下代码,并能实现对权限的控制[Authorize(Policy = "EmployeeOnly")]public IActionResult VacationBalance(){ return View();}基于策略的授权,policy函数具有以下⼀些常⽤的函数:AddAuthenticationSchemes(String[])

将指定的⾝份验证添加 schemes 到 AuthenticationSchemes 此实例的。AddRequirements(IAuthorizationRequirement[])

将指定的添加 requirements 到 Requirements 此实例的。Build()

AuthorizationPolicy根据此实例中的要求⽣成⼀个新的。Combine(AuthorizationPolicy)

将指定的合并 policy 到当前实例中。RequireAssertion(Func)

将添加 AssertionRequirement 到当前实例中。RequireAssertion(Func>)

将添加 AssertionRequirement 到当前实例中。RequireAuthenticatedUser()

该实例强制对当前⽤户进⾏⾝份验证。RequireClaim(String)

要求当前⽤户具有指定的声明。RequireClaim(String, IEnumerable)

这要求当前⽤户具有指定的声明,并且声明值必须是允许的值之⼀。RequireClaim(String, String[])

这要求当前⽤户具有指定的声明,并且声明值必须是允许的值之⼀。RequireRole(IEnumerable)

该实例强制当前⽤户必须⾄少有⼀个指定的⾓⾊。RequireRole(String[])

该实例强制当前⽤户必须⾄少有⼀个指定的⾓⾊。RequireUserName(String)

强制当前⽤户与指定的名称匹配。除以上功能之外,⽤于可以⾃定义策略,实现对页⾯的授权,其定义策略的基本⽅法如下:1、实现IAuthorizationRequirement接⼝,定义⼀个策略规范using ization;public class MinimumAgeRequirement : IAuthorizationRequirement{ public int MinimumAge { get; } public MinimumAgeRequirement(int minimumAge) { MinimumAge = minimumAge; }}2、实现策略检查器,其负责对策略进⾏检查,以下代码请求⽤户年纪,并且进⾏策略⽐较,实现授权public class MinimumAgeHandler : AuthorizationHandler{ protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumAgeRequirement requirement) { if (!im(c => == Birth && == "")) { //TODO: Use the following if targeting a version of //.NET Framework older than 4.6: // return sult(0); return tedTask; } var dateOfBirth = Time( rst(c => == Birth &&

== "").Value); int calculatedAge = - ; if (dateOfBirth > rs(-calculatedAge)) { calculatedAge--; } if (calculatedAge >= mAge) { d(requirement); } //TODO: Use the following if targeting a version of //.NET Framework older than 4.6: // return sult(0); return tedTask; }}3、在ConfigureServices中添加策略检查代码,如下所⽰:public void ConfigureServices(IServiceCollection services){ trollersWithViews(); orPages(); horization(options => { icy("AtLeast21", policy => (new MinimumAgeRequirement(21))); }); //添加⼀个可以注⼊的对象 gleton();}4、如果要实现多个授权策略,可以实现继承如下接⼝ublic class PermissionHandler : IAuthorizationHandler{ public Task HandleAsync(AuthorizationHandlerContext context) { var pendingRequirements = (); foreach (var requirement in pendingRequirements) { if (requirement is ReadPermission) { if (IsOwner(, ce) || IsSponsor(, ce)) { d(requirement); } } else if (requirement is EditPermission || requirement is DeletePermission) { if (IsOwner(, ce)) { d(requirement); } } } //TODO: Use the following if targeting a version of //.NET Framework older than 4.6: // return sult(0); return tedTask; } private bool IsOwner(ClaimsPrincipal user, object resource) { // Code omitted for brevity return true; } private bool IsSponsor(ClaimsPrincipal user, object resource) { // Code omitted for brevity return true; }四、策略授权提供程序IAuthorizationPolicyProvider

通常,在使⽤ 基于策略的授权时,通过调⽤

icy 作为授权服务配置的⼀部分来注册策略。 在某些情况下,可能⽆法(或理想的) 以这种⽅式注册所有的授权策略。 在这些情况下,可以使⽤⾃定义

IAuthorizationPolicyProvider 来控制如何提供授权策略internal class MinimumAgePolicyProvider : IAuthorizationPolicyProvider{ const string POLICY_PREFIX = "MinimumAge"; // Policies are looked up by string name, so expect 'parameters' (like age) // to be embedded in the policy names. This is abstracted away from developers // by the more strongly-typed attributes derived from AuthorizeAttribute // (like [MinimumAgeAuthorize()] in this sample) public Task GetPolicyAsync(string policyName) { if (With(POLICY_PREFIX, lIgnoreCase) && se(ing(POLICY_), out var age)) { var policy = new AuthorizationPolicyBuilder(ticationScheme); uirements(new MinimumAgeRequirement(age)); return sult(()); } return sult(null); }}

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687249363a6.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信