在 kerberos 協議中主要是有三個角色的存在:
1. 訪問服務的 client;
2. 提供服務的 server;
3.kdc(key distribution center)金鑰分發中心
注意:
1、kdc 服務缺省會安裝在乙個域的域控中
2、從物理層面看,ad與kdc均為域控制器(domain controller)
3、ad其實是乙個類似於本機sam的乙個資料庫,全稱叫account database,儲存所有client的白名單,只有存在於白名單的client才能順利申請到tgt
4、kdc 服務框架中包含乙個 krbtgt 賬戶,它是在建立域時系統自動建立的乙個賬號,你可以暫時理解為他就是乙個無法登陸的賬號,在發放票據時會使用到它的密碼 hash 值。
先來舉個例子:如果把 kerberos 中的票據模擬為一張火車票,那麼 client 端就是乘客,server 端就是火車,而 kdc 就是就是車站的認證系統。如果client端的票據是合法的(由你本人身份證購買並由你本人持有)同時有訪問 server 端服務的許可權(車票對應車次正確)那麼你才能上車。當然和火車票不一樣的是 kerberos 中有存在兩張票,而火車票從頭到尾只有一張。
在kdc中又分為兩個部分:authentication service和ticket granting service
authentication service:as 的作用就是驗證 client 端的身份(確定你是身份證上的本人),驗證通過就會給一張tgt(ticket granting ticket)票給 client。
ticket granting service:tgs 的作用是通過 as 傳送給 client 的票(tgt)換取訪問 server 端的票(上車的票 st)。st(serviceticket)也被稱之為tgs ticket,為了和 tgs 區分,在這裡就用 st 來說明,所以tgs ticket和st的意思是一樣的。
這就說明了為什麼在kerberos中存有兩種票,其實就是更加細分了其中的驗證,簡單的描述就是首先你拿身份證驗證頭像是不是一樣,是的話就返回一張tgt,然後在通過驗證車票獲得上車的資格,這裡就有對tgt的驗證,通過的話再返回一張st/tgs ticket的票,如果都可以那麼就驗證成功了。
當 client 想要訪問 server 上的某個服務時,需要先向 as 證明自己的身份,然後通過 as 發放的 tgt 向 server 發起認證請求,這個過程分為三塊:
the authentication service exchange:client 與 as 的互動,
the ticket-granting service (tgs) exchange:client 與 tgs 的互動,
the client/server authentication exchange:client 與 server 的互動。
krb_as_req(請求):
client->as:client 先向 kdc 的 as 傳送 authenticator1(內容為client hash加密的時間戳)
krb_as_rep(應答):
as-> client:as根據使用者名稱在ad中尋找是否在白名單中,然後根據使用者名稱提取到對應的ntlm hash,然後會生成乙個隨機數session key,然後返回給client由client的ntlm hash加密的session key-as作為as資料,再返回tgt(使用kdc中krbtgt的ntlm hash加密session key和客戶端的資訊,客戶端的資訊裡面包含了時間戳等資訊)
as驗證的簡述:在 kdc(ad) 中儲存了域中所有使用者的密碼 hash,當 as 接收到 client 的請求之後會根據 kdc 中儲存的密碼來解密,解密成功並且驗證資訊。
驗證成功後返回給 client兩個東西,乙個是由 client 密碼 hash 加密的 session key-as 和 tgt(由 krbtgt hash 加密的 session key 和 timestamp 等資訊)。
krb_tgs_req(請求):
client 接收到了加密後的session key-as 和 tgt 之後,先用自身密碼 hash解密得到session key ,tgt 是由 kdc 中krbtgt的hash加密,所以client 無法解密。這時 client 再用session key加密的timestamp,然後再和tgt 一起傳送給 kdc 中的 tgs(ticketgranting server)票據授權伺服器換取能夠訪問 server 的票據。
krb_tgs_rep(應答):
tgs 收到 client 傳送過來的 tgt 和 session key 加密的 timestamp 之後,首先會檢查自身是否存在 client 所請求的服務。如果服務存在,則用krbtgt的hash解密 tgt。
一般情況下 tgs 會檢查 tgt 中的時間戳檢視 tgt 是否過期,且原始位址是否和 tgt 中儲存的位址相同。
驗證成功之後將返回client兩個東西,乙個是用session key 加密的 session key-tgs,然後另乙個是client要訪問的server的密碼 hash 加密的 session key-tgs(前面和session key加密生成的)生成就是st(tgs)
krb_ap_req(請求):
client -> server 傳送 authenticator3(session key-tgs 加密 timestamp) 和票據 st(server 密碼 hash 加密 session key-tgs)
client 收到 session key 加密生成的 session key-tgs 和 server 密碼 hash 加密 session key-tgs生成的tgs 之後,用 session key 解密得到 session key-tgs,然後把 sessionkey-tgs 加密的 timestamp 和 st(也就是tgs)一起傳送給 server。
krb_ap_rep(應答):
server-> client
server 通過自己的密碼解密 st,得到 sessionkey-tgs, 再用 sessionkey-tgs 解密 authenticator3 得到 timestamp,驗證正確返回驗證成功。
Forms 身份驗證
配置應用程式使用 forms 身份驗證 如果應用程式的根目錄中有 web.config 檔案,請開啟該檔案。複製 在system.web元素中,建立乙個authentication元素,並將它的mode屬性設定為 forms,如下面的示例所示 複製 在authentication元素中,建立乙個fo...
WebService身份驗證
web service身份驗證解決方案一 通過通過soap header身份驗證。1.我們實現乙個用於身份驗證的類,檔名mysoapheader.cs mysoapheader類繼承自system.web.services.protocols.soapheader。且定義了兩個成員變數,userna...
WebServices身份驗證
最近遇到乙個問題,暴露在網路上的web service如何做身份驗證,而不被其他人說是用。mysoapheader.cs類 using system using system.collections.generic using system.linq using system.web namespa...