第13章 切换到混合流并添加API访问

在之前的快速入门中,我们探讨了API访问和用户身份验证。现在我们想把这两个部分放在一起。

OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来实现这两者。

在之前的快速入门中,我们使用了OpenID Connect隐式流程。在隐式流程中,所有令牌都通过浏览器传输,这对于身份令牌来说是完全正确的。现在我们还想要一个访问令牌。

访问令牌比身份令牌更敏感,如果不需要,我们不希望将它们暴露给“外部”世界。OpenID Connect包含一个名为“混合流”的流程,它为我们提供了两全其美的优势,身份令牌通过浏览器渠道传输,因此客户端可以在进行任何更多工作之前对其进行验证。如果验证成功,客户端会打开令牌服务的反向通道以检索访问令牌。

13.1 修改客户端配置

没有太多必要的修改。首先,我们希望允许客户端使用混合流,此外我们还希望客户端允许执行不在用户上下文中的服务器到服务器API调用(这与我们的客户端凭证快速启动非常相似)。这是使用该AllowedGrantTypes属性表示的。

接下来我们需要添加一个客户端密钥。这将用于检索反向通道上的访问令牌。

最后,我们还让客户端访问offline_access范围 - 这允许请求刷新令牌以实现长期存在的API访问:

new Client
{
    ClientId = "mvc",
    ClientName = "MVC Client",
    AllowedGrantTypes = GrantTypes.Hybrid,

    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
};

13.2 修改MVC客户端

MVC客户端的修改也很少 - ASP.NET Core OpenID Connect处理程序内置了对混合流的支持,因此我们只需要更改一些配置值。

我们配置 ClientSecret 以让它跟 IdentityServer 上的信息相匹配。添加 offline_access scopes,然后设置ResponseTypecode 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");
    options.ClaimActions.MapJsonKey("website", "website");
});

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

13.3 使用访问令牌

OpenID Connect处理程序会自动为您保存令牌(在我们的案例中为身份,访问和刷新)。这就是SaveTokens设置的作用。

cookie检查视图迭代这些值并在屏幕上显示它们。

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

例如:

var accessToken = await HttpContext.GetTokenAsync("access_token")
var refreshToken = await HttpContext.GetTokenAsync("refresh_token");

要使用访问令牌访问API,您需要做的就是检索令牌,并在HttpClient上设置它:

public async Task<IActionResult> CallApi()
{
    var accessToken = await HttpContext.GetTokenAsync("access_token");

    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    var content = await client.GetStringAsync("http://localhost:5001/identity");

    ViewBag.Json = JArray.Parse(content).ToString();
    return View("json");
}

创建一个名为json.cshtml 的视图,如下所示:

<pre>@ViewBag.Json</pre>

确保API正在运行,启动MVC客户端并/home/CallApi在身份验证后调用。

github地址

原文地址:https://www.cnblogs.com/thinksjay/p/10774771.html

时间: 2024-11-09 02:17:08

第13章 切换到混合流并添加API访问的相关文章

js高程笔记13章

第13章 事件 1.事件流:描述从页面中接收事件的顺序. 三个阶段:捕获,处于目标,冒泡. 2.事件处理程序:局部变量event表示事件对象,this值为事件目标元素. (1)HTML事件处理程序:可以访问特性.弊端:可能调用事件处理程序时,函数还未定义.同时代码紧密耦合,修改不便. (2)DOM0级事件处理程序:this引用当前元素.弊端:一个元素只能添加一个事件处理程序. (3)DOM2级事件处理程序:addEventListener()和removeEventListener().无法移除

java JDK8 学习笔记——第13章 时间与日期

第十三章 时间与日期 13.1 认识时间与日期 13.1.1 时间的度量 1.格林威治标准时间GMT 格林威治标准时间的正午是太阳抵达天空最高点之时.现在已经不作为标准时间使用. 2.世界时UT世界时是借由观测远方星体跨过子午线而得,在引入UTC之前,GMT和UT是相同的. 3.国际原子时TAI 将秒的国际单位定义为铯原子辐射振动91926331770周耗费的时间,从UT的1958年开始同步. 4.世界协调时UTC 采用了闰秒修正,确保UTC与UT相差不会超过0.9秒,加入闰秒的时间通常会在6月

阅读《实例化需求》1-3章有感

今天我阅读了<实例化需求>的1-3章. 第一章主要是讲实例化需求的好处.实例化需求说明是一组过程模式,他帮助团队构建正确的产品. 使用实例化需求说明,团队编写的文档恰到好处,在短迭代或基于流的开发中可以有效地协助变更. <实例化需求>这本书不是以理论的方式来构建一个案例来阐述实例化需求说明的好处,而是来自 于那些来自于那些大大受益于实例化需求说明的团队. 实例化需求可以更有效地实施变更,主要是通过活文档.活文档是系统功能的一个信息源,与程序 代码一样可靠,但更容易使用和理解.他帮助

第13章 线程

第13章 线程线程具有提高执行速度的特点. 本章重点:----------------------------------线程的基本概念创建并使用线程线程的让步.同步等操作 进程就是一个执行中的程序,每一个进程都有其独立的内存空间和系统资源.进程就是一个运行的程序,Windows操作系统是支持多进程的操作系统,即同一时间可以执行多个程序,每个程序是在自己独立的内存空间内,使用自己被分配到的系统资源.线程是CPU调度和分派的基本单位,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使

13章 事件

发展 IE3和Netscape Navigator2    :       作为分担服务器负载的一种手段: IE4和Naviscape4    :    提供了相似却不相同的API: DOM2规范制定    :    开始尝试标准化DOM事件: DOM2实现    :    IE9.Firefox.Opera.Safari和Chrome全部实现‘DOM2级事件’核心部分: DOM3级出现    :    API变得更加繁琐. 13.1    事件流   13.1.1    事件冒泡    : 

《Cortex?-A系列编程者指南(V3.0)》第13章&lt;中断处理&gt;笔记

在本章,我们会看看ARM处理器处理中断的一系列方法,简单地看看通用中断控制器(Generic Interrupt Controller,GIC)架构. 旧版本的ARM架构允许实现者在他们的外部中断控制器设计中相当大的自由,没有关于中断类型或数量,或者是被用于中断控制模块接口的软件模型的协议.GIC架构提供一个更为严格的控制规范,使得来自不同制造商之间的中断控制器之间有更高程度的一致性.这使得中断处理代码变得更加可移植. 13.1 外部中断请求 如我们在第12章的异常类型中讨论的,所有的ARM处理

MySQL性能调优与架构设计——第13章 可扩展性设计之 MySQL Replication

第13章 可扩展性设计之 MySQL Replication 前言: MySQL Replication 是 MySQL 非常有特色的一个功能,他能够将一个 MySQL Server 的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 Instance 中.虽然复制过程并不是实时而是异步进行的,但是由于其高效的性能设计,延时非常之少.MySQL 的Replication 功能在实际应用场景中被非常广泛的用于保证系统数据的安全性和系统可扩展设计中.本章将专门针对如何利

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

第13章 C#中的多线程

第13章多线程 13.1 线程概述 计算机的操作系统多采用多任务和分时设计.多任务是指在一个操作系统中开以同时运行多个程序.例如,可以在使用QQ聊天的同时听音乐,即有多个独立的任务,每个任务对应一个进程,每个进程也可产生多个线程. 13.1.1 进程 认识进程先从程序开始,程序(Program)是对数据描述与操作的代码的集合,如Office中的Word,影音风暴等应用程序. 进程(Process)是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产