基于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
Hashicorp Vault OIDC 身份验证方法与 Azure AD 错误验证签名
在 IdentityServer4 和 Dotnet Core Identity 中使用带有身份验证 (oidc) 的 sms otp