基于OIDC实现istio来源身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于OIDC实现istio来源身份验证相关的知识,希望对你有一定的参考价值。

参考技术A

本文介绍如何生成可以经过istio来源身份验证的jwt token。istio的来源身份验证是通过OpenID connect规范实现的,这里只需要遵循OIDC的小部分规范便可以实现可以通过验证的token。

首先来看一下istio官方文档对来源身份验证的说明:

ISTIO的来源身份验证通过ENVOY完成,看一下envoy官方文档对JWT的说明:

可以知道,istio会对token的 signature audiences issuer 三个属性进行校验,也会对有效期进行检查,而且只支持ES256和RS256两种算法,因此我们需要保证我们的token生成中这三项属性的规范性。

https://jwt.io/

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,简单来说,一个JWT的TOKEN由三部分组成:

最终的结构如下:

如下:

https://openid.net/connect/

OpenID Connect 是一套基于 OAuth 2.0 协议的轻量认证级规范,提供通过 API 进行身份交互的框架。较 OAuth 而言, OpenID Connect 方式除了认证请求之外,还标明请求的用户身份。

简单来说,我们需要提供一个符合OIDC规范的认证服务端,它需要提供token生成能力和token校验所使用的公钥。认证服务端保管好一组签名所用的私钥,生成token时选择一个私钥对token进行签名并在token中注入相关信息(比如对应的公钥ID、算法、issuer、audiences、有效期等)。然后认证服务端需要提供一个接口来开放所有的公钥,这样ISTIO才能拿到公钥对token进行校验。

上述都是OIDC规范的一部分,这里并不严格实现OIDC规范,仅仅为了实现istio的来源身份验证。

maven

用于对公私钥二进制内容的加解密,可以自行选择其他方式。

这里使用RS256算法,注意管理好keyId,这里我把公私钥都使用base64格式化,方便后续操作。

jwk.toJson()返回的内容是一个JSON,我们需要记录一下公钥的JSON用于开放给istio。

公钥JSON示例:

这里的公钥是经过OIDC规范特殊格式化的,不是base64。

注意issuer、keyId、clientId、subject等值的统一,要与下一步的开放接口一致,注意有效期可以自己定义,也可以向token中注入自定义的信息。

使用rest开放公钥(OIDC规范)

最终该接口的返回值如下所示,可以自行设计接口,该接口的访问地址用于配置在istio中。

这里提供一个最简单的实现,推荐自行根据需求开发。

maven依赖

实体类

接口

严格的OIDC规范,还需要开放一个接口用于声明所有的接口和相关的约束,包括jwksUri。该接口的访问路径是issuer/.well-known/openid-configuration,这里不再详细介绍,有兴趣的可以自行研究,或者等待后续的文章。

可以参考一下谷歌的OIDC,比如谷歌的issuer是 https://accounts.google.com ,则对应的接口是 https://accounts.google.com/.well-known/openid-configuration ,当然里面有许多属性可能是谷歌特有的,详细可以参考OIDC的官方文档。

在istio中为想要执行来源身份验证服务配置一个policy,issuer与生成token时一致,jwksUri就是用于开放公钥的接口地址。如果不提供jwksUri,那么就会使用issuer/.well-known/openid-configuration来访问OIDC的声明接口,来找到jwks_uri并拿到公钥。

还支持排除某些路径,或仅作用于某些路径(摘自官方文档)

详情参考官方英文文档 https://istio.io/docs/reference/config/istio.authentication.v1alpha1/

个人能力有限,如有错误,欢迎指正!

有兴趣的可以研究一下一些开源的实现OIDC规范的框架的源码,可以有更加深入的了解。

Blazor OIDC 身份验证弹出窗口

【中文标题】Blazor OIDC 身份验证弹出窗口【英文标题】:Blazor OIDC Authentication popup 【发布时间】:2021-10-25 03:05:37 【问题描述】:

问题

当我尝试将 RemoteAuthenticatorView 与 OIDC 结合使用时,页面仅重定向到 identityserver4 网站

预期结果

应使用身份服务器的内容打开一个弹出窗口。


相比之下,AddMsalAuthentication 提供了一个options.ProviderOptions.LoginMode (Docs)

AddOidcAuthentication 有类似的东西吗?

我用来重现此问题的资源:

https://medium.com/@marcodesanctis2/securing-blazor-webassembly-with-identity-server-4-ee44aa1687ef https://github.com/cradle77/BlazorSecurityDemo

【问题讨论】:

【参考方案1】:

Identity Server 4 带有一组标准的 cshtml 文件。 它没有任何开箱即用的“弹出”就绪模式。

如果您想实现与 MSAL 相同的行为,则需要通过 javascript 开发一种集成,就像您在 Blazor 中使用 Azure AD B2C 身份验证时在 index.html 中引用的那样。

【讨论】:

以上是关于基于OIDC实现istio来源身份验证的主要内容,如果未能解决你的问题,请参考以下文章

无法识别角色授权 - 带有 IdentityServer4 Cookie/Oidc 身份验证的 ASPNET CORE 5

Quarkus 验证来自多个来源的 JWT

Blazor OIDC 身份验证弹出窗口

具有多个 OIDC 身份验证配置的 OWIN

Hashicorp Vault OIDC 身份验证方法与 Azure AD 错误验证签名

在 IdentityServer4 和 Dotnet Core Identity 中使用带有身份验证 (oidc) 的 sms otp