身份驗證 談談OpenID

2021-04-20 03:49:27 字數 2329 閱讀 4172

說明:此為06年11月寫的舊文,還沒在csdn發過,補發一下。

聽說今年的網誌年會上有乙個討論openid的專題。對於**的身份驗證問題不算乙個新話題,自從當年ms推出並熱炒passport的時候就已經開始了。即使是openid也出來有一陣子了。

不過我是看了前一段zola對openid的大力推廣之後,才開始去了解這個技術。雖然openid有自己很大的優勢,但同樣存在著一些目前不可克服的困難。

首先簡單地把目前的身份驗證手段分為三類:

1、整合驗證。就是現在大多數**所採用的方式,你要在這個**訪問,就要在這個**註冊乙個使用者,並且以這個使用者身份登入。

2、第三方驗證。如ms的passport。服務提供**不記錄使用者身份,而是通過向第三方(如ms)提請驗證使用者的身份。

3、 分布式驗證。以openid為例,它的驗證過程要麻煩一些:使用者以乙個url作為身份標識,這個url所指向的頁面包含了使用者所選擇的驗證伺服器 (yadis),當使用者以這個url登入服務提供**時,**從這個url取得yadis資訊,然後轉向yadis**,使用者在yadis**輸入密碼以 確認身份後,最後反饋到最初的服務提供**。

第一類驗證的優點是簡單方便,並且對於**來說,可以獨佔使用者資源。但缺點也是很明顯的:對於 使用者來說,要記住自己在每個**上的使用者名稱和密碼並不是一件容易的事——因為難免碰到使用者名稱重複的情況而不得不改變自己的使用者名稱,或是不放心**的使用者資 料管理而在不同**用不同的密碼。

第二類驗證提供了乙個統一的驗證渠道,對於使用者來說方便很多,而且由ms這樣的大公司提供驗證服務也感覺 比較有保障。但對於**來說就損失了自己的使用者資源,特別是當這些**與ms存在競爭的可能性時,他們就更加不願意了。而且還有乙個潛在的風險就是,一但 這個第三方驗證失效(比如gfw),也會受到連帶的影響。

貌似openid是最好的解決方案?

但我認為,這只是看上去很美。

首先,從使用方便性上看,url通常太長了,除非使用者擁有自己的網域名稱,否則使用blog或個人主頁之類的東東通常都太長了一點。而且輸入url以後還需要轉到yadis上去輸入密碼(當然**也可以實現成一步完成,由**到yadis上去驗證,但存在風險,見《安全支付》),這也是比較麻煩的。

其次,第一類驗證可以在**上完成,不需要多餘的round-trip,響應速度最快;第二類需要到第三方驗證**轉一圈,會慢一點;而openid需要到使用者url和yadis上各轉一圈,響應速度最慢。

第 三,絕大部分使用者是不可能自己建立yadis的,所以結果還是要交給第三方yadis做驗證,還是不可避免出現與第二類相似的集中情況。相當大部分使用者甚 至連blog和個人主頁都沒有,所以還不得不在如myopenid這樣的**上註冊一下,取得乙個openid專用的url,結果就與第二類驗證沒什麼區 別了。

第四,從安全性考慮,openid使用的yadis可以由使用者自己選擇,而各yadis在安全性方面存在良莠不齊的情況,使用者的資料安全風險還是比較大的。

第 五,可靠性差。表面上openid將驗證過程分布到很多的yadis上,似乎會比較安全,但實際上除非使用者自己能夠在url頁面上作yadis的容錯備份 (在頁面上做幾個yadis的鏈結,這只是我的想法,至於openid是否支援這樣做,我還沒有找到進一步的資料),否則一旦使用者所選擇的yadis失 效,則使用者就無法正常使用了。而最大的風險還在於使用者url頁面可能失效。

從驗證失效的風險上來看:

第一類驗證如果失效,只是那個**無法訪問,不會影響到使用者訪問其它的**。假設**的可靠性為n(n為小於1的數,比如99%),則總的可靠性也為n。

第二類驗證如果失效,則使用者所有依賴這個驗證的訪問都將失敗,但就某乙個**來說,其總可靠性為n*a(a為驗證**的可靠性,比如99.99%),比第一類的可靠性要低一些。當然因為這類驗證**都是由大公司提供,可靠性通常會很高,所以與第一類的可靠性差別可以忽略。

而 對於openid來說,使用者url和yadis之間,只要有乙個失效,則使用者的相關訪問都將無法進行。以單個**來說,其總可靠性為n*u*y(u和y分 別是使用者url頁面和yadis的可靠性),如果是用mblogger的頁面來做url的話,假設其可靠性為80%,而所用的yadis可靠性為95%, 則總可靠性將大幅下降到:76%。當然這是乙個極端的例子,我想不會有人拿mblogger這種靠不住的頁面來做自己的openid url的,而且一般的yadis可靠性應該也不致於這麼低(但也還是不如ms的passport)。

但總的來說openid的失效風險還是要遠大於前兩類驗證的。

基本上在我看來,openid在解決了前兩類驗證方式的缺點的同時,也帶來很多的問題。

附 加說明:本來我還以為google account是一種類似於passport的第三方驗證手段,但是經過幾天的研究後發現,它只提供了對部分google服務的帳戶訪問功能,拒絕對第三 方提供使用者身份驗證服務,這實在是一件很遺憾的事情,否則google account應該會是比openid更好的選擇。

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...