一日一技:在Ocelot网关中实现IdentityServer4密码模式(password)
概述
IdentityServer4 是为ASP.NET Core 2.系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证框架。将identityserver部署在你的应用中,具备如下的特点可以为你的应用(如网站、本地应用、移动端、服务)做集中式的登录逻辑和工作流控制。IdentityServer是完全实现了OpenID Connect协议标准。在各种类型的应用上实现单点登录登出。为各种各样的客户端颁发access token令牌,如服务与服务之间的通讯、网站应用、SPAS和本地应用或者移动应用等。
OAuth 2.0 默认四种授权模式(GrantType):
授权码模式(authorization_code)
简化模式(implicit)
密码模式(password)
客户端模式(client_credentials)
我们一般项目在api访问的时候,大部分是基于账号密码的方式进行访问接口。比如app端的用户。
下面我们来看下怎么实现密码模式(password)。
主要实现方式
1、在认证项目中,创建ProfileService
public class ProfileService : IProfileService{public async Task GetProfileDataAsync(ProfileDataRequestContext context){var claims = context.Subject.Claims.ToList();context.IssuedClaims = claims.ToList();}public async Task IsActiveAsync(IsActiveContext context){context.IsActive = true;}}
2、创建ResourceOwnerPasswordValidator,进行账号密码认证
public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator{public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context){//根据context.UserName和context.Password与数据库的数据做校验,判断是否合法if (context.UserName == "conan" && context.Password == "123"){context.Result = new GrantValidationResult(subject: context.UserName,authenticationMethod: "custom",claims: new Claim[] { new Claim("Name", context.UserName), new Claim("UserId", "111"), new Claim("RealName", "conan"), new Claim("Email", "373197550@qq.com") });}else{//验证失败context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "invalid custom credential");}}}
3、调整AllowedGrantTypes 和AllowedScopes
client.AllowedGrantTypes = GrantTypes.ResourceOwnerPassword;List<string> aas = new List<string>();aas.AddRange(config.AllowedScopes);aas.Add(IdentityServerConstants.StandardScopes.OpenId);aas.Add(IdentityServerConstants.StandardScopes.Profile);client.AllowedScopes = aas.ToArray();
4、ConfigureServices增加AddInMemoryIdentityResources、AddResourceOwnerValidator、AddProfileService
//注册服务var idResources = new List<IdentityResource>{new IdentityResources.OpenId(), //必须要添加,否则报无效的 scope 错误new IdentityResources.Profile()};var p = Configuration.GetSection("SSOConfig");services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryIdentityResources(idResources).AddInMemoryApiResources(SSOConfig.GetApiResources(p)).AddInMemoryClients(SSOConfig.GetClients(p)).AddResourceOwnerValidator<ResourceOwnerPasswordValidator>().AddProfileService<ProfileService>();services.AddControllers().SetCompatibilityVersion(CompatibilityVersion.Latest);
5、在认证项目进行验证,测试成功
6、修改地址,在网关项目进行认证,测试成功
代码地址:
https://gitee.com/conanOpenSource_admin/Example
一日一技:在Ocelot网关中实现IdentityServer4密码模式(password)相关推荐
- 一日一技:Ocelot网关使用IdentityServer4认证
概述 Ocelot是一个用.NET Core实现的开源API网关技术.IdentityServer4是一个基于OpenID Connect和OAuth2.0的针对ASP.NET Core的框架,以中间 ...
- python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理
一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...
- python文本格式上一日_一日一技:在 Python 中快速遍历文件
一日一技:在 Python 中快速遍历文件 摄影:产品经理 厨师:产品经理 当我们要在一个文件夹及其子文件夹里面寻找特定类型的文件,我们可能会这样写代码: 没有子文件夹时 import os all_ ...
- python延时执行函数_一日一技:在 Python 中实现延迟调用
一日一技:在 Python 中实现延迟调用 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理的生日餐 熟悉 Golang 的同学都知道,Golang 里面有一个关键词叫做def ...
- 一日一技:在Ocelot网关中统一配置Swagger
概述 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.在Ocelot网关中,我们提供给前端的直接是Swagger,如果Swagger分布在各 ...
- 制打印如下所示的n行数字金字塔_一日一技:在Python中实现阿拉伯数字加上中文数字...
在Python 3里面,中文是可以作为变量名的,而运算符又可以重载,基于这两个特性,我们可以实现阿拉伯数字与中文数字的四则运算. 首先我们定义一个类 Num: class Num(object): d ...
- 一日一技:ASP.NET Core Api网关Ocelot初探
概述 Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员,这些体系结构需要在系统中具有统一的入口点.特别是我想与IdentityServer参考和承载令牌轻松集成.Ocelot是按特定 ...
- mongo 改字段名_一日一技:修改MongoDB集合中的字段名
一日一技:修改MongoDB集合中的字段名 一日一技是一个每天更新的栏目,旨在使用3分钟的时间让你每天都有新的进步. 在我们使用MongoDB的过程中,经常会出现修改数据的情况.我们一般使用 upda ...
- 怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...
来源 | 迅捷PDF转换器 (ID:xjpdf6)作者丨小小迅 「一日一技」是每天的知识分享专栏,一是分享一些PDF.Office.办公小技巧:二是抽取小可爱们在留言中的疑问并解决.希望对大家有所帮助 ...
最新文章
- Smark.Data 值转换器
- 从源码分析DEARGUI之交互添加和删除组件
- Bootstrap全局css样式_辅助类
- ORACLE SQL Developer日期显示格式设置
- 让Dapper支持读写分离
- go连接mysql数据库
- 软件工程 工具之二—— PowerDesigner v12(六)
- 在阿里淘系6个月能有哪些收获成长?
- 190906描述笔记
- 修改代理_IP代理修改上网IP地址的作用
- 设计模式(二)--里氏替换原则(Java的继承规范)
- python读行-Python如何一次读取N行
- try...catch...finally的陷阱——加锁的线程开发经验分享
- Java列表removeAll(Collection)示例
- 机器学习实战(一)xgboost实战
- TAS与CAS-用于锁的指令支持
- Maven项目依赖管理 学习笔记
- FileSystemWatcher的Created事件问题
- 如何在Ubuntu上安装并使用Docker
- 聚类评估算法-轮廓系数(Silhouette Coefficient )