【譯文】理解ASP.NET 2.0中的單點登入

來源:互聯網
上載者:User
  輝郎註:這是偶剛剛看到的一篇文章,感覺不錯,所以忍不住翻譯了過來,各位兄弟也可以看得方便一點。偶英文水平有限有不妥之處還望批評指正(不是有限是很爛,兄弟們手下留情哦~~~)。

  文章原文:Understanding Single Sign-On in ASP.NET 2.0

理解ASP.NET 2.0中的單點登入

Published: 16 Jan 2008

摘要


在這篇文章中,Masoud討論了應用ASP.NET中統一身分識別驗證模型進行跨應用程式驗證的問題,包括:Membership Providers, web.config配置,設定檔的加密解密等。在文章的最後,作者提供了通過ASP.NET login controls來驗證的程式。
by Masoud Tabatabaei

目錄

:

    • 簡介
    • 什麼是SSO?它是怎樣工作的?
    • 系統條件
    • 工作
    • 下載
    • 結論

  • 簡介

通常在你要實現ASP.NET web應用程式的身分識別驗證時,你需要為你的每一個應用程式建立一個登入頁面。想象一下,如果你有兩個或者更多的互相關聯的web應用程式,你可能希望通過某種機製為你的所有帶相關 App程式實現僅出現一次登入頁面。這樣,一旦你登入了一次,你就可以瀏覽所有的關聯程式,而不再需要額外的登入了。單點登入(SSO)就是這樣的存取控制機制,它允許一個使用者通過一次驗證就可以訪問所有軟體系統資源。

試想你在你的伺服器上建立了兩個或者更多的web網站。就像其他的web網站一樣,你只是使用ASP.NET許可權驗證機制來驗證你的使用者。那麼,你的這些網站可能需要一個或更多的登入頁面。現在你正試圖證明怎麼樣通過更改你的配置來實現跨程式登入。換句話說,我們只想給我們的程式配置一個登入頁面,並且一旦使用者通過了驗證,他就可以瀏覽其他所有的網站,而不需要另外的登入。在這篇文章的附錄中,你也可以看到如何加密你的設定檔。

什麼是單點登入?它是怎樣工作的?

在許多的公司裡,他們有一些以web網站或web應用程式為表現層的系統。自然,由於安全議題他們將需要通過基於ASP.NET 2.0,通過Membership Provider 和 Role Provider 或者定製實現許可權驗證和許可權驗證系統。不論怎樣,所有的網站都會預設有一個確定使用者的ID和密碼在資料庫中是否有效”login.aspx” web表單.當你只有一個網站或者這些網站都是獨立運行時,這樣做是沒有問題的。但是當你有兩個或多個網站,而且網站間是關聯在一起或連結在一起的,你沒準就會問:為什麼每個應用程式你都必須登入一次?為什麼你不可以只有一個”login.aspx”來實現驗證,並讓所有不關聯程式真正統一起來。幸運的是,在ASP.NET 2.0中你可以通過同樣的配置來實現跨應用程式訪問,不論是你的新的網站還是已經存在的網站。

在ASP.NET設定檔(web.config)中有一個配置節(在<system.web中)命名為<machineKey>,負責加密和解密表單(這些表單可以讀表單許可權驗證cookies)許可權認證的cookie資料和view-state資料,也負責校正進程外(out-of-process)session 狀態標識。所以當使用者一旦被驗證通過並且有一個cookie儲存到了本機電腦,其他擁有同樣<machineKey>配置的應用程式也可以識別此cookie為有效許可權票據。所以在其他擁有同樣<machineKey>配置的應用程式中就不再需要第二次登陸了。

由於<machineKey>資訊是敏感的,你需要加密設定檔中的此節資訊。為了實現這個目標,我將使用ConfigurationManager類和他的方法。這裡還有一個類SectionInformation,包含有配置中單個配置節的中繼資料。此類中有個方法ProtectSection(),用來解密你的設定檔的配置節。

系統條件

·         A web server running on Windows 2000 or later

·         .NET Framework 2.0

·         Visual Studio 2005

·         Microsoft SQL Server 2005 Express Edition

現在讓我們來看看在我們的項目中發生了什麼。我有一個網站(Aspalliance1)網站中包含一個登入頁面”Login.aspx”.使用者可以通過此頁來進行許可權驗證。在這個網站裡還有一個頁面叫做”Default.aspx”,它有一個header和一些文本另外還有一個到Aspalliance2網站的連結。你將會看到一旦這個使用者登入了,他可以導航到其他網站而不需要第二次登陸。這裡還有一個安置有兩個加密和解密的按鈕的頁面”Encryption.aspx”,用來加密和解密設定檔。

就像我之前所說的那樣,你可以通過在你的web設定檔中一點點小小的配置實現跨應用程式訪問。在web.config檔案中,有一個名為<system.web>的配置節。我們將對<system.web>做相同的配置,只需要將配置節<machineKey>和它的值放到<system.web>配置節中。<machineKey>有一些屬性,我將要去配置他們。首先,就是指定用來驗證的加密類型。validationKey 定義了用來驗證解密資料的key,decryptionKey定義了用來加密和解密的資料的key,抑或是key產生的過程。

清單 1: 配置web.config中的machineKey

<machineKey       

validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF

21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141"

decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099"      

validation="SHA1"/>

這個範例代碼並沒有被加密,並且它不會被發布到伺服器上。因為處於安全考慮,發布到伺服器的<machineKey>的加密是非常重要的。你可以在清單2中看到加密後的<machineKey>。

清單 2: web.config 中加密後的machineKey

<machineKeyconfigProtectionProvider="RsaProtectedConfigurationProvider">

      <EncryptedDataType="http://www.w3.org/2001/04/xmlenc#Element"

        xmlns="http://www.w3.org/2001/04/xmlenc#">

        <EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />

        <KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#">

          <EncryptedKeyxmlns="http://www.w3.org/2001/04/xmlenc#">

            <EncryptionMethodAlgorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />

            <KeyInfoxmlns="http://www.w3.org/2000/09/xmldsig#">

              <KeyName>Rsa Key</KeyName>

            </KeyInfo>

            <CipherData>

              <CipherValue>

lm3mfPX/94Zm3HgdbsmKiIxbrWM14t3/ugxs40BFOAHbIaCtwQ3gVQusFtOFVUoNVny01kgBCeh10rVEId

djNZ/8luBNoCbHm8OLjgPLHVrT+G0c/LRpESJk2ni/Jy2sWKXlgejgSQ1W5NE53GZtG3s9hu+nk4OWxntS

6z3v7AM=

              </CipherValue>

            </CipherData>

          </EncryptedKey>

        </KeyInfo>

        <CipherData>

          <CipherValue>

BCEGUV/dh1Imbcm5vn0Kn8NrD+EX+KemenR7x+VekwT1ZO6y5+jRyF4RDWMJCfJ1jHC36+MAfCdHuXN0rP

B6hu5YUtX9VA5q5N0NGrs9AIpG+0ihuuS3HDzQe3P6nlI30m1h0pmL1yJBovY0i6fbCA6++GT2MdwCLERk

+PVWmoq7p1q97n5pNzNqhVKCX45lhS5ySVS+MjJXVeTrcatftpvaUcjLsNcL2kMerzf5w/SU3AbLEuY04w

dgYWX5tWzxqeUcghdlWLD0tQi8qyyfVfzXPYozR5sspWHdgqmAycrACHN2dcONWPjT4BanRWb1ouKuP8K+

0CEFE/Hj2ChpYw==

          </CipherValue>

        </CipherData>

      </EncryptedData>

</machineKey>

你可以通過Configuration、SectionInformation兩個類來加密你的設定檔。為了加密和解密你的<machineKey>讓我們來寫一些代碼吧。SectionInformation類有一個方法ProtectSection(),可以得到一個描繪Protection Provider的字串比如"RSAProctedConfigurationProvider",並且加密這個配置節。這裡還有一個Boolean類型的屬性ForceSave,當需要配置類的save方法儲存設定檔時需要將它設定為true。這裡有"Encryption.aspx"頁面的代碼,頁面中包含有兩個按鈕來加密和解密設定檔。

清單 3:web設定檔的加密代碼

protected void btnEncrypt_Click(object sender, EventArgs e)

{

  try

  {

    Configuration config = WebConfigurationManager.OpenWebConfiguration(

      "/Aspalliance1 ");

    ConfigurationSection machineKeySection = config.GetSection(

      "system.web/machineKey");

    machineKeySection.SectionInformation.ProtectSection(

      "RSAProtectedConfigurationProvider");

    machineKeySection.SectionInformation.ForceSave = true;

    config.Save();

    Response.Write("<h2 style='color:red'>Encryption Succeed</h2>");

  }

  catch (Exception ex)

  {

    Response.Write("<h2 style='color:red'>Error while encrypting</h2><br/>");

    Response.Write(ex.Message);

  }

}

清單 4: web設定檔的解密代碼

protected void btnDecrypt_Click(object sender, EventArgs e)

{

  try

  {

    Configuration config = WebConfigurationManager.OpenWebConfiguration(

      "/Aspalliance1 ");

    ConfigurationSection machineKeySection = config.GetSection(

      "system.web/machineKey");

    machineKeySection.SectionInformation.UnprotectSection();

    machineKeySection.SectionInformation.ForceSave = true;

    config.Save();

    Response.Write("<h2 style='color:red'>Decryption Succeed</h2>");

  }

  catch (Exception ex)

  {

    Response.Write("<h2 style='color:red'>Error while decrypting</h2><br/>");

    Response.Write(ex.Message);

  }

}

現在你必須在這個網站中設定相同的配置。首先你需要更改你的表單驗證部分的loginUrl,這個表單將被用來將匿名使用者跳轉到”Login.aspx”頁。只是,現在它將把使用者重新導向到Aspalliance1網站中的”Login.aspx”頁。

清單 5: 設定 web.config中的驗證節

<authentication mode="Forms">

<forms loginUrl="http://localhost/Aspalliance1/login.aspx"name=".ASPXAUTH"/>

</authentication>

如果你想實現跨程式登入你的好多網站時,最重要的一點就是你必須把你的兩個或更多的網站配置為相同的<machineKey>。所以我只需要拷貝並粘貼Aspalliance1 網站中的<machineKey>配置節到Aspalliance2網站。現在都已經準備好了,你可以測試你的網站了。

清單 6: 設定web.config 中的 machineKey

<machineKey       

validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF

21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141"

decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099"      

validation="SHA1"/>

[下載]

測試這個網站的話,可以使用使用者名稱:Admin密碼:123456&來登入。

這個下載附件中有一個VS 2005項目,其中包含有兩個網站:aspalliance1 and aspalliance2.

要安裝這個執行個體的話,你需要建立兩個IIS虛擬目錄命名為:aspalliance1 和 aspalliance2,並將地址指向相應的檔案夾。你也可以通過Visual Studio 2005開啟網站。

當使用者要交叉訪問你的多個網站時,他必須重複登陸實在是麻煩。所以,如果只讓使用者登入一次,那會是非常棒的。實現這些,你只需要給你的"web.config" 檔案增加具有相同值的<machineKey>配置。並且處於安全考慮,我建議你加密這個配置節。這個加密方法在SectionInformation類中通過ProtectSection()方法被重寫了。

文章末尾附上部落格堂大俠寶玉的評論文章:對《Understanding Single Sign-On in ASP.NET 2.0》一文的補充

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.