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 ...
随机推荐
- Java程序导出成.jar文件、生成.exe可执行文件及打包成可执行安装程序(可在无Java环境的计算机上运行)--以个人所得税计算器为例
Java程序导出成.jar文件.生成.exe可执行文件及打包成可执行安装程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 需要准备的软件: jdk, ...
- 转 CSS3+js实现多彩炫酷旋转圆环时钟效果
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- MySQL 初识别语句,数据库、表、行的增删改查
一.MySQL 开场语句 1.登陆 mysql -u root -p ; #回车然后输入密码 2.退出 eixt | quit #二者选其一 3.查看数据文件路径(配置文件中学习的) show glo ...
- Why do Kafka consumers connect to zookeeper, and producers get metadata from brokers?
Why do Kafka consumers connect to zookeeper, and producers get metadata from brokers? Ask Question u ...
- idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误
在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...
- [matlab] 10.最小覆盖
clear all; close all; clc; n=100; p=rand(n,2); p1=p(1,:); %取第一行的值 P1点 p2=p(2,:); %取第二行的值 P2点 r=sqrt( ...
- [TJOI2017]DNA
嘟嘟嘟 这题怎么想都想不出来,最后还是敲了暴力,喜提40分-- 正解竟然也是暴力-- 用\(s_0\)构造SAM,然后把\(s\)扔上去暴力dfs:记录一个修改次数tot,如果当前不匹配,就tot + ...
- 【angularjs】使用angular搭建项目,图片懒加载资料
demo: <ion-view view-title="{{chat.name}}"> <style type="text/css"> ...
- 002_关于six版本过低报cannot import name urllib_parse的问题
一. 参考:https://github.com/Parsely/pykafka/issues/222 [root@jyall.com tmp]#python check.py #报错如下 Trace ...
- Android Wear创建一个通知
创建Android Wear的通知实际上和手机上创建没啥区别,主要是多了几个新类,只要用熟悉了一切都好办了.(如果只是测试通知,则直接运行wear app就能够看到效果) 创建一个简单的wear通知分 ...