IdentityServer(11)- 使用Hybrid Flow并添加API访问控制

关于Hybrid Flow 和 implicit flow

我在前一篇文章使用OpenID Connect添加用户认证中提到了implicit flow,那么它们是什么呢,它和Hybrid Flow有什么不同呢,这里简单讲一下。

Hybrid Flow 和 implicit flow是OIDC(OpenID Connect)协议中的术语,Implicit Flow是指使用OAuth2的Implicit流程获取Id Token和Access Token;Hybrid Flow是指混合Authorization Code Flow(OAuth授权码流程)和Implici Flow。

在之前的文章,我们探索了API访问控制和身份认证。 现在我们要把这两个部分结合在一起。

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

在前一篇文章中,我们使用了OpenID Connect implicit flow。 在implicit流程中,所有的令牌都通过浏览器传输,这对于身份令牌来说是完全不错的。 现在我们也想要一个访问令牌。访问令牌比身份令牌更加敏感,如果不需要,我们不想让它们暴露于“外部”世界。 OpenID Connect包含一个名为“混合流”的流程,它可以让我们两全其美,身份令牌通过浏览器通道传输,因此客户端可以在做更多的工作之前验证它。 如果验证成功,客户端会打开令牌服务的后端通道来检索访问令牌。

修改客户端配置

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

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

最后,我们还让客户端访问offline_access作用域 - 这允许为长时间的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客户端

在MVC客户端的修改也是最小的 - ASP.NET Core OpenID Connect处理程序已经内置支持混合流程,所以我们只需要改变一些配置值。

我们配置ClientSecret密钥和IdentityServer上匹配。 添加offline_accessapi1作用域,并将ResponseType设置为代码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");
});

当你运行MVC客户端时,不会有太大的区别,除了同意界面现在要求你提供额外的API和offline access访问作用域。

使用访问令牌

OpenID Connect中间件会自动为您保存令牌(标识,访问和刷新)。 这就是SaveTokens设置的作用。

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

例如在View上获取Token:

<dt>access token</dt>
<dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd>

<dt>refresh token</dt>
<dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd>

要使用访问令牌访问API,您只需检索令牌,并将其设置在您的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");
}

本文代码:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/5_HybridFlowAuthenticationWithApiAccess

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮振伟的专栏

[qemu][io]虚拟化IO latency监控

前言: Linux的很多监控组件,主要针对IOPS和IO带宽进行监控。很多业务场景下,希望对IO的延迟做监控。单纯的await并不能反映出来IO的延迟具体情况。...

1442
来自专栏达摩兵的技术空间

mac总是卡死折腾记

如果你确认你mac是硬件ok,但是在某些程序运行的时候导致内存飙升,比如最明显吃内存的chrome,这时候可能就是你内存分配的一些问题,近期我就根据apple ...

1174
来自专栏QQ会员技术团队的专栏

无需后台接入?带你玩转VasSonic 2.0里的Local Server

腾讯手Q增值团队于今年8月份正式开源了VasSonic,一个轻量级高性能的Hybrid框架。VasSonic框架使用并行加载、动态缓存、增量更新等手段,实现了终...

31710
来自专栏云计算

使用ThingsBoard查看物联网数据

ThingsBoard是一个开源平台,用于收集和可视化物联网设备的数据。可以将来自任意数量设备的数据发送到云服务器,在云服务器中可以通过可自定义的仪表板查看或共...

4.9K1
来自专栏Venyo 的专栏

LocalDB 在 ASP.NET 程序中找不到数据库

LocalDB 在 ASP.NET 程序中找不到数据库:有时候错误信息是:无法找到数据库,请确认数据库名称是否正确;而有时候会变成:Cannot open da...

3288
来自专栏编舟记

如何发布Jar包到Maven Central Repository

Maven Central 网站并不提供注册的功能,你需要到 Sonatype 网站上进行注册。而事实上,Sonatype 网站也没有直接提供一个注册链接。真正...

1273
来自专栏腾讯开源的专栏

无需后台接入?带你玩转VasSonic 2.0里的Local Server

腾讯手Q增值团队于今年8月份正式开源了VasSonic,一个轻量级高性能的Hybrid框架。VasSonic框架使用并行加载、动态缓存、增量更新等手段,实现了终...

3970
来自专栏小俊博客

VPS使用SolusVM开设OpenVZ的NAT机器全步骤教程

现在到处都是卖NAT机器的网站,俗称oneman,就是一个人可以搞定一切IDC业务(混IDC圈的都知道吧),对,没错,我相信大家手里VPS多的很,吃灰的也多,为...

3802
来自专栏菩提树下的杨过

docker学习(2) mac中docker-machine使用vmware fusion以及配置国内镜像加速

一、前言 先回顾下上一节创建docker-machine的过程,默认情况下docker toolbox中的docker-machine使用virtual box...

26310
来自专栏漫漫全栈路

Ubuntu下安装Nginx+PHP+MySql环境

写在之前: 之前腾讯云线下推广的时候给同学们讲过一趟基于ubuntu系统安装WordPress搭建自己的个人博客的课程。最近刚好有个朋友想要学习下ubuntu系...

5657

扫码关注云+社区