wordpress 页面路径,重庆seo搜索引擎优化平台,自己可以制作图的app免费的,建立门户网站的意义1.前言回顾#xff1a;认证授权方案之JwtBearer认证在上一篇中#xff0c;我们通过JwtBearer的方式认证#xff0c;了解在认证时#xff0c;都是基于Claim的#xff0c;因此我们可以通过用户令牌获取到用户的Claims#xff0c;在授权过程中对这些Claims进行验证#xff… 1.前言回顾认证授权方案之JwtBearer认证 在上一篇中我们通过JwtBearer的方式认证了解在认证时都是基于Claim的因此我们可以通过用户令牌获取到用户的Claims在授权过程中对这些Claims进行验证从而来判断是否具有获取或执行目标资源操作的权限。本章就来介绍一下 ASP.NET Core 的授权系统的简单使用。2.说明授权与身份认证是相互独立但是授权却需要一种身份验证机制因此身份验证可以为当前用户创建一个或多个标识是确定用户真实身份的过程。而授权是根据标识确定用户可执行的操作的过程其本质就是具有某种特性的用户会有权限访问某个资源或者执行某个操作。例如一个拥有管理员身份的用户有创建人员、删除人员、编辑人员和删除人员的操作权限而一个非管理身份的用户仅有读取自己信息的权限。这时候你可能会问究竟怎样特性的用户可以被授权访问某个资源或执行某个操作。由此我们引出了授权策略的方式可以根据用户拥有的角色也可以根据用户的职位部门甚至是性别年龄等等特性进行授权。通过建立授权策略方式检验认证的用户所携带的身份声明ClaimsPrincipal对象与授权策略是否一致从而确定用户可否执行操作。3.授权3.1. 基于角色3.1.1 添加角色将角色赋予某个控制器或控制器内的操作指定当前用户必须是其角色才能访问请求资源。可以使用Authorize属性的Roles特性指定所请求资源的角色。例如分配了“admin”角色用户进行访问操作[Authorize(Roles admin)]
public class WeatherForecastController : ControllerBase
{}以逗号分隔角色名来允行多个角色访问操作[Authorize(Roles admin,user)]
public class WeatherForecastController : ControllerBase
{}其中只要满足admmin或者user其一就可以进行访问。同时满足指定的多个角色进行的访问操作[Authorize(Roles admin)]
[Authorize(Roles user)]
public class WeatherForecastController : ControllerBase
{
}3.1.2 添加策略的角色可以创建策略的方式进行访问控制在配置授权服务中添加注册授权服务策略。在Startup.cs文件中通过ConfigureServices()配置服务,创建一个允许具有admin角色的用户才能进行访问的策略 public void ConfigureServices(IServiceCollection services){services.AddControllers();//添加授权角色策略services.AddAuthorization(options {options.AddPolicy(BaseRole, options options.RequireRole(admin));});//或者指定多个允许的角色//services.AddAuthorization(options // {// options.AddPolicy(MoreBaseRole, options options.RequireRole(admin,user));// });}在控制器方法使用特性Policy的属性进行策略应用 [Authorize(Policy BaseRole)]public class WeatherForecastController : ControllerBase{}3.2. 基于声明3.2.1添加声明对当前用户必须拥有的声明并将声明赋予某个控制器或控制器内的操作因此指定声明必须持有对应的值才能访问请求资源。声明要求基于策略所以必须进行构建一个表示声明要求的策略才能进行授权。最简单的类型声明是将判断声明是否存在而不检查值。可以创建策略的方式进行访问控制在配置授权服务中添加注册授权服务策略。在Startup.cs文件中通过ConfigureServices()配置服务,创建一个允许具有声明的用户才能进行访问的策略 public void ConfigureServices(IServiceCollection services){services.AddControllers();//添加基于声明的授权services.AddAuthorization(options {options.AddPolicy(BaseClaims, options options.RequireClaim(name));});}BaseClaims声明策略会检查name当前标识是否存在声明。在控制器方法使用特性Policy的属性进行策略应用 [Authorize(Policy BaseClaims)]public class WeatherForecastController : ControllerBase{}但是大多时候我们需要声明包含值只有指定允许值的列表才能授权成功。所以可以添加指定值。 public void ConfigureServices(IServiceCollection services){services.AddControllers();//添加基于声明的授权,指定允许值列表。services.AddAuthorization(options {options.AddPolicy(BaseClaims, options options.RequireClaim(name,i3yuan));});}3.3 基于策略上面介绍的基于角色和基于声明的授权都使用了要求、要求处理程序和预配置的策略。这些在构建上提供了便捷但是最终都是生成授权策略。ASP.NET Core设计了另一种灵活的授权方式一种更丰富的可重复使用的授权结构基于策略的授权同时这也是授权的核心。这节会先讲一下授权策略的应用在下一节中会对授权策略的核心进行一步步的详解。在上面我们简单的介绍了基于策略的角色授权但是这种方式无非基于角色或者声明多一些。因此这里我们基于自定义策略授权的方式实现授权。自定义授权就要我们自己写策略提供器自己根据不同的参数来生成不同的策略重新实现策略的方式。策略要求由以下两种元素组成仅保留数据的要求类以及对用户验证数据的授权处理程序。创建自定义要求还可以进一步表达特定策略。3.3.1. 定义权限策略PermissionRequirement定义一个权限策略这个策略并包含一些属性。public class PermissionRequirement: IAuthorizationRequirement
{public string _permissionName { get; }public PermissionRequirement(string PermissionName){_permissionName PermissionName;}
}3.3.2. 再定义一个策略处理类public class PermissionRequirementHandler : AuthorizationHandlerPermissionRequirement
{protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){var role context.User.FindFirst(c c.Type ClaimTypes.Role);if (role ! null){var roleValue role.Value;if (roleValuerequirement._permissionName){context.Succeed(requirement);}}return Task.CompletedTask;授权处理程序读取与角色用户关联的声明并检查自定义的角色如果角色匹则成功否则无法返回成功。这里的自定义声明是写固定了但是也可以通过数据库或外部服务的方式进行运行查询获取用户相关角色信息相对应的判断条件从而在处理程序中进行判断处理。授权处理程序调用方法 Succeed同时传递当前要求以通知此要求已成功得到验证。如果没有传递要求处理程序无需执行任何操作可以直接返回内容。不过如果处理程序要确定是否不符合要求无论其他处理程序是否已成功验证同一要求将会对授权上下文对象调用方法 Fail。3.3.3. 下面展示了如何将自定义要求添加到策略请注意由于这是自定义要求因此没有扩展方法而必须继续处理策略对象的整个 Requirements 集合 public void ConfigureServices(IServiceCollection services){services.AddControllers();//基于自定义策略授权services.AddAuthorization(options {options.AddPolicy(customizePermisson,policy policy.Requirements.Add(new PermissionRequirement(admin)));});//此外还需要在 IAuthorizationHandler 类型的范围内向 DI 系统注册新的处理程序services.AddScopedIAuthorizationHandler, PermissionRequirementHandler();// 如前所述要求可包含多个处理程序。如果为授权层的同一要求向 DI 系统注册多个处理程序有一个成功就足够了。}3.3.4. 应用自定义的策略的特性指定当前用户必须是应用对控制器或控制器内的操作如 [Authorize(Policy customizePermisson)]public class WeatherForecastController : ControllerBase{}4.场景在上一篇认证授权方案之JwtBearer认证中我们已经实现了获取token的方式这一次我们实现一个以基于角色场景为例的认证授权。在原来生成token的方式中添加多一个声明角色的Claim如下new Claim(JwtClaimTypes.Role,admin) [HttpGet]public IActionResult GetToken(){try{//定义发行人issuerstring iss JWTBearer.Auth;//定义受众人audiencestring aud api.auth;//定义许多种的声明Claim,信息存储部分,Claims的实体一般包含用户和一些元数据IEnumerableClaim claims new Claim[]{new Claim(JwtClaimTypes.Id,1),new Claim(JwtClaimTypes.Name,i3yuan),new Claim(JwtClaimTypes.Role,admin),};//notBefore 生效时间// long nbf new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds();var nbf DateTime.UtcNow;//expires //过期时间// long Exp new DateTimeOffset(DateTime.Now.AddSeconds(1000)).ToUnixTimeSeconds();var Exp DateTime.UtcNow.AddSeconds(1000);//signingCredentials 签名凭证string sign q2xiARx$4x3TKqBJ; //SecurityKey 的长度必须 大于等于 16个字符var secret Encoding.UTF8.GetBytes(sign);var key new SymmetricSecurityKey(secret);var signcreds new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//String issuer default(String), String audience default(String), IEnumerableClaim claims null, NullableDateTime notBefore default(NullableDateTime), NullableDateTime expires default(NullableDateTime), SigningCredentials signingCredentials nullvar jwt new JwtSecurityToken(issuer: iss, audience: aud, claims:claims,notBefore:nbf,expires:Exp, signingCredentials: signcreds);var JwtHander new JwtSecurityTokenHandler();var token JwtHander.WriteToken(jwt);return Ok(new{access_token token,token_type Bearer,});}catch (Exception ex){throw;}}对控制器或控制器内的操作指定当前用户必须是其角色才能访问请求资源如WeatherForecastController.cs[ApiController]
[Route([controller])]
[Authorize(Roles admin)]
public class WeatherForecastController : ControllerBase
{private static readonly string[] Summaries new[]{Freezing, Bracing, Chilly, Cool, Mild, Warm, Balmy, Hot, Sweltering, Scorching};private readonly ILoggerWeatherForecastController _logger;public WeatherForecastController(ILoggerWeatherForecastController logger){_logger logger;}[HttpGet]public IEnumerableWeatherForecast Get(){var rng new Random();return Enumerable.Range(1, 5).Select(index new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();}
}5.运行5.1. 获取token分别获取role为admin和role为user的情况下颁发的token只有在角色为admin的情况下才能授权通过。5.2. 授权资源接口访问在role为admin的情况下在role为user的情况下由上可知只有在角色为admin的情况下才能访问目标资源进行操作。6.总结从上一篇的认证到这一篇的授权阶段简单的介绍了Asp.net Core的认证授权系统对授权有了初步的认识以及使用对授权进行划分为两种一种是基于角色的授权但随着角色的增加会对处理授权产生限制不适合表达复杂的授权逻辑。另一种是基于策略的身份验证策略包含一系列基于声明的要求以及基于可从 HTTP 上下文或外部源注入的其他任何信息的自定义逻辑。这些要求各自与一个或多个处理程序相关联这些处理程序负责要求的实际计算。可以发现asp.net core提供的授权策略是一个非常强大丰富且灵活的认证授权方案能够满足大部分的授权场景。如果有不对的或不理解的地方希望大家可以多多指正提出问题一起讨论,不断学习,共同进步。因此在后续的篇章中会继续探索授权系统对授权策略的核心进行一步步的详解。本示例源码地址参考文献文档往期精彩回顾