概述

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)相关推荐

  1. 一日一技:Ocelot网关使用IdentityServer4认证

    概述 Ocelot是一个用.NET Core实现的开源API网关技术.IdentityServer4是一个基于OpenID Connect和OAuth2.0的针对ASP.NET Core的框架,以中间 ...

  2. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  3. python文本格式上一日_一日一技:在 Python 中快速遍历文件

    一日一技:在 Python 中快速遍历文件 摄影:产品经理 厨师:产品经理 当我们要在一个文件夹及其子文件夹里面寻找特定类型的文件,我们可能会这样写代码: 没有子文件夹时 import os all_ ...

  4. python延时执行函数_一日一技:在 Python 中实现延迟调用

    一日一技:在 Python 中实现延迟调用 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理的生日餐 熟悉 Golang 的同学都知道,Golang 里面有一个关键词叫做def ...

  5. 一日一技:在Ocelot网关中统一配置Swagger

    概述 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.在Ocelot网关中,我们提供给前端的直接是Swagger,如果Swagger分布在各 ...

  6. 制打印如下所示的n行数字金字塔_一日一技:在Python中实现阿拉伯数字加上中文数字...

    在Python 3里面,中文是可以作为变量名的,而运算符又可以重载,基于这两个特性,我们可以实现阿拉伯数字与中文数字的四则运算. 首先我们定义一个类 Num: class Num(object): d ...

  7. 一日一技:ASP.NET Core Api网关Ocelot初探

    概述 Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员,这些体系结构需要在系统中具有统一的入口点.特别是我想与IdentityServer参考和承载令牌轻松集成.Ocelot是按特定 ...

  8. mongo 改字段名_一日一技:修改MongoDB集合中的字段名

    一日一技:修改MongoDB集合中的字段名 一日一技是一个每天更新的栏目,旨在使用3分钟的时间让你每天都有新的进步. 在我们使用MongoDB的过程中,经常会出现修改数据的情况.我们一般使用 upda ...

  9. 怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...

    来源 | 迅捷PDF转换器 (ID:xjpdf6)作者丨小小迅 「一日一技」是每天的知识分享专栏,一是分享一些PDF.Office.办公小技巧:二是抽取小可爱们在留言中的疑问并解决.希望对大家有所帮助 ...

最新文章

  1. Smark.Data 值转换器
  2. 从源码分析DEARGUI之交互添加和删除组件
  3. Bootstrap全局css样式_辅助类
  4. ORACLE SQL Developer日期显示格式设置
  5. 让Dapper支持读写分离
  6. go连接mysql数据库
  7. 软件工程 工具之二—— PowerDesigner v12(六)
  8. 在阿里淘系6个月能有哪些收获成长?
  9. 190906描述笔记
  10. 修改代理_IP代理修改上网IP地址的作用
  11. 设计模式(二)--里氏替换原则(Java的继承规范)
  12. python读行-Python如何一次读取N行
  13. try...catch...finally的陷阱——加锁的线程开发经验分享
  14. Java列表removeAll(Collection)示例
  15. 机器学习实战(一)xgboost实战
  16. TAS与CAS-用于锁的指令支持
  17. Maven项目依赖管理 学习笔记
  18. FileSystemWatcher的Created事件问题
  19. 如何在Ubuntu上安装并使用Docker
  20. 聚类评估算法-轮廓系数(Silhouette Coefficient )

热门文章

  1. windows MySQL 5+ 服务手动安装
  2. 对eventloop的研究
  3. MyBatis缓存通俗易懂
  4. Java集合之LinkedList
  5. python 生成排列、组合以及选择
  6. 达内TTS6.0课件oop_day01
  7. 分析cocos2d-x中的CrystalCraze示例游戏
  8. HDU 1856 Brave Game(巴什博奕)
  9. Teams团队的成员列表API的已知问题
  10. 短语密码_使用密码短语以提高安全性