本文介绍如何在ASM中实现网格内应用的单点登录。
前提条件
-
创建ASM企业版实例。具体操作,请参见创建ASM实例。
已创建Kubernetes托管版集群。具体操作,请参见创建ACK托管集群。
已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
-
已为default命名空间启用Sidecar自动注入。具体操作,请参见启用自动注入。
背景信息
当前很多应用都需要进行访问控制,登录成功的用户才有权限访问。随着系统复杂度的提升,“单点登录”成为了一个很好的解决方案,您可以使用一个账号登录多个系统。ASM提供的自定义授权服务,可以无侵入地实现网格内应用的单点登录。
使用ASM实现单点登录,可以降低应用的改造、运维等成本。本文使用阿里云IDaaS实例作为身份提供方,实现单点登录到网格内应用服务。网格内应用无需实现认证、鉴权逻辑,通过配置ASM自定义鉴权接入到阿里云IDaaS或任意支持OIDC协议的IdP进行鉴权和登录流程,鉴权通过后,将应用的请求以及认证信息一同发往应用,应用可基于身份信息进行相应业务处理。
相关概念
|
概念 |
说明 |
|
IdP |
Identity Provider的缩写,身份提供商。例如,您可以通过账号+密码的形式来验证您的身份。当您使用支付宝账号登录优酷,这个场景中支付宝即为IdP。 |
|
OIDC |
OIDC是OpenID Connect的简称,是一个基于OAuth 2.0协议的身份认证标准协议。更多信息,请参见OpenID Connect。 |
|
Scope |
OIDC中的概念,每一个IdP同时也保存了用户的各种信息,例如Email、个人资料等,这些分类被称为Scope。在通过IdP进行Authentication(登录操作)时,一些IdP会要求选择允许访问用户的哪些资料,每一个类别都对应一个Scope。 |
步骤一:创建EIAM云身份服务实例及测试账号
-
登录EIAM云身份服务控制台,创建IDaaS实例。
说明一个IDaaS实例可以被视为一个账号系统。创建一个IDaaS实例,相当于创建了一个独立的账号系统。
-
在EIAM 云身份服务页面,单击目标IDaaS实例名称。
-
在左侧导航栏,选择。
-
在账户页面的账户页签,单击创建账户。
-
在创建账户面板,设置账户信息,然后单击确定。
步骤二:添加和配置OIDC应用
您可以将IDaaS实例中的应用理解为接口。IDaaS实例可以用不同的应用暴露接口,以各种方式进行单点登录。本文使用OIDC应用进行演示。
-
在云身份服务控制台左侧导航栏,单击应用管理。
-
在应用管理页面,单击添加应用。
-
在添加应用页面,单击标准协议页签,在OIDC卡片中单击添加应用。
-
在添加应用-OIDC 协议对话框,配置应用名称,然后单击立即添加。
-
在OIDC 应用详情页面,选择。
-
在单点登录配置页面,设置登录 Redirect URI。单击显示高级配置,在用户信息范围,选择您需要获取的信息,然后单击保存。
在左侧导航栏单击应用,选择目标应用后单击登录访问页签,进入单点登录子页签。用户信息范围可选的 scopes 包括
openid、email、phone、profile。说明本例中的Redirect URI设置为
http://${ASM网关的CLB地址}/oauth2/callback。请将${}替换为您实际的地址。 -
在OIDC 应用详情页面,选择,然后单击添加授权。
-
在添加授权对话框,为步骤一创建的用户授权,然后单击保存授权。
完成OIDC应用的配置后,您需要记录当前应用的Issuer、client_id、client_secret等配置信息,以便在ASM中配置单点登录使用。
-
Issuer:在OIDC应用的区域获取。Issuer:在 OIDC 应用的登录访问 > 单点登录页面下方的应用配置信息区域获取,该字段用于校验 token 发放来源,同时是各端点 URL 的 baseUrl。
-
client_id、client_secret:在OIDC应用的通用配置区域获取。
步骤三:部署测试应用并将其暴露于网关
本文使用httpbin应用作为测试,该应用可以辅助查看请求内容,便于验证登录后从IdP处获取的信息。
-
使用以下内容,在ACK集群的default命名空间下部署httpbin应用。
-
使用以下内容,在ASM控制台配置网关规则至对应的ASM实例。具体操作,请参见管理网关规则。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: ingressgateway namespace: istio-system spec: selector: app: istio-ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP -
使用以下内容,将虚拟服务应用到ASM实例。具体操作,请参见管理虚拟服务。
该虚拟服务指定了一条指向httpbin应用的默认路由规则。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: ingressgateway-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - name: default route: - destination: host: httpbin.default.svc.cluster.local port: number: 8000 -
配置完网关规则和虚拟服务后,您可以直接通过
curl -I http://${ASM网关外部IP:80}命令,访问httpbin服务。示例输出:
curl -I http://${ASM网关外部IP}:80 HTTP/1.1 200 OK server: istio-envoy date: Fri, 19 Aug 2022 07:39:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 3
步骤四:启用ASM自定义授权服务,配置OIDC单点登录
-
登录ASM控制台,在左侧导航栏,选择。
-
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择,然后单击关联自定义授权服务。
-
在关联自定义授权服务页面,单击OIDC身份认证授权服务页签,进行相关配置,然后单击创建。
说明OIDC应用的相关信息由步骤二获取。您可以使用ASM网关作为登录重定向地址。关于Cookie Secret的更多信息,请参见Cookie Secret的生成。
-
使用数据平面集群KubeConfig,执行以下命令,获取OIDC外部授权服务域名。
kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}' -
使用以下内容,创建VirtualService,接收ASM网关的认证请求。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: oauth2-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - match: - uri: prefix: /oauth2 name: oauth2 route: - destination: host: # 上一步获取的外部授权服务域名。 port: number: 4180重要为防止VirtualService冲突,请勿将其他VirtualService匹配前缀为
/oauth2的路径。
步骤五:创建授权策略
在网格详情页面左侧导航栏,选择,然后在右侧页面,单击使用YAML创建。
-
在创建页面,选择命名空间和场景模板,配置如下YAML,然后单击创建。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: oidc namespace: istio-system spec: action: CUSTOM provider: name: httpextauth-oidc # 上面创建的自定义授权策略的名称。 rules: - {} selector: matchLabels: istio: ingressgateway说明该权限策略会对所有进入ASM网关的请求进行授权。
步骤六:结果验证
-
在浏览器中访问http://${ASM网关外部IP:80}。
显示如下页面,说明单点登录生效。页面显示 OAuth2 Proxy 登录页面,其中包含 Sign in with OpenID Connect 按钮,表明 OAuth2 Proxy 已成功部署并与 OpenID Connect 集成。
-
单击Sign in with OpenID Connect。
预期结果:页面跳转至阿里云 IDaaS 登录页面,显示账户名、手机号或邮箱和密码输入框及登录按钮,表明 OpenID Connect 单点登录配置已生效。
-
在阿里云IDaaS的登录页面,输入步骤一创建的测试账号以及密码,然后单击登录。
预期结果:登录成功后,页面跳转至 httpbin.org 的 Swagger API 文档页面(版本 0.9.2),页面描述为 A simple HTTP Request & Response Service.,并列出 HTTP Methods、Auth、Status codes、Request inspection 等 API 分组,表明 IDaaS 单点登录配置验证成功。
-
单击Request inspection,选择/headers > try it out > Execute。
预期结果:执行请求后,服务端返回 Code 200。Response body 中
Authorization字段包含 Bearer JWT token,表明 JWT 鉴权已生效。{ "headers": { "Accept": "application/json", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Authorization": "Bearer eyJraWQiOiJLRVkxM3d0ekhLSmdEbkFmd1lQR0RqemM5RFUzTkwSNXd1S0wiLC3hbGciOiJSUzI1NiJ9.eyJzdWIiOiJlc2VyVyX29xemw3Z3FQb2lrb2xtNG9xY29mMndlcGhtIiwinRpi-joiand0X2FhYWFkYXZ2aG12Y2JpdDRnbDVsNGNudDR5d2FwZDI3cnFkd2Z0eDI3cnFkZTByc2FtcnFkd2Z0ZDI3cnFkZTByc2FtIixxx.xxxb51hcGktY24taGFuZ3pobxxx.xxxMuY29xxx.3yiL2xxx.Fx3R1bjI1b3NkbG16Nmd0cWZxM2oycHpwZWZx-L2FwcF9tbDV0emFwc2w3em1mbzUzd2xxx.xxxaGFzaCI6IkUxcm9oRnlpR2FZYmJnTS.xxxtudHZpIiwiYXRf-IrODYgMTg2IDkxNzEgMjQ5MS.xxx.xxx.BanFbeM28p\nYp-aiEymtvy-QC-6VjohuSSi.xxx\nE9c3RTMntC66D7fxTGME2x.xxx.Et\nrwPRUTM-2AF74y2NVFtpNdkxbLenyz1duwTpeGANmgLGxxxJrZvKyNxBjAV6TZjGrUVVNICbU1_sg", "...": "..." } } -
将上一步骤中Bearer之后请求携带的JWT在JWT Debugger中进行解析。
关于JWT Debugger的更多信息,请参见JWT debugger。
预期结果:解析结果显示,HEADER 中
alg为RS256;PAYLOAD 为 OIDC ID Token 的标准 Claims 结构,包含sub、jti、iss(阿里云 EIAM 实例的 OIDC 端点地址)、iat、nbf、exp、aud、at_hash、c_hash、email、email_verified、phone_number、phone_number_verified、name、preferred_username、updated_at等字段。解析成功后,您可以看到如上信息。其中附带IDaaS中存储的用户信息,并且当前的JWT已经经过了ASM的校验。