本文于 2019/4/3 更新,去掉了旧文的部分讲解,主要是关于混合流程和简化流程的区别,我决定单独写一篇博文来介绍。所以本文现在已经为纯翻译。

原文:Switching to Hybrid Flow and adding API Access back

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

OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单一协议和单一交换使用令牌服务来使用这两种协议。

在之前的快速入门中,我们使用了OpenID Connect 简化流程。在简化流程中,所有令牌(身份令牌、访问令牌)都通过浏览器传输,这对于身份令牌(IdentityToken)来说是没有问题的,但是如果是访问令牌直接通过浏览器传输,就增加了一定的安全问题。

访问令牌(AccessToken)比身份令牌(IdentityToken)更敏感,在非必须的情况下,我们不希望将它们暴露给外界。OpenID Connect 包含一个名为“Hybrid(混合)”的流程,它为我们提供了两全其美的优势,身份令牌通过浏览器传输,因此客户端可以在进行任何更多工作之前对其进行验证。如果验证成功,客户端会通过令牌服务的以获取访问令牌。

修改客户端配置

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

接下来我们需要添加一个客户端密钥。这将用于获取访问令牌。

最后还需要设置 AllowOfflineAccess ,它允许我们通过刷新令牌的方式来实现长期的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
};

修改MVC客户端

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

配置 ClientSecret 匹配IdentityServer中设置的 Client Secret,Scope 添加 offline_accessapi1ResponseType 设置为 code id_token (表示使用混合流程,通过浏览器返回身份令牌)

.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客户端时,除了现在同意授权页面要求您提供额外的 offline_accessapi1 Scope 之外,没有太大的区别。

使用访问令牌

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

从技术上讲,令牌存储在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.cshtmljson 的视图:

<pre>@ViewBag.Json</pre>

启动MVC客户端并在身份验证后调用访问/home/CallApi以进行测试。

资料

Demo地址:5_HybridFlowAuthenticationWithApiAccess

IdentityServer(11)- 使用Hybrid Flow并添加API访问控制的更多相关文章

  1. Identity Server 4 - Hybrid Flow - 保护API资源

    这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源. 保护MVC客户端的文章: https://w ...

  2. Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

    这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: https://www.cnblogs.com/cgzl/ ...

  3. asp.net core系列 57 IS4 使用混合流(OIDC+OAuth2.0)添加API访问

    一.概述 在上篇中,探讨了交互式用户身份验证,使用的是OIDC协议. 在之前篇中对API访问使用的是OAuth2.0协议.这篇把这两个部分放在一起,OpenID Connect和OAuth 2.0组合 ...

  4. Identity Server 4 - Hybrid Flow - MVC客户端身份验证

    预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...

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

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

  6. Identity Server 4 - Hybrid Flow - Claims

    前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html Claims ...

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

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

  8. AspNetCore添加API限流

    最近发现有客户在大量的请求我们的接口,出于性能考虑遂添加了请求频率限制. 由于我们接口请求的是.Net Core写的API网关,所以可以直接添加一个中间件,中间件中使用请求的地址当key,通过配置中心 ...

  9. .net 添加api不能访问的问题

    在一个.netmvc项目中,本身没有提供api后来想添加api就会出现问题.会发生添加的apicontrol不能访问的情况.这种情况一般是因为,global文件中,application_start( ...

随机推荐

  1. 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)

    原文来自 RabbitMQ 英文官网的教程(6.Remote procedure call - RPC),其示例代码采用了 .NET C# 语言. In the second tutorial we ...

  2. 后台程序处理 (一)python asyncio 协程使用

    由于脚本需要在完成事件处理后N秒检查事件处理结果,当执行失败时再执行另一个事件处理. 想要最小化完成这个功能.同时在第一时间就将执行完毕的结果反馈给接口. 因此想到使用协程. 使用之前先翻阅了一下现有 ...

  3. HTML:Event [转]

    这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时之需. 什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们 ...

  4. 【CSS3】表格、列表

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. DataBase MongoDB基础知识记录

    MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...

  6. ABP-Module

    [TOC] 什么是Module? Module就是模块化的设计思想.开发人员可以将自定义的功能以模块的形式集成到项目中.具体的功能也可以设计成一个单独的模块 AbpModule AbpModule是所 ...

  7. AVL树的单双旋转操作

    把必须重新平衡的节点称为å.对于二叉树,å的两棵子树的高度最多相差2,这种不平衡可能有四种情况: 对å的左儿子的左子树进行插入节点(左-左) 对å的左儿子的右子树进行插入节点(左-右) 对å的右儿子的 ...

  8. php iconv 函数参数的区别

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/57 用户输入:英特尔® 酷睿™ i7处理器大显身手 case1 ...

  9. 基于Vue的SPA动态修改页面title的方法

    最近基于VUE做个SPA手机端web发现动态修改页面标题通过document.title=xxxx 来修改着实蛋疼,而且在IOS的微信端据说没效果.百度发现要针对IOS的微信做点额外的操作,即:创建一 ...

  10. 回顾2017系列篇(一):最佳的11篇UI/UX设计文章

    2017已经接近尾声,在这一年中,设计领域发生了诸多变化.也是时候对2017年做一个总结,本文主要是从2017设计文章入手,列出了个人认为2017设计行业里最重要的UI/UX文章的前11名,供大家参考 ...