IdentityServer4【Topic】Consent
Conset这个概念在Identityserver4中是表示要当前用户对第三方应用对资源请求的一个确认,它会被做成一个页面。
术语映射:
Consent page--确认页面,我喜欢叫做Consent页面。
outcome of the consent/outcome--确认结果/结果
Consent
确认
在请求授权期间,如果IdentityServer 要求当前用户确认一些信息,浏览器会被重定向到Consent页面。
Consent用来让一个终端用户为一个第三方应用获取受保护的资源进行授权,这个受保护的资源可能是Identity Resource,或者是API Resource。Consent对于第三方应用来说是一个典型的应用,当然,也可以在Client中设置。
Consent Page
确认页面
如果想让用户进行授权确认,就必须提供一个Consent页面。在这里由详细的说明。
一个Consent页面通常会渲染一些名字,包括用户的名字(在Identityserver的登陆中已经获取了)、第三方应用的名字、第三方应用的logo、第三方应用的其他信息、第三方应用请求的资源列表(用Scope来表示)。此外,Consent 页面也允许用户使用“记住”这个选项来配置下次同样的客户端访问时不用继续重定向到Consent页面。
一旦用户提供了确认信息,Consent页面必须通知Identityserver,并且浏览器随后会被重定向到授权端点。
Authorization Context
授权上下文
Identityserver会传递一个returnUrl参数给Consent页面,这个参数包含了授权请求的一些参数。这些参数为Consent页面提供了上下文的信息,并且这些信息能够被IIdentityServerInteractionService 读取。GetAuthorizationContextAsync方法会返回一个AuthorizationRequest实例。
关于客户端和资源的更多的信息可以从IClientStore和IResourceStore这两个接口中获取。
Informing IdentityServer of the consent result
将确认结果通知到IdentityServer
IIdentityServerInteractionService 的GrantConsentAsync方法让Consent页面通知Identityserver,这个方法将Conset的结果传入,Consent的结果可能是用户点击了同意,或者点击了取消/拒绝。
Identityserver会临时的存储Consent的结果。默认情况下会使用Cookie来存储。因为它只需要将这个Consent的结果传递到授权端点这么点儿时间,所以用Cookie来暂时的存储就足够了。
这个临时的存储不同于用户点击了“记住”选项,后者会被持久化。如果希望在Consent页面和授权重定向之间使用其他持久性,那么可以实现IMessageStore<ConsentResponse>并在DI中注册实现
Returning the user to the authorization endpoint
将用户返回到授权端点
一旦Consent页面通知了IdentityServer确认结果,用户将会被重定向到returnUrl(里面由一个redirect_url参数)。你的Consent页面应该通过验证returnUrl是有效的来防止打开重定向。这个功能可以用IIdentityInteractionService提供的IsValidReturnUrl 来解决。再或者,如果GetAuthorizationContextAsync 返回一个不为空的对象,你同样可以认为returnUrl是有效的。
IdentityServer4【Topic】Consent的更多相关文章
- IdentityServer4【Topic】之确认(Consent)
Consent 确认 在授权请求期间,如果身份服务器需要用户同意,浏览器将被重定向到同意页面.也就是说,确认也算是IdentityServer中的一个动作.确认这个词直接翻译过来有一些古怪,既然大家都 ...
- IdentityServer4【Topic】之保护APIs
Protecting APIs 保护api 默认情况下IdentityServer将access token发布成JWT(json web token)格式的. 现在,每个相关的平台都支持验证JWT令 ...
- IdentityServer4【Topic】之定义资源
Defining Resources 定义资源 你在系统中通常定义的第一件事是你想要保护的资源.这可能是你的用户的身份信息,比如个人资料数据或电子邮件地址,或者访问api. 你可以通过C#对象模型(内 ...
- IdentityServer4【Topic】之StartUp中的配置
Startup 身份服务器是中间件和服务的组合.所有的配置都是在启动类中完成的. Configuring services 通过调用如下代码在DI(dependency inject,依赖注入)中添加 ...
- IdentityServer4【Topic】之授权类型
Grant Types 授权类型 授权类型指出了一个客户端如何与IdentityServer进行交互.OpenID Conect和OAuth2.0定义了如下的授权类型: Implicit Author ...
- IdentityServer4【Topic】之登出
Sign-out 登出 IdentityServer的登出就像删除认证cookie一样简单,但是为了完成一个完整的联合签名,我们必须考虑将用户从客户端应用程序中(甚至可能是上游的Identity提供者 ...
- IdentityServer4【Topic】之登陆注册
Sign-in 登陆注册 为了让标识服务器(identity server)代表用户发出令牌,该用户必须登录到标识服务器. Cookie authentication Cookie认证 身份验证是由来 ...
- IdentityServer4【Topic】之定义客户端
Defining Clients 定义客户端 客户端表示哪些可以从你的IdentityServer拿到token的应用. 除了一些可能会变化的细节之外,通常情况下你需要为一个客户端定义如下通用的设置: ...
- IdentityServer4【QuickStart】之使用asp.net core Identity
使用asp.net core Identity IdentityServer灵活的设计中有一部分是可以将你的用户和他们的数据保存到数据库中的.如果你以一个新的用户数据库开始,那么,asp.net co ...
随机推荐
- “/"应用程序中的服务器错误
运行ASP.NET MVC项目时,出现了如下错误: 在网上搜索了很久并没有找到有用的答案,后来请朋友看了一下,最后改了端口号才运行成功,错误应该是之前的端口号被占用导致的.
- Oracle day01 select where关键字
select关键字 作用:检索“列” 注意:1.select后面的列可以起别名(查询的显示结果) 1) 列名后面一个空格后添加别名(别名中不许有“空格”) 2) 列名后面一个空格后使用双引号添加别名 ...
- Netty学习笔记(三) 自定义编码器
编写一个网络应用程序需要实现某种编解码器,编解码器的作用就是讲原始字节数据与自定义的消息对象进行互转.网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码, ...
- Java新知识系列 四
[]URL的组成<协议>://<主机>:<端口>/<路径> . []线程的定义实例化和启动. []类的final变量初始化需要满足的条件. []管道通信 ...
- gitbook 入门教程之实用插件(新增3个插件)
插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...
- CTS问题分析6
遇到一个Android P相关的问题,和原来CTS/GTS 问题分析1的表现是一样的,但是将 这个修复cp过来,发现不生效,仍然报错,因此记录一下 问题初探 测试命令: run gts -m GtsG ...
- 比较器 comparable与comparator用法
comparable 接口 Comparable<T> 类型参数:T - 可以与此对象进行比较的那些对象的类型 public interface Comparable<T> 此 ...
- sql取指定时间段内的所有月份
declare @begin datetime,@end datetime set @begin='2017-01-01' set @end='2019-03-04' declare @months ...
- 批处理基础知识-IF
本文主要介绍批处理IF命令的使用. IF命令格式: if /i string=string command 释义:判断2个字符串是否相等,但不区分大小写. 例: 代码: @echo off if /i ...
- MySql 学习之路-基础
Mysql 自学之路 本文包含基础部分与高级部分 一.基础 数据库操作 Show databases:显示所有的数据库 Show tables: 显示所有的数据库表 Use databasename: ...