全部產品
Search
文件中心

Alibaba Cloud Service Mesh:ASM整合阿里雲IDaaS實現網格內應用單點登入

更新時間:Jun 12, 2026

本文介紹如何在ASM中實現網格內應用的單點登入。

前提條件

背景資訊

當前很多應用都需要進行存取控制,登入成功的使用者才有許可權訪問。隨著系統複雜度的提升,“單點登入”成為了一個很好的解決方案,您可以使用一個帳號登入多個系統。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雲身份服務執行個體及測試帳號

  1. 登入EIAM雲身份服務控制台,建立IDaaS執行個體。

    說明

    一個IDaaS執行個體可以被視為一個帳號系統。建立一個IDaaS執行個體,相當於建立了一個獨立的帳號系統。

  2. EIAM 云身份服务頁面,單擊目標IDaaS執行個體名稱。

  3. 在左側導覽列,選擇账户 > 账户与组织

  4. 账户頁面的账户頁簽,單擊创建账户

  5. 创建账户面板,設定賬戶資訊,然後單擊确定

步驟二:添加和配置OIDC應用

您可以將IDaaS執行個體中的應用理解為介面。IDaaS執行個體可以用不同的應用暴露介面,以各種方式進行單點登入。本文使用OIDC應用進行示範。

  1. 在雲身份服務控制台左側導覽列,單擊应用管理

  2. 应用管理頁面,單擊添加应用

  3. 添加应用頁面,單擊标准协议頁簽,在OIDC卡片中單擊添加应用

  4. 添加应用-OIDC 协议對話方塊,配置应用名称,然後單擊立即添加

  5. OIDC 应用詳情頁面,選擇登录访问 > 单点登录

  6. 单点登录配置頁面,設定登录 Redirect URI。單擊显示高级配置,在用户信息范围,選擇您需要擷取的資訊,然後單擊保存

    在左側導覽列單擊應用,選擇目標應用後單擊登入訪問頁簽,進入單點登入子頁簽。使用者資訊範圍可選的 scopes 包括 openidemailphoneprofile

    說明

    本例中的Redirect URI設定為http://${ASM網關的CLB地址}/oauth2/callback。請將${}替換為您實際的地址。

  7. OIDC 应用詳情頁面,選擇登录访问 > 应用授权,然後單擊添加授权

  8. 添加授权對話方塊,為步驟一建立的使用者授權,然後單擊保存授权

完成OIDC應用的配置後,您需要記錄當前應用的Issuerclient_idclient_secret等配置資訊,以便在ASM中配置單點登入使用。

  • Issuer:在OIDC應用的登录访问 > 单点登录 > 应用配置信息地區擷取。Issuer:在 OIDC 應用的登入訪問 > 單點登入頁面下方的應用配置資訊地區擷取,該欄位用於校正 token 發放來源,同時是各端點 URL 的 baseUrl。

  • client_idclient_secret:在OIDC應用的通用配置地區擷取。

步驟三:部署測試應用並將其暴露於網關

本文使用httpbin應用作為測試,該應用可以輔助查看請求內容,便於驗證登入後從IdP處擷取的資訊。

  1. 使用以下內容,在ACK叢集的default命名空間下部署httpbin應用。

    展開查看YAML內容

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. 使用以下內容,在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
  3. 使用以下內容,將虛擬服務應用到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
  4. 配置完網關規則和虛擬服務後,您可以直接通過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單點登入

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格資訊安全中心 > 自訂授權服務,然後單擊關聯自訂授權服務

  3. 關聯自訂授權服務頁面,單擊OIDC身份認證授權服務頁簽,進行相關配置,然後單擊建立

    說明

    OIDC應用的相關資訊由步驟二擷取。您可以使用ASM網關作為登入重新導向地址。關於Cookie Secret的更多資訊,請參見Cookie Secret的產生

  4. 使用資料平面叢集KubeConfig,執行以下命令,擷取OIDC外部授權服務網域名稱。

    kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}'
  5. 使用以下內容,建立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的路徑。

步驟五:建立授權策略

  1. 在網格詳情頁面左側導覽列,選擇網格資訊安全中心 > 授權策略,然後在右側頁面,單擊使用YAML建立

  2. 建立頁面,選擇命名空間情境模板,配置如下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網關的請求進行授權。

步驟六:結果驗證

  1. 在瀏覽器中訪問http://${ASM網關外部IP:80}

    顯示如下頁面,說明單點登入生效。頁面顯示 OAuth2 Proxy 登入頁面,其中包含 Sign in with OpenID Connect 按鈕,表明 OAuth2 Proxy 已成功部署並與 OpenID Connect 整合。

  2. 單擊Sign in with OpenID Connect

    預期結果:頁面跳轉至阿里雲 IDaaS 登入頁面,顯示賬戶名、手機號或郵箱密碼輸入框及登入按鈕,表明 OpenID Connect 單點登入配置已生效。

  3. 阿里云IDaaS的登入頁面,輸入步驟一建立的測試帳號以及密碼,然後單擊登入

    預期結果:登入成功後,頁面跳轉至 httpbin.org 的 Swagger API 文檔頁面(版本 0.9.2),頁面描述為 A simple HTTP Request & Response Service.,並列出 HTTP MethodsAuthStatus codesRequest inspection 等 API 分組,表明 IDaaS 單點登入配置驗證成功。

  4. 單擊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",
        "...": "..."
      }
    }
  5. 將上一步驟中Bearer之後請求攜帶的JWT在JWT Debugger中進行解析。

    關於JWT Debugger的更多資訊,請參見JWT debugger

    預期結果:解析結果顯示,HEADER 中 algRS256;PAYLOAD 為 OIDC ID Token 的標準 Claims 結構,包含 subjtiiss(阿里雲 EIAM 執行個體的 OIDC 端點地址)、iatnbfexpaudat_hashc_hashemailemail_verifiedphone_numberphone_number_verifiednamepreferred_usernameupdated_at 等欄位。解析成功後,您可以看到如上資訊。其中附帶IDaaS中儲存的使用者資訊,並且當前的JWT已經經過了ASM的校正。