CAS-認證流程詳解

基礎知識

名詞解釋

AS

Authentication Service:認證服務,發放TGT

KDC

Key Distribution Center:密鑰發放中心

TGS

Ticket-Granting Service:票據授權服務,索取TGT,發放ST

TGC

ticket-granting cookie:授權的票據證明,由CAS Server通過SSL方式發送給終端用戶。該值存在Cookie中,根據TGC可以找到TGT

TGT

Ticket Granting tieckt:俗稱大令牌,或者票根,由KDCAS發放,獲取該票據後,可直接申請其他服務票據ST,不需要提供身份認證信息

ST

Service Ticket:服務票據,由KDCTGS發放,ST是訪問server內部的令牌


CAS認證流程

CAS (Central Authentication Service)中央身份驗證服務認證流程如下:

image-20200608144426800

  1. 訪問服務:由於CAS clientWEB應用部署在一起,當用戶訪問WEB應用時,CAS client就會處理請求
  2. 定向認證:CAS client客戶端校驗HTTP請求中是否包含STTGT,如果沒有則會重定向到CAS server地址進行用戶認證
  3. 用戶認證:用戶通過瀏覽器填寫用戶信息,提交給CAS Server認證
  4. 發放票據:CAS Server校驗過用戶信息後,爲CAS client發放ST,並在瀏覽器cookie中設置TGC,下次訪問CAS Server時會根據TGCTGT驗證,判斷是否已經登錄
  5. 驗證票據:CAS Client拿到ST後,再次請求CAS Server驗證ST合法性,驗證通過後允許客戶端訪問
  6. 傳輸用戶信息:CAS Server校驗過ST後,傳輸用戶信息給CAS client

代碼示例

phpCAS庫: https://github.com/apereo/phpCAS

使用phpCAS實現對於訪問www.baidu.com的訪問控制

<?php

require_once  './vendor/apereo/phpcas/CAS.php';

$home = 'http://www.baidu.com/';
$login_url = 'http://10.91.156.174:8080/cas/login?service='.urlencode($home);
$logout_url = 'http://10.91.156.174:8080/cas/logout';
$service_validate_url = 'http://10.91.156.174:8080/cas/serviceValidate';

phpCAS::setDebug();
//設置client屬性
phpCAS::client(CAS_VERSION_2_0, "10.91.156.174", 8080, "/cas");

// 設置 Login url
phpCAS::setServerLoginURL($login_url);
// 設置 logout url
phpCAS::setServerLogoutURL($logout_url);
// 設置 validate url
phpCAS::setServerServiceValidateURL($service_validate_url);

// cas server 設置不校驗 ssl 證書
phpCAS::setNoCasServerValidation();

// 這個方法確保用戶是否驗證過,如果沒有驗證則跳轉到驗證界面。
phpCAS::forceAuthentication();

通過php -S localhost:8080啓動服務


首次登陸流程

受訪問控制的資源地址爲:http://www.baidu.com/

1.訪問服務

通過訪問localhost:8080訪問本地WEB服務,發現沒有用戶登錄信息,便會生成login url,並重定向到該地址。其中login_urlservice參數代表受訪問控制的資源

image-20200608214233860


2.定向認證

瀏覽器收到重定向響應後,請求login_url,等待用戶輸入用戶名密碼

image-20200608214248361


3.用戶認證

用戶輸入用戶名密碼提交表單後,CAS server對提交信息進行校驗。通過校驗後,會將瀏覽器重定向到service參數後的url,並且後面攜帶了一個ticket令牌,該參數就是ST。同時在Cookie中設置CASTGC,該Cookie是訪問service_urlcookie,只有訪問該地址纔會攜帶這個cookie

Cookie中添加CASTGC的目的是爲了下次訪問service_url時,瀏覽器請求時攜帶TGC參數,服務器根據該TGC查找對應的TGT,從而判斷用戶是否登錄過了,是否需要展示登錄頁面。TGTTGC的關係就像SESSIONCookieSESSIONID的關係。

image-20200608214703432


4.發放票據

CAS server會生成ST服務票據,然後將瀏覽器重定向到$service_url?ticket=$service-ticket

image-20200608161934466


5.驗證票據

CAS客戶端取出ticket,生成$service_validate_url,然後向$service_validate_url發送請求從而驗證ST。驗證ticketURL形如:

http://${cas_server_host}:${cas_server_port}/cas/serviceValidate?ticket=${service-ticket}&service=http://www.baidu.com

CAS server校驗通過後,會再次重定向回service_url,展示相關資源到瀏覽器中

image-20200608214834183


第二次登陸流程

1.訪問服務

訪問本地WEB服務,跳轉到login_url

image-20200608215145472


2.簽發票據

2.由於之前訪問過一次,所以此次login_url中帶了之前獲取出的CASTGC,認證中心在收到請求後,發現TGC對應一個TGT,於是用TGT簽發一個ST,並且返回給瀏覽器

image-20200609095147550


3.驗證票據

瀏覽器向cas server發出的地址進行重定向,並校驗ST,校驗成功後就可訪問受控制的資源了

image-20200608215220660

總結

簡單點來說整體的流程就是,客戶端請求服務端的login_url,如果攜帶了TGC,服務端返回ST,客戶端再次校驗ST即可;若未攜帶TGC,則跳轉到login_url輸入用戶信息,校驗成功後,服務端將TGC設置到Cookie中返回,並頒發ST,客戶端再次校驗ST即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章