当前位置: 首页 > news >正文

医院网站开发兼职广告设计培训班课程

医院网站开发兼职,广告设计培训班课程,黄骅港旅游景点,广东专业网站定制一、前言在涉及到后端项目的开发中#xff0c;如何实现对于用户权限的管控是需要我们首先考虑的#xff0c;在实际开发过程中#xff0c;我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能#xff0c;而在 Grapefruit.VuCore 这个项目中#xff0c;我将使用 Jwt … 一、前言  在涉及到后端项目的开发中如何实现对于用户权限的管控是需要我们首先考虑的在实际开发过程中我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能而在 Grapefruit.VuCore 这个项目中我将使用 Jwt 的方式实现对于用户的权限管控在本章中我将演示如何使用 Jwt 实现对于用户的授权、鉴权。  系列目录地址ASP.NET Core 项目实战  仓储地址https://github.com/Lanesra712/Grapefruit.VuCore 二、Step by Step  1、一些概念  Jwt(json web token)是一种基于 Json 的无状态授权令牌因为 Jwt 是一种标准的数据传输规范并不是某家所独有的技术规范因此非常适用于构建单点登录服务为 web、client、app 等等各种接口使用方提供授权服务。  在使用 Jwt 进行权限控制的过程中我们需要先请求授权服务器获取到 token 令牌将令牌存储到客户端本地在 web 项目中我们可以将 token 存储到 localstorage 或是 cookie 中之后对于服务端的每一次请求都需要将获取到的 token 信息添加到 http 请求的 header 中。$.ajax({url: url,method: POST,data: JSON.stringify(data),beforeSend: function (xhr) {        /* Authorization header */xhr.setRequestHeader(Authorization, Bearer token);},success: function (data) {} });  当用户拥有令牌后是否就可以访问系统的所有功能了呢答案当然否定的。对于一个系统来说可能会有多种用户角色每一个用户角色可以访问的资源也是不同的所以当用户已经拥有令牌后我们还需要对用户角色进行鉴定从而做到对用户进行进一步的权限控制。  在 Grapefruit.VuCore 这个项目中我采用的是基于策略的授权方式通过定义一个授权策略来完善 Jwt 鉴权之后将这个自定义策略注入到 IServiceCollection 容器中对权限控制做进一步的完善从而达到对于用户访问权限的管控。  基于策略的授权是微软在 ASP.NET Core 中添加的一种新的授权方式通过定义好策略policy的一个或多个要求requirements将这个自定义的授权策略在 Startup.ConfigureServices 方法中作为授权服务配置的一部分进行注册之后即可按照我们的策略处理程序进行权限的控制。就像我在后面的代码中一样我定义了一个名叫 Permission 的授权策略它包含了一个叫做 PolicyRequirement 的鉴权要求在实现了授权策略后将基于这个要求的鉴权方法 PolicyHandler 以单例AddSingleton的形式注入到服务集合中此时我们就可以在需要添加验证的 controller 上添加 attribute 即可。[Authorize(Policy Permission)]public class SecretController : ControllerBase {}  2、授权  在 Grapefruit.VuCore 这个项目中涉及到授权相关的代码所在的位置我已在下图中进行标示。在之前系列开篇文章ASP.NET Core 实战使用 ASP.NET Core Web API 和 Vue.js搭建前后端分离框架进行介绍整个项目框架时曾说到 Grapefruit.Application 是项目的应用层顾名思义就是为了实现我们项目中的实际业务功能所划分的类库。因此我们实现 Jwt 的相关业务代码应该位于此层中。同时因为对于 Jwt 的令牌颁发与鉴权采用的是微软的 JwtBearer 组件所以我们在使用前需要先通过 Nuget 将引用添加到 Grapefruit.Application 上。Install-Package Microsoft.AspNetCore.Authentication.JwtBearer Install-Package System.IdentityModel.Tokens.Jwt  在 Grapefruit.Application 这个类库下我创建了一个  Authorization 解决方案文件夹用来存储授权相关的代码。在 Authorization 这个解决方案文件夹中包含了两个子文件夹 Jwt 和 Secret。Jwt 文件夹中主要包含我们对于 Jwt 的操作而 Secret 文件夹下则是对于用户的相关操作。  每个子应用文件夹Jwt、Secret都包含了相同的结构Dto 数据传输对象、功能接口以及功能接口的实现类这里接口的继承采用单继承的方式。  在 Jwt 文件夹下创建一个 IJwtAppService 接口文件在这里定义我们对于 Jwt 的相关操作。因为对于 Jwt 的授权、鉴权是采用微软的 JwtBearer 组件我们只需要进行配置即可所以这里只定义对于 token 的生成、刷新、停用以及判断这个 token 是否有效这几个方法。同时我们需要创建 JwtAppService 这个类文件去继承 IJwtAppService 从而实现接口功能。  JwtAuthorizationDto 是一个 token 信息的传输对象包含我们创建好的 token 相关信息用来将 token 信息返回给前台进行使用。而 UserDto 则是用户登录获取 token 时的数据传输对象用来接收登录时的参数值。  在创建 token 或是验证 token 时像 token 的颁发者、接收者之类的信息因为会存在多个地方调用的可能性这里我将这些信息存放在了配置文件中后面当我们需要使用的时候只需要通过注入 IConfiguration 进行获取即可。关于 Jwt 的配置文件主要包含了四项token 的颁发者token 的接收者加密 token 的 key 值以及 token 的过期时间你可以根据你自己的需求进行调整。Jwt: {    Issuer: yuiter.com,    Audience: yuiter.com,    SecurityKey: a48fafeefd334237c2ca207e842afe0b,    ExpireMinutes: 20}  在 token 的创建过程中可以简单拆分为三个部分根据配置信息和用户信息创建一个 token将加密后的用户信息写入到 HttpContext 上下文中以及将创建好的 token 信息添加到静态的 HashSetJwtAuthorizationDto 集合中。  在 token 创建、校验的整个生命周期中都涉及到了  Scheme、Claim、ClaimsIdentity、ClaimsPrincipal 这些概念如果你之前有使用过微软的 Identity 权限验证对于这几个名词就会比较熟悉可能某些小伙伴之前并没有使用过 Identity我来简单介绍下这几个名词的含义。  Scheme 模式这个与其余的名词相对独立它主要是指明我们是以什么授权方式进行授权的。例如你是以 cookie 的方式授权或是以 OpenId 的方式授权或是像这里我们使用 Jwt Bearer 的方式进行授权。  Claim 声明以我们的现实生活为例我们每个人都会有身份证上面会包含我们的姓名、性别、民族、出生日期、家庭住址、身份证号每一项数据的都可以看成是 type-value数据类型-数据值例如姓名张三。身份证上的每一项的信息就是我们的 Claim 声明姓名张三是一个 Claim性别男也是一个 Claim。而对于 ClaimsIdentity就像这一项项的信息最终组成了我们的身份证这一项项的 Claim 最终组成了我们的 ClaimsIdentity。而 ClaimsPrincipal 则是 ClaimsIdentity 的持有者就像我们拥有身份证一样。  从上面的文字可以总结出Claim每一项的证件信息》ClaimsIdentity证件》ClaimsPrincipal证件持有者。其中一个 ClaimsIdentity 可以包含多个的 Claim而一个 ClaimsPrincipal 可以包含多个的 ClaimsIdentity。   如果想要深入了解 ASP.NET Core 的授权策略的可以看看园子里这篇文章 》ASP.NET Core 运行原理解剖[5]:Authentication或是国外的这篇介绍 ASP.NET Core 授权的文章 》Introduction to Authentication with ASP.NET Core。  实现 token 生成的最终代码实现如下所示可以看到在创建 ClaimsIdentity “证件”信息时我添加了用户的角色信息并把加密后的用户信息写入到 HttpContext 上下文中这样我们在后面验证的时候就可以通过 HttpContext 获取到用户的角色信息从而判断用户是否可以访问当前请求的地址。  当创建好 token 之后客户端就可以在 Http 请求的 header 中添加 token 信息从而访问受保护的资源。不过在某些情况下比如说用户修改了密码之后虽然当前的 token 信息可能还未过期但我们也不能允许用户再使用当前的 token 信息进行接口的访问这时就涉及到了对于 token 信息的停用以及刷新。  这里我采用是当我们停用 token 信息时将停用的 token 信息添加到 Redis 缓存中之后在用户请求时判断这个 token 是不是存在于 Redis 中即可。  当然你也可以在停用当前用户的 token 信息时将 HashSet 中的这个 token 信息进行删除之后通过判断访问时的 token 信息是否在 HashSet 集合中判断 token 是否有效。  方法很多看你自己的需求了。  对于 Redis 的读写操作我是使用微软的 Redis 组件进行的你可以按照你的喜好进行修改。如果你和我一样采用这个组件你需要在 Grapefruit.Application 这个类库中通过 Nuget 添加微软的分布式缓存抽象接口 dll 的引用以及在 Grapefruit.WebApi 项目中添加微软的 Redis 实现。Install-Package Microsoft.Extensions.Caching.Abstractions ## 分布式缓存抽象接口Install-Package Microsoft.Extensions.Caching.Redis## Redis 实现  当我们停用 token 时通过 HttpContext 上下文获取到 HTTP Header 中的 token 信息将该 token 信息存储到 Redis 缓存中这样我们就完成了对于 token 的停用。  对于 token 的刷新其实我们就可以看成重新生成了一个 token 信息只不过我们需要将之前的 token 信息进行停用。  至此我们对于 token 的创建、刷新、停用的代码就已经完成了接下来我们来实现对于 token 信息的验证。PS下面的代码如无特殊说明外均位于 Startup 类中。  3、鉴权  在 ASP.NET Core 应用中依赖注入随处可见而我们对于我们的功能方法的使用也是采用依赖注入到容器通过功能接口进行调用的方式。因此我们需要将我们的接口与其实现类注入到 IServiceCollection 容器中。这里我们采用反射的方式批量的将程序集内的接口与其实现类进行注入。 因为基础的权限验证我们是采用的微软的 JwtBearer 权限验证组件进行的授权和鉴权因此对于 token 信息的基础鉴权操作只需要我们在中间件中进行配置即可。同时我们也在 IJwtAppService 接口中定义了对于 token 信息的一些操作而对于我们自定义的权限验证策略则需要通过基于策略的授权方式进行实现。  首先我们需要先定义一个继承于 IAuthorizationRequirement 的自定义授权要求类 PolicyRequirement。在这个类中你可以定义一些属性通过有参构造函数的方式进行构造这里我不定义任何的属性仅是创建这个类。public class PolicyRequirement : IAuthorizationRequirement { }  当我们创建好 PolicyRequirement 这个权限要求类后我们就可以通过继承 AuthorizationHandler 来实现我们的授权逻辑。这里实现权限控制的代码逻辑主要是通过重写 HandleRequirementAsync 方法来实现的。  在判断用户是否可以访问当前的请求地址时首先需要获取到用户角色与其允许访问的地址列表这里我使用的是模拟的数据。通过判断当前登录用户的角色是否包含请求的地址当用户的角色并不包含对于访问地址的权限时返回 403 Forbidden 状态码。  这里需要注意如果你准备采取 RESTful 风格的 API因为请求的地址是相同的你需要添加一个 HTTP 谓词参数用来指明所请求的方法从而达到访问权限管控的目的。。  包含 token 的基础验证的授权配置的代码如下所示。在中间件进行 Jwt 验证的过程中会验证授权方式是不是 Bearer 以及通过 token 的属性解密之后与生成时用户数据进行比对从而判断这个 token 是否有效。  因为我们是使用 Swagger 进行的 API 文档的可视化这里我们继续配置 Swagger 从而使 Swagger 可以支持我们的权限验证方式。  在停用 token 的代码中我们使用了 Redis 去保存停用的 token 信息因此我们需要配置我们的 Redis 连接。  现在整个业务相关的代码已经完成了我们可以创建前端访问的接口了。这里我是在 Controllers 下的 V1 文件夹下创建了一个 SecretController 用来构建前端访问的接口。控制器中主要有三个方法分别为 CancelAccessToken停用 token、Login获取 token以及 RefreshAccessTokenAsync刷新 token。 现在让我们测试一下从下图中可以看到当我们未获取 token 时访问接口提示我们 401 Unauthorized当我们模拟登录获取到 token 信息后再次访问受保护的资源时已经可以获取到响应的数据。之后当我们刷新 token此时再用原来的 token 信息访问时已经无法访问提示 403 Forbidden同时可以看到我们的 Redis 中已经存在了停用的 token 信息此时使用新的 token 信息又可以访问了。  至此整个的 Jwt 授权鉴权相关的代码就已经完成了因为篇幅原因完整的代码请到 Github 上进行查看电梯直达。PS因为博客园允许上传的图片限制最大尺寸为 10M所以这里上传的 gif 是压缩后的见谅见谅如果有需要查看清晰的图片欢迎到我的个人博客上查看电梯直达。、总结   本章主要是使用 Jwt 完成对于用户的授权与鉴权实现了对于用户 token 令牌的创建、刷新、停用以及校验。在实际的开发中采用成熟的轮子可能是更好的方案如果你有针对 Jwt 进行用户授权、鉴权更好的解决方案的话欢迎你在评论区留言指出。拖了很久应该是年前的最后一篇了提前祝大家新年快乐哈~~~原文地址: https://www.cnblogs.com/danvic712/p/10331976.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.yutouwan.com/news/391076/

相关文章:

  • 济南做企业网站的公司欧洲大型服务器
  • 可以做商品砍价的网站wordpress模板替换
  • 安微省建设厅田网站合肥专业做网站的公司哪家好
  • 做网站推广用自己维护吗网页毕业设计说明书
  • 做柜子好的设计网站网店关键词怎么优化
  • 站内推广的主要目的是iis 网站访问权限设置
  • 网站开发大公司需要资格证吗做网投网站
  • 网站营销的重要价值专业做运动服装的网站
  • 网站正在建设中的英文亚马逊平台官网
  • 房地产网站建设哪家有效果你了解网站建设吗 软文案例
  • 领券的网站怎么建设永城网站建设
  • 手机网站来几个建设公司哪家好
  • 提高审美网站网站设计公司哪家好如何选择呀
  • 克隆网站后怎么做商超软件系统哪家好
  • 网站设计师证书佛山高端画册设计公司
  • 网站推广技巧和方法网站怎么设置二级域名
  • 专业做h5网站企业办公系统oa哪个好
  • 企业网站成品源码服务器放n个网站
  • 网站如何做404html5 网站开发 适配
  • 加强网站的建设工作的通知山东站群网站建设
  • 做qq空间动态皮肤网站深圳高端企业官方网站建设
  • 江门企业自助建站系统模仿网站建设
  • 北京网站建设公司华网制作作汽车销售管理系统
  • asp.net做电商网站页面设计丁香花在线视频观看免费
  • 生物商城网站建设怎么做淘宝联盟的推广网站
  • 网站整体框架网站数据统计工具
  • 极速建站系统开发本地生活服务平台app
  • 企业为什么要做建站免费的网站开发软件
  • 洛阳网站推广怎么做美妆网站开发背景
  • 字体设计灵感网站佛山移动网站设计公司