淮安做网站.哪家网络公司好,网站建设所需的硬件设备,深圳高端女装品牌,国外好的室内设计网站前言API裸奔是绝对不允许滴#xff0c;之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险)#xff1b;那如果是微服务#xff0c;又怎么解决呢#xff1f;每一个服务都加认证授权也可以解决问题#xff0c;只是显得认证授权这块冗余#xff0c;重复在搞事情之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险)那如果是微服务又怎么解决呢每一个服务都加认证授权也可以解决问题只是显得认证授权这块冗余重复在搞事情IT大佬肯定容忍不了对于微服务架构统一的认证授权中心那是必须的。随着.NetCore的发布IdentityServer4随之而出是.Net Foundation的成员之一专门针对.NetCore而出的认证授权框架当前.Net圈是比较火的啦再配上微服务认证授权的必要性我决定以此开始入手进行微服务架构学习分享主要的学习分享思路为敲代码为向导如果遇到相关理论概念结合代码案例进行解释不在单独针对理论知识整理相关文章(主要是担心归纳总结不好让小伙伴疑惑所以就想着结合应用案例解释比较容易理解)。正文IdentityServer4 主要的功能就是认证和授权其他功能这里先假装不知道主要目的就是想用其统一保护各个微服务的接口先来理解一下认证和授权授权(Authorization)在用户身份认证通过之后授予用户访问资源的过程或是用户授予第三系统访问自己资源的过程资源可能是个人信息、文件、数据、接口等OAuth2是现在比较火的授权标准对于授权流程后续会举例说明在公司假如小伙伴是领导在出差或休假的时候通常会通过口头、邮件、信息等方式将一些工作临时委托给某人处理比如签字、参会等这个过程叫做授权如果没有授权签字无效也不能随意参会认证(Authentication)用户身份认证可以将其理解为登录系统验证身份凭据是否合法比如用户名/密码、人脸识别等方式OpenId Connect是目前比较流行的身份认证标准协议OpenID是一个去中心化的网上身份认证系统OpenID Connect是在OAuth2基础进行扩展增加身份认证和相关身份标识信息稍微有点规模的公司通常都有自己的办公楼有专门的保安人员管控非公司人员的进入 如果是公司人员刷卡识别即可进入如果是非公司人员需要登记个人信息确认才能进入这个过程可以理解为身份认证只有验证信息之后才能进入公司。IdentityServer4 已经将OpenID Connect和OAuth 2.0封装实现开发者开箱即用无需再重新自己实现细节但如果有需要小伙伴可以在IdentitySever4基础进行扩展个性化需求在授权过程中根据应用场景不同有四种授权模式可以选择如下Authorization Code(授权码)最完整的授权模式也是相对比较安全的模式适用于有后台的应用程序如MVC项目Implicit(简化模式)简化授权码模式适用于无后台的应用程序如前后端分离项目Resource Owner Password Credentials(资源所有者密码)直接通过用户名和密码获得授权这种适用于高度信任的应用因为需要输入用户名和密码安全泄露风险高**Client Credentials(客户端模式) **这是无用户操作模式适用于机器对机器的对接没有用户干预的应用如后台任务调度应用采集数据应用等混合模式以上四种的组合。其他理论先不说了我们边撸码边聊这样记忆深刻一点这里就从最简单的Client Credentials开始Client Credentials 客户端授权模式客户端模式没有用户就只是单纯的机器对机器的交互大概的流程如下流程简要说明首先客户端带上凭据向授权服务器获取AccessToken这里的客户端凭据是提前在授权服务器上备案过的授权服务器验证客户端凭据成功之后直接返回AccessToken客户端在带上AccessToken访问资源服务器资源服务器正常返回结果如果没有AccessToken是不能访问受保护资源的来结合流程看看代码怎么实现一步一步来先创建API项目---资源服务器创建一个OrderController并在里面新增一个Orders 接口接口没有进行保护接口没有进行保护可以任意访问如下再创建认证授权中心项目---授权服务器将资源服务保护起来以上的API接口裸奔是有风险的现在需要统一的认证授权中心进行保护如下新创建一个API项目并引入IdentityServer4包并在内存中模拟相关数据方便测试术语解释ApiScope就是一个作用域范围生成的Token只能访问指定范围的资源Client这里的客户端就是应用比如MVC项目、纯前端项目、Winfrom/WPF、APP等必须首先在授权服务器中进行备案并获得授权服务器分配的标识和密码后续用于获取AccessToken模拟数据准备好了就在Startup中进行对应的注入和配置并开启中间件如下这样就初步完成授权服务器的搭建这里监听的端口改为6100了用Postman先来测测是否能正常获取Token如下可能有新手小伙伴会问咋知道是这个地址能获取token的小伙伴可以在浏览器中输入以下链接即可看见授权服务器的相关信息(授权服务器地址/.well-known/openid-configuration)授权服务器已经好了准备将资源服务器接入到授权服务器对API接口进行保护(ApiDemo项目中)如下注ApiDemo项目中需要Microsoft.AspNetCore.Authentication.JwtBearer包因为项目是基于.NetCore3.1的所以这里引用的包版本为3.1.10。然后在接口上面加上[Authorize]特性将接口保护起来看运行效果如下在Postman中测试先获取AccessToken然后将获取的AccessToken加入到Header中请求资源服务器中受保护的API如下真实客户端访问受保护API---控制台建一个控制台项目具体步骤如图这里就不用文字说明步骤小伙伴一边看代码一边看注释这样应该比较清晰点static async Task Main(string[] args)
{// 1. 创建一个HttpClient用于请求var client new HttpClient();// 2. 获取授权服务器的相关信息IdentityModel已经将其封装好了var disco await client.GetDiscoveryDocumentAsync(http://localhost:6100);// 3. 检查是否请求错误if (disco.IsError){// 错误就打印错误信息然后直接返回Console.WriteLine(disco.Error);return;}// 4. 通过授权服务分配的标识向授权服务器请求AccessTokenvar tokenResp await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest{// 指定获取token的地址IdentityModel进行封装直接使用即可Address disco.TokenEndpoint,// 指定授权服务器分配的客户端标识ClientId client,// 指定授权服务器分的客户端密码ClientSecret ordersecret});// 5. 检查获取Token是否成功if (tokenResp.IsError){// 如果失败打印错误消息并返回Console.WriteLine(tokenResp.Error);return;}// 6. 创建一个请求API资源的HttpClientvar apiClient new HttpClient();// 7. 将获取到的Token以Bearer的方案设置在请求头中apiClient.SetBearerToken(tokenResp.AccessToken);// 8. 向资源服务器中请求受保护的APIvar contentResp await apiClient.GetAsync(http://localhost:5000/api/Order);// 9. 打印对应的消息if (contentResp.IsSuccessStatusCode){var content await contentResp.Content.ReadAsStringAsync();Console.WriteLine(JArray.Parse(content));}else{Console.WriteLine(contentResp.StatusCode);}Console.ReadLine();
}
到这里离完成还差一步了什么资源不是保护了吗受保护资源也能正常访问了还差哪一步在授权服务器模拟备案客户端的时候是不是指定了访问资源的作用域也就是说备案过的客户端只能访问被授权的API资源而现在拿到的AccessToken都能访问资源服务器中所有受保护的资源那是因为资源服务器中的API资源没有限制作用域访问而在实际项目中并不是拿到AccessToken就能随便访问需要做限制继续往下看↓↓↓假如指定的scope值和客户端在授权服务器中备案时设置的不一样就算获取到AccessToken也不能正常访问资源会报403错误这里我不截图小伙伴下去试试。可能小伙伴会比较急这都是啥玩意全是硬编码垃圾文 别别别说好的学习分享嘛一步一个脚印来嘛最终肯定是小伙伴想要的也是我学习的目标关于客户端凭据生成的Token在jwt.io网站解析看看记录一下看看后面有用户参与的情况生成的Token解析出来会有什么不同呢先上个图(图中解析出来的属性之前在WebApi接口裸奔有风险有说过)总结从这篇开始后续会尽快更新学习分享小伙伴们加入一起学习一起讨论。下一篇说说Resource Owner Password Credentials.一个被程序搞丑的帅小伙关注Code综艺圈跟我一起学~