简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析

解决的问题

  • 在不将密码透露给第三方的基础上,授权给第三方访问服务器资源

认证流程

  1. 得到授权码 code
  2. 获取 access token
  3. 通过 access token,获取 OpenID
  4. 通过 access token 及 OpenID 调用 API,获取用户授权信息

  • 第一步得到授权码 code,这个可以看做一个获取资源的请求,该请求需要登录(输入密码,或者 qq 登录等)。登陆过程就是用户自己在授权服务器登陆的,不用第三方拿密码自己登陆授权服务器。登录授权服务器之后,返回 code,完成第一步。到这里用户的登录动作就完成了
  • 第二步第三方应用根据 code 请求 token,再到几步后面获取其它资源,刷新 token 等
  • 中间根据授权类型,授权范围做相应处理,整个协议大概就可以这样子理解,实际的登录过程由用户在授权服务器登录,所以输入密码过程要认准域名,防止伪造的网站,泄露了密码

.net 实现

  • IdentityServer是一个免费的开源 OpenID Connect 和 OAuth 2.0 框架,适用于 ASP .NET Core。IdentityServer4 由 Dominick Baier 和 Brock Allen 创建和维护,整合了在应用程序中集成基于令牌的身份验证,单点登录和 API 访问控制所需的所有协议实现和可扩展性点。IdentityServer4 由 OpenID Foundation 正式认证,因此符合规范且可互操作
  • 这是 ASP .NET Core 中用的较多的框架,可参考 demo 快速体验
  • []https://github.com/raochunjiang/IdentityServer4.Docs.zh-Hans

自定义 IdentityServer

  • 仿照 IdentityServer4 源码造一个 IdentityServer

结构及流程

  1. 主要看中间件IdentityServerMiddleware,所有的端点走的都是这么个流程,所以关键点在于endpoint,不用的 url 请求对应不同的endpoint
                var endpoint = router.Find(context);
if (endpoint != null)
{
_logger.LogInformation("Invoking IdentityServer endpoint: {endpointType} for {url}", endpoint.GetType().FullName, context.Request.Path.ToString()); var result = await endpoint.ProcessAsync(context); if (result != null)
{
_logger.LogTrace("Invoking result: {type}", result.GetType().FullName);
await result.ExecuteAsync(context);
} return;
}

首先是根据 context 查找匹配的端点,然后调用端点的ProcessAsync方法,得到结果result,然后执行方法ExecuteAsync得到结果

  1. 所有的授权相关请求,都对应一个 endpoint,每个 endpoint,基本都有一个 Validator,用于验证。比如验证客户端参数是否合法,请求信息时验证是否登陆等等。_validator 是 IAuthorizeRequestValidator 接口的实例,用于验证,可通过 DI 注入自己的验证
        // ProcessAsync方法
public override async Task<IEndpointResult> ProcessAsync(HttpContext context)
{
// 省略部分代码 var user = await UserSession.GetUserAsync();
var result = await ProcessAuthorizeRequestAsync(values, user, null); // 省略部分代码 return result;
} // ProcessAuthorizeRequestAsync方法
internal async Task<IEndpointResult> ProcessAuthorizeRequestAsync(NameValueCollection parameters, ClaimsPrincipal user, ConsentResponse consent)
{
// 省略部分代码 // validate request
var result = await _validator.ValidateAsync(parameters, user); // 省略部分代码
return new AuthorizeResult(response);
}

如果我们要自定义某个授权过程中的请求,可以继承 IEndpointHandler 实现自己的 endpoint,并自定义路径

    // 首先实现IEndpointHandler接口
public class CustomAuthorizeEndpoint : IEndpointHandler
{
public Task<IEndpointResult> ProcessAsync(HttpContext context)
{
throw new NotImplementedException();
}
} // 然后在Startup.cs的ConfigureServices方法注入
services.AddTransient<CustomAuthorizeEndpoint>();
services.AddSingleton(new Endpoint("Authorize", "/customUrl/authorize", typeof(CustomAuthorizeEndpoint)));
  1. 其他方面同理,实现相关接口,注入,即可实现自定义,以下列出一些接口及功能说明:
  • IClientStore,客户端存储,可自定义实现从数据库存取客户端数据
  • IEndpointHandler,Endpoint 端点,根据 url 匹配 Endpoint,处理并响应请求
  • IAuthorizeRequestValidator,授权请求验证,可校验客户端参数、类型是否跟已注册客户端一致

总结

  • 入门过程不能太急躁,首先过一下相关概念,然后跑一下具体的例子,仔细感受例子,尽量跟相关概念对上号,慢慢对上所有概念,这时候就会对相关概念进一步加深理解。
  • 接下来就可以自己 Diy 一下功能,根据自己的需求做小小的改动。这个步骤相当于学会了之后用在项目里,虽然还没达到了如指掌的程度,但是出了问题能快速定位问题,不会一头雾水,这是之前体验例子对概念的好处。如果还没用上项目,可以吧 Diy 的方式方法记录下来备用,如果直接用上了,也可以记录下来,举一反三
  • 假如这是个比较重要,常用的功能,但是又比较复杂,难理解,那么走完上述两步之后,建议自己实现个精简版。这样有利于整体把握概念,扫清所有盲点,只有自己能实现了,才算是真正掌握,以后多次用到,出了问题也能轻松定位解决,这个收益绝对很赚
  • 以上就是一点学习总结,不能掉进心浮气躁的陷阱,这将一无所获且浪费时间!

简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析的更多相关文章

  1. abp vnext2.0核心组件之领域实体组件源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备, ...

  2. 04、NetCore2.0下Web应用之Startup源码解析

    04.NetCore2.0Web应用之Startup源码解析   通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...

  3. [转发] 理解 oauth 2.0

    原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...

  4. 理解 OAuth 2.0

    理解OAuth 2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 一.简介 OAuth是一个关于授权(authorization)的开 ...

  5. 理解OAuth 2.0 - 阮一峰的网络日志

    原文:理解OAuth 2.0 - 阮一峰的网络日志 理解OAuth 2.0 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于授权(authorization)的开放网络标准,在全世界 ...

  6. EventBus (三) 源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  7. Android EventBus源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  8. OpenJDK1.8.0 源码解析————HashMap的实现(一)

    HashMap是Java Collection Framework 的重要成员之一.HashMap是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,映射是以键值对的形式映射:key-v ...

  9. Retrofit2.0源码解析

    欢迎访问我的个人博客 ,原文链接:http://wensibo.net/2017/09/05/retrofit/ ,未经允许不得转载! 今天是九月的第四天了,学校也正式开学,趁着大学最后一年的这大好时 ...

随机推荐

  1. Spring Environment(二)源码分析

    Spring Environment(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Envi ...

  2. AX_Args

    Args args; FormRun formRun; ; args = new Args(); args.name(formstr(FormName)); args.caller(); args.r ...

  3. Nodejs+Mongo+WebAPI

    Nodejs+Mongo+WebAPI集成 1.[ 目录]: |- models/bear.js |- node_modules/ |- express |- mongoose |- body-par ...

  4. 使用EventLog Analyzer监控、管理及分析日志

  5. Ubuntu显示实时网速CPU内存等参数

    添加库 sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor 更新软件列表 sudo apt-get update 安装indica ...

  6. 7个鲜为人知却超实用的PHP函数--转(柒捌玖零)

    PHP有许多内置函数,其中大多数函数都被程序员广泛使用.但也有一些函数隐藏在角落,本文将向大家介绍7个鲜为人知,但用处非常大的函数. 没用过的程序员不妨过来看看. 1.highlight_string ...

  7. ASP项目部署IIS7.5中遇到的问题

    我们大家都熟悉了tomcat服务器的部署,如果是一个ASP项目如何部署呢.这也是我在客户现场遇到的问题.ASP项目一般是用的系统组件IIS来部署项目.下面我讲一下自己在部署过程中遇到的问题. 如果在网 ...

  8. tomat修改启动路径

    https://blog.csdn.net/axela30w/article/details/76546735

  9. TCP/IP协议(2):各层网络设备

    一.中继器(Repeater) 中继器工作在OSI的一层物理层,我们知道,超5类线的传输距离最大为100米,超过这个距离信号就会衰减,中继器就是为了防止信号变差,将网络信号进行再生和重定时. 二.集线 ...

  10. Java编程从头开始---老妪能解

    思想导向: 今天想要分享的是最基础的东西就是如何写一个简单的代码,很多人都是小白,需要的其实并不是很高端的理论,框架和思维模式啊,设计方法啊,这些对于一个新人来说实在是好高骛远,说的那么高端,结果要学 ...