本文介绍如何在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。单击显示高级配置,在用户信息范围,选择您需要获取的信息,然后单击保存。
说明本例中的Redirect URI设置为
http://${ASM网关的CLB地址}/oauth2/callback
。请将${}
替换为您实际的地址。在OIDC应用详情页面,选择 ,然后单击添加授权。
在添加应用授权对话框,为步骤一创建的用户授权,然后单击保存授权。
完成OIDC应用的配置后,您需要记录当前应用的Issuer、client_id、client_secret等配置信息,以便在ASM中配置单点登录使用。
Issuer:在OIDC应用的 区域获取。
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服务。示例输出:
步骤四:启用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}。
显示如下页面,说明单点登录生效。
单击Sign in with OpenID Connect。
预期结果:
在阿里云IDaaS的登录页面,输入步骤一创建的测试账号以及密码,然后单击登录。
预期结果:
单击Request inspection,选择 。
预期结果:
将上一步骤中Bearer之后请求携带的JWT在JWT Debugger中进行解析。
关于JWT Debugger的更多信息,请参见JWT debugger。
预期结果:解析成功后,您可以看到如上信息。其中附带IDaaS中存储的用户信息,并且当前的JWT已经经过了ASM的校验。