IdentityServer4【QuickStart】之切换到混合流并且添加API访问
切换到混合流并且添加API访问
前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起。
OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和与令牌服务进行单一交换来实现这两种功能。
前面的示例中我们使用过了OpenId Connect的隐式流程(implicit flow)。在隐式流程中所有的token都是通过浏览器进行传输,这对于id token来说没有什么问题的,但是现在我们想要请求一个access token。
access token要比id token更敏感一些,并且如果没有什么必要的话我们并不像让它暴露在外部环境中。OpenID Connect包含了一个叫做“混合”流程,这个流程能给予我们上面说的最好的解决方式----id token通过浏览器通道传输,这样客户端可以在做其他工作之前验证它,并且,如果验证成功,客户端会打开一个后端通道来从token service检索acecss token。
修改客户端配置
做这项工作并没有太多需要修改的地方,首先我们先要让客户端使用混合流程,然后我们还想让客户端和API之间执行一些服务端到服务端的调用,在这个过程中并没有用户参与(这个和client credentials流程相似)。这个是通过使用AllowedGrantTypes属性实现的。
下一步我们需要添加一个client secret。这个会在后端通道用来检索access token。
最后,我们也允许客户端拥有了offline_access这个scope的访问权限,这允许请求一个刷新令牌来实现长时间的API访问。
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, ClientSecrets =
{
new Secret("secret".Sha256())
}, RedirectUris = { "http://localhost:5002/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"api1"
},
AllowOfflineAccess = true
};
修改MVC客户端
对于客户端来说变化也不大,asp.net core中的Openid connect handler已经内置了对混合流程的支持,所以我们只需要修改一些配置值。
我们将ClientSecret配置成匹配IdentityServer上面配置的值。添加offline_access和api1这两个scope,并且将resonsetype设置成code id_token(意思就是告诉mvc客户端我要使用混合流程)。
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("api1");
options.Scope.Add("offline_access");
});
当你运行MVC客户端,发现没由什么太大变化,除了确认页面现在多了API和offline access的scope请求。
使用access token
OpenID Connect中间件自动将一些token(目前有id token、access token、refresh token)为你保存好了。这是设置SaveTokens的意义。
从技术上讲,令牌存储在cookie的属性部分中。访问他们最简单的方式就是使用Microsoft.AspNetCore.Authentication这个命名空间。
比方说在你有一个展示claim的视图:
<dt>access token</dt>
<dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd> <dt>refresh token</dt>
<dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd>
为了要使用access token去访问API,你需要获取token,然后在HttpClient中设置它:
public async Task<IActionResult> CallApiUsingUserAccessToken()
{
var accessToken = await HttpContext.GetTokenAsync("access_token"); var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:5001/identity"); ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
IdentityServer4【QuickStart】之切换到混合流并且添加API访问的更多相关文章
- IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问
IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...
- 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)
在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...
- ASP.NET Core的身份认证框架IdentityServer4(8)- 使用密码认证方式控制API访问
前言 本文及IdentityServer这个系列使用的都是基于.net core 2.0的.上一篇博文在API项目中我使用了icrosoft.AspNetCore.Authentication.Jwt ...
- IdentityServer4(8)- 使用密码认证方式控制API访问(资源所有者密码授权模式)
一.前言 本文已经更新到 .NET Core 2.2 OAuth 2.0 资源所有者密码模式允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌. 除了通过无法浏览器进行交互的应用程序之外 ...
- IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持
IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持 原文:http://docs.identityserver.io/en/release/quickstarts/4_e ...
- OpenID Connect Core 1.0(七)使用混合流验证
3.3 使用混合流验证(Authentication using the Hybrid Flow) 本节描述如何使用混合流执行验证.当使用混合流(Hybrid Flow)时一些令牌从授权端点返回,另一 ...
- IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...
- ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问
前言 今天(2017-9-8,写于9.8,今天才发布)一口气连续把最后几篇IdentityServer4相关理论全部翻译完了,终于可以进入写代码的过程了,比较累.目前官方的文档和Demo以及一些相关组 ...
- IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)
一.前言 本文已更新到 .NET Core 2.2 本文包括后续的Demo都会放在github:https://github.com/stulzq/IdentityServer4.Samples (Q ...
随机推荐
- Linux中“!"的神奇用法
前言 实际上,不起眼的“!”在linux中有着很多让你惊叹的妙用.本文就来细数那些“!”的神奇用法. 执行上一条命令 例如,在执行完上面一条命令后,可以使用下面的方式再次执行上一条命令: $ wher ...
- [BZOJ 2759] 一个动态树好题
[BZOJ 2759] 一个动态树好题 题目描述 首先这是个基环树. 然后根节点一定会连出去一条非树边.通过一个环就可以解除根的答案,然后其他节点的答案就可以由根解出来. 因为要修改\(p_i\),所 ...
- 转://linux下hugepages理解
就Linux应用程序而言,使用的都是虚拟地址,当应用程序读写一个指定的虚拟地址时,内存管理单元会自动进行虚拟地址到物理地址的转换.一个虚拟地址可以映射到多个物理地址,但当前映射到哪一个物理地址取决于当 ...
- (2)esp8266多国语言翻译系统
http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...
- java jvm heap dump及 thread dump分析
一.概念: 在进行java应用故障分析时,经常需要分析内存和cpu信息,也就说所谓的heap dump 和 thread dump heap dump: heap dump文件是一个二进制文件,需要工 ...
- ftp环境搭建并创建虚拟用户
1. 首先安装ftp yum install -y vsftpd 2. 修改配置文件 cd /etc/vsftpd /etc/vsftpd/vsftpd.conf //主配置文件,核心配置文件 / ...
- Linux:CentOS7.4新建用户并授权
之前买了一台阿里云服务器,准备用来搭建一些服务,由于使用root用户登录进行操作比较敏感,就新建了一个用户,用来登录并进行日常操作. 这篇博客,介绍下centos7.4下如何新建用户并且授权... 一 ...
- JS表格分页(封装版)
HTML代码: <html> <head> <meta charset='utf-8'> <script type="text/javascript ...
- Java多线程学习(二)---线程创建方式
线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...
- 【JS小技巧】JavaScript 函数用作对象的隐藏问题(F.ui.name)
用户反馈 @消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错: 因为这是一个 ASP.NET MVC 的 ...