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


原文:http://docs.identityserver.io/en/release/quickstarts/5_hybrid_and_api_access.html

目 录

上一篇:IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

下一篇:IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

在之前的快速入门中我们探讨了 API 访问和用户认证。现在我们想要把这两部分结合起来。

OpenID Connect 和 OAuth 2.0 结合的美妙之处在于,你既可以使用单一的协议,也可以向令牌服务做一次往返交互。

之前我们使用的是 OpenID Connect 隐式流。在隐式流中所有令牌都通过浏览器来传输,这对于 身份令牌 来说是完全没有问题的。现在我们还想要请求一个 访问令牌

与身份令牌相比,访问令牌更加敏感,如果没有必要,我们是不会想将他们暴露给“外部世界”的。OpenID Connect 包含了一个叫做 “混合流(Hybrid flowe)” 的流,它为我们提供了两方面优点 —— 身份令牌通过浏览器频道来传输,这样客户端就能够在做任何工作前验证它;如果验证成功了,客户端就会打开一个后端通道来连接令牌服务以检索访问令牌。

修改客户端配置

需要修改的东西不是很多。首先我们想要允许客户端使用混合流(Hybrid Flow),另外我们还想要客户端允许服务于服务之间的 API 调用,并且这种调用不会与用户上下文混杂在一起(这与我们的客户端凭证快速入门非常相似)。这是使用 AllowedGrantTypes 属性来表示的。

然后我们要添加一个客户端密码,这将被用于在后端通道上检索访问令牌。

最后我们还要允许客户端访问 offline_access scope - 这允许为长期使用的 API 访问请求刷新令牌:

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

修改 MVC 客户端

对 MVC 客户端的修改同样也很少 - ASP.NET Core OpenID Connect 中间件是内置支持混合流的,所以我们只需要更改一些配置值。

我们配置 ClientSecret 以让它跟 IdentityServer 上的信息相匹配。添加 offline_access scopes,然后设置 ResponseTypecode id_token(基本的意思就是“使用混合流”)

  1. app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
  2. {
  3. AuthenticationScheme = "oidc",
  4. SignInScheme = "Cookies",
  5. Authority = "http://localhost:5000",
  6. RequireHttpsMetadata = false,
  7. ClientId = "mvc",
  8. ClientSecret = "secret",
  9. ResponseType = "code id_token",
  10. Scope = { "api1", "offline_access" },
  11. GetClaimsFromUserInfoEndpoint = true,
  12. SaveTokens = true
  13. });

当你运行 MVC 客户端的时候,不会有太大的区别。除此之外,授权确认页现在还会向你请求访问 额外的 API 和 离线访问(offline access) scope。

使用访问令牌

OpenID Connect 中间件会自动为你保存令牌(身份令牌,访问令牌和现在我们例子中的刷新令牌)。这就是 SaveTokens 设置的效果。

技术上,令牌是存储在 cookie 的属性片段之内的,访问它们最简单的方式是使用 Microsoft.AspNetCore.Authentication 名称空间下的扩展方法。

比如在你的身份信息视图上:

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

为了使用访问令牌访问 API,你所需要做的只是检索令牌,然后将其设置到你的 HttpClient 中:

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

目 录

上一篇:IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

下一篇:IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问的更多相关文章

  1. IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

    IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity 原文:http://docs.identityserver.io/en/release ...

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

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

  3. IdentityServer4 中文文档 -8- (快速入门)设置和概览

    IdentityServer4 中文文档 -8- (快速入门)设置和概览 原文:http://docs.identityserver.io/en/release/quickstarts/0_overv ...

  4. IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据

    IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据 原文:http://docs.identityserver.io/en/r ...

  5. IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

    IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...

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

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

  7. IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API

    IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API 原文:http://docs.identityserver.io/en/release/quickstarts/ ...

  8. IdentityServer4 中文文档 -10- (快速入门)使用密码保护API

    IdentityServer4 中文文档 -10- (快速入门)使用密码保护API 原文:http://docs.identityserver.io/en/release/quickstarts/2_ ...

  9. IdentityServer4【QuickStart】之切换到混合流并且添加API访问

    切换到混合流并且添加API访问 前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起. OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和 ...

随机推荐

  1. Atomic in Redis

    Since Redis is single-threaded, everything is atomic.

  2. Forward团队-爬虫豆瓣top250项目-项目总结

    托管平台地址:https://github.com/xyhcq/top250 小组名称:Forward团队 组长:马壮 成员:李志宇.刘子轩.年光宇.邢云淇.张良 我们这次团队项目内容是爬取豆瓣电影T ...

  3. python学习,excel操作之xlrd模块常用操作

    import xlrd ##工作表## #打开excel f = xlrd.open_workbook("test.xlsx") file = f.sheet_by_name(&q ...

  4. 1.Spring AOP应用

    首先咱们来了解一下具体的业务场景(这是个真实的项目的业务场景):具体的业务是这样的,现在系统中有六十多个主档(功能模块),每个主档都有新增.修改.删除功能,当我们在对每个主档做这些操作时需要对其记录日 ...

  5. repo跟svn的区别

    Git与SVN区别 Git和SVN正好相反,git提倡开发时拉分支,各干各的,相互独立,发版本时打标签:而svn呢,平时大家都在主干上干活,发版本时拉个分支,所以呢,svn经常会提交冲突,经常要合并代 ...

  6. 京东618:Docker扛大旗,弹性伸缩成重点 (2015-06-23)

    不知不觉中,年中的618和年终的11.11已经成为中国电商的两大促销日,当然,这两天也是一年中系统访问压力最大的两天.对于京东而言,618更是这一年中最大的一次考试,考点是系统的扩展性.稳定性.容灾能 ...

  7. 利用Swashbuckle生成Web API Help Pages

    利用Swashbuckle生成Web API Help Pages 本文将通过Swagger的.NET Core的实现封装工具Swashbuckle来生成上一篇-<创建ASP.NET Core ...

  8. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...

  9. Java线程小刀牛试

    线程简介 什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器.堆栈和局部变量等属性,并且 ...

  10. Windows下Tomcat内存占用过高问题跟踪(ProcessExplorer+jstack)

    一.问题描述 Tomcat下面部署很多个java项目的war包,tomcat启动一段时间后,发现cpu占用过高,整个界面卡死! 二.通过process explorer查看java进程下的线程 pro ...