indetityserver4-implicit-grant-types-请求流程叙述-下篇
上一篇将请求流程描述一遍,这篇将描述一下相关的源码。
1 访问客户端受保护的资源
GET /Home/Secure HTTP/1.1HTTP/1.1 302 Found
Date: Tue, 23 Oct 2018 09:02:40 GMT
Location: http://127.0.0.1:5000/connect/authorize?client_id=mvc&redirect_uri=http://127.0.0.1:5002/signin-oidc&response_type=id_token&scope=openid profile&response_mode=form_post&nonce=636758。。。&state=CfD。。。ZLI0fuVlCMPs&x-client-SKU=ID_NET&x-client-ver=2.1.4.0
Secure action 代码如下:
[Authorize]
public IActionResult Secure()
{
ViewData["Message"] = "Secure page."; return View();
}
1.1 authorizationPolicy
不同点在用 Authorize 修饰了 action,中间有些曲折,最终其相当于在 ActionContext 的属性 FilterDescriptors 添加了一个 AuthorizerFilte,这个过滤器的 Policy 是 DenyAnonymousAuthorizationRequirement,就是拒绝匿名用户访问,同 [Authorize] 定义相符。

MVC 过滤器的解释及相关可以参考官方文档,个人认为主要是实践 AOP 想法。
1.2 Challenged
过滤器被执行的结果是

项目的地址在这里。dotnet core 授权和认证的原理主要是5个扩展方法,相关的代码是在 HttpAbstractions 这个项目中。
1.3 生成 redirect

MvcClient 中配置 oidc 的 options 会赋给 OpenIDConnectMessage 对象,并最终拼接中 RedirectUrl:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies"; options.Authority = "http://127.0.0.1:5000";
options.RequireHttpsMetadata = false; options.ClientId = "mvc";
options.SaveTokens = true;
});
}
1.4 OpenIDConnectOptions

这个地方就可以看到 oidc 许多默认设置,比如当 Scope 没有设置时,默认会请求“openid”和“profile”
2 重定向到:请求identity Service 授权
GET /connect/authorize?client_id=mvc&redirect_uri=http%3A%2F%2F127.0.0.1%3A5002%2Fsignin-oidc&response_type=id_tok
HTTP/1.1 302 Found
Location: http://127.0.0.1:5000/account/login?returnUrl=%2Fconnect%2Fauthorize%2Fca。。。%26x-client-ver%3D2.1.4.0
2.1 IdentityServerMiddleware
项目地址在这里
在 IdentityServer 的 Starup中
app.UseIdentityServer();
主要是将 IdentityServerMiddleware 中间件提交 app 管道中,

2.2 endpoint
个人认为 identityServer 的实现时各种 endpoint,并将 endpoint 与路径挂钩,
public static class ProtocolRoutePaths
{
public const string Authorize = "connect/authorize";
public const string AuthorizeCallback = Authorize + "/callback";
public const string DiscoveryConfiguration = ".well-known/openid-configuration";
public const string DiscoveryWebKeys = DiscoveryConfiguration + "/jwks";
public const string Token = "connect/token";
public const string Revocation = "connect/revocation";
public const string UserInfo = "connect/userinfo";
public const string Introspection = "connect/introspect";
public const string EndSession = "connect/endsession";
public const string EndSessionCallback = EndSession + "/callback";
public const string CheckSession = "connect/checksession"; public static readonly string[] CorsPaths =
{
DiscoveryConfiguration,
DiscoveryWebKeys,
Token,
UserInfo,
Revocation
};
比如请求的地址为:/connect/authorize?,它获得的就是 AuthorizeEndpoint

2.3 LoginPageResult
var result = endpoint.ProcessAsync(context);
endpoint 处理后就是 result 对象,

同 endpoint 类似, IdentityServer 实现了各种 result

而 LoginPageResult 这是讲请求 redirect 到 /account/login?,这与抓包的流程3描述一致。
而后续在 IdentityServer 中跳转流程可通过了类似方式查看源代码,就不再一一描述。
-------感觉写代码现在变成了体力活,无任何技术可言。
indetityserver4-implicit-grant-types-请求流程叙述-下篇的更多相关文章
- indetityserver4-implicit-grant-types-请求流程叙述-上篇
说明:使用项目代码是这个,做了一点体力活:将 implicit grant types(简化授权类型)的页面跳转流程抓了个包. QuickstartIdentityServer 项目的发布地址:127 ...
- OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)
授权方式2-简化模式(implicit grant type) 简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授 ...
- OAuth2.0和企业内部统一登录,token验证方式,OAuth2.0的 Authorization code grant 和 Implicit grant区别
统一登录是个很多应用系统都要考虑的问题,多个项目的话最好前期进行统一设计,否则后面改造兼容很麻烦: cas认证的方式:新公司都是老项目,用的是cas认证的方式,比较重而且依赖较多,winform的项目 ...
- 配置Postman通过OAuth 2 implicit grant获取Dynamics 365 CE Online实例的Access Token
微软动态CRM专家罗勇 ,回复335或者20190516可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 对于测试Web API, Get 类型,不需要设定特别reque ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- ASP.NET MVC学前篇之请求流程
ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...
- MVC视图请求流程视图
/* *视图请求流程 *当接受到home/index请求时 *先去找viewstart.cshtml视图,再去加载index.cshtml视图 ...
- HTTP请求流程(一)----流程简介
最近一直在研究如何让asp.net实现上传大文件的功能,所以都没怎么写技术类的文章了.可惜的是至今还没研究出来,惭愧~~~.不过因为这样,也了解了一下http消息请求的大致过程.我就先简单介绍下,然后 ...
- [转】:HTTP请求流程(一)----流程简介
http://www.cnblogs.com/stg609/archive/2008/07/06/1236966.html HTTP请求流程(一)----流程简介 最近一直在研究如何让asp.net实 ...
随机推荐
- 题目分享T
题意:蛐蛐国里现在共有n只蚯蚓(n为正整数).每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n),并保证所有的长度都是非负整数(即:可 能存在长度为0的蚯蚓).每一秒,神刀手会 ...
- 如何使用Golang实现一个API网关
你是否也存在过这样的需求,想要公开一个接口到网络上.但是还得加点权限,否则被人乱调用就不好了.这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了.一般情况下我们遇到这种需要,就是在函 ...
- Python3 迭代器与生成器 - 学习笔记
可迭代对象(Iterable) 迭代器(Iterator) 定义 迭代器和可迭代对象的区别 创建一个迭代器 创建一个迭代器类 使用内置iter()函数 StopIteration异常 生成器(gene ...
- Spring官网阅读(十)Spring中Bean的生命周期(下)
文章目录 生命周期概念补充 实例化 createBean流程分析 doCreateBean流程分析 第一步:factoryBeanInstanceCache什么时候不为空? 第二步:创建对象(crea ...
- Spring Cloud学习 之 Spring Cloud Ribbon(负载均衡器源码分析)
文章目录 AbstractLoadBalancer: BaseLoadBalancer: DynamicServerListLoadBalancer: ServerList: ServerListUp ...
- redux中间件的理解
redux的中间件就是用来处理reducer和actions之间应用,常用的中间件有redux-thunk,redux-sage.在redux中通过applyMiddleware方法使用中间件 使用例 ...
- python学习之break和continue在for循环中的使用(案例:打印出10以内的偶数,并且只要前三个偶数)
运行程序,break是整个程序都跳出 continue则表示跳过当前一次循环,然后继续执行循环
- 整型和浮点型与QByteArray的转换
目录 QByteArray 整型 QByteArray 浮点型 QByteArray QByteArray The QByteArray class provides an array of byte ...
- 带你看看Java的锁(二)-Semaphore
前言 简介 Semaphore 中文称信号量,它和ReentrantLock 有所区别,ReentrantLock是排他的,也就是只能允许一个线程拥有资源,Semaphore是共享的,它允许多个线程同 ...
- 【Spark】DataFrame关于数据常用操作
文章目录 DSL语法 概述 实例操作 SQL语法 概述 实例操作 DSL语法 概述 1.查看全表数据 -- DataFrame.show 2.查看部分字段数据(有4种方法) (1) DataFram ...