切换到混合流并且添加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访问。

  1. new Client
  2. {
  3. ClientId = "mvc",
  4. ClientName = "MVC Client",
  5. AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
  6.  
  7. ClientSecrets =
  8. {
  9. new Secret("secret".Sha256())
  10. },
  11.  
  12. RedirectUris = { "http://localhost:5002/signin-oidc" },
  13. PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
  14.  
  15. AllowedScopes =
  16. {
  17. IdentityServerConstants.StandardScopes.OpenId,
  18. IdentityServerConstants.StandardScopes.Profile,
  19. "api1"
  20. },
  21. AllowOfflineAccess = true
  22. };

修改MVC客户端

对于客户端来说变化也不大,asp.net core中的Openid connect handler已经内置了对混合流程的支持,所以我们只需要修改一些配置值。

我们将ClientSecret配置成匹配IdentityServer上面配置的值。添加offline_access和api1这两个scope,并且将resonsetype设置成code id_token(意思就是告诉mvc客户端我要使用混合流程)。

  1. .AddOpenIdConnect("oidc", options =>
  2. {
  3. options.SignInScheme = "Cookies";
  4.  
  5. options.Authority = "http://localhost:5000";
  6. options.RequireHttpsMetadata = false;
  7.  
  8. options.ClientId = "mvc";
  9. options.ClientSecret = "secret";
  10. options.ResponseType = "code id_token";
  11.  
  12. options.SaveTokens = true;
  13. options.GetClaimsFromUserInfoEndpoint = true;
  14.  
  15. options.Scope.Add("api1");
  16. options.Scope.Add("offline_access");
  17. });

当你运行MVC客户端,发现没由什么太大变化,除了确认页面现在多了API和offline access的scope请求。

使用access token

OpenID Connect中间件自动将一些token(目前有id token、access token、refresh token)为你保存好了。这是设置SaveTokens的意义。

从技术上讲,令牌存储在cookie的属性部分中。访问他们最简单的方式就是使用Microsoft.AspNetCore.Authentication这个命名空间。

比方说在你有一个展示claim的视图:

  1. <dt>access token</dt>
  2. <dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd>
  3.  
  4. <dt>refresh token</dt>
  5. <dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd>

为了要使用access token去访问API,你需要获取token,然后在HttpClient中设置它:

  1. public async Task<IActionResult> CallApiUsingUserAccessToken()
  2. {
  3. var accessToken = await HttpContext.GetTokenAsync("access_token");
  4.  
  5. var client = new HttpClient();
  6. client.SetBearerToken(accessToken);
  7. var content = await client.GetStringAsync("http://localhost:5001/identity");
  8.  
  9. ViewBag.Json = JArray.Parse(content).ToString();
  10. return View("json");
  11. }

IdentityServer4【QuickStart】之切换到混合流并且添加API访问的更多相关文章

  1. IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问

    IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...

  2. 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)

    在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...

  3. ASP.NET Core的身份认证框架IdentityServer4(8)- 使用密码认证方式控制API访问

    前言 本文及IdentityServer这个系列使用的都是基于.net core 2.0的.上一篇博文在API项目中我使用了icrosoft.AspNetCore.Authentication.Jwt ...

  4. IdentityServer4(8)- 使用密码认证方式控制API访问(资源所有者密码授权模式)

    一.前言 本文已经更新到 .NET Core 2.2 OAuth 2.0 资源所有者密码模式允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌. 除了通过无法浏览器进行交互的应用程序之外 ...

  5. IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

    IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持 原文:http://docs.identityserver.io/en/release/quickstarts/4_e ...

  6. OpenID Connect Core 1.0(七)使用混合流验证

    3.3 使用混合流验证(Authentication using the Hybrid Flow) 本节描述如何使用混合流执行验证.当使用混合流(Hybrid Flow)时一些令牌从授权端点返回,另一 ...

  7. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

    IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...

  8. ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问

    前言 今天(2017-9-8,写于9.8,今天才发布)一口气连续把最后几篇IdentityServer4相关理论全部翻译完了,终于可以进入写代码的过程了,比较累.目前官方的文档和Demo以及一些相关组 ...

  9. IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)

    一.前言 本文已更新到 .NET Core 2.2 本文包括后续的Demo都会放在github:https://github.com/stulzq/IdentityServer4.Samples (Q ...

随机推荐

  1. Java程序导出成.jar文件、生成.exe可执行文件及打包成可执行安装程序(可在无Java环境的计算机上运行)--以个人所得税计算器为例

    Java程序导出成.jar文件.生成.exe可执行文件及打包成可执行安装程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 需要准备的软件: jdk, ...

  2. 转 CSS3+js实现多彩炫酷旋转圆环时钟效果

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. MySQL 初识别语句,数据库、表、行的增删改查

    一.MySQL 开场语句 1.登陆 mysql -u root -p ; #回车然后输入密码 2.退出 eixt | quit #二者选其一 3.查看数据文件路径(配置文件中学习的) show glo ...

  4. 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 ...

  5. idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误

    在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...

  6. [matlab] 10.最小覆盖

    clear all; close all; clc; n=100; p=rand(n,2); p1=p(1,:); %取第一行的值 P1点 p2=p(2,:); %取第二行的值 P2点 r=sqrt( ...

  7. [TJOI2017]DNA

    嘟嘟嘟 这题怎么想都想不出来,最后还是敲了暴力,喜提40分-- 正解竟然也是暴力-- 用\(s_0\)构造SAM,然后把\(s\)扔上去暴力dfs:记录一个修改次数tot,如果当前不匹配,就tot + ...

  8. 【angularjs】使用angular搭建项目,图片懒加载资料

    demo: <ion-view view-title="{{chat.name}}"> <style type="text/css"> ...

  9. 002_关于six版本过低报cannot import name urllib_parse的问题

    一. 参考:https://github.com/Parsely/pykafka/issues/222 [root@jyall.com tmp]#python check.py #报错如下 Trace ...

  10. Android Wear创建一个通知

    创建Android Wear的通知实际上和手机上创建没啥区别,主要是多了几个新类,只要用熟悉了一切都好办了.(如果只是测试通知,则直接运行wear app就能够看到效果) 创建一个简单的wear通知分 ...