基於saml的單點登錄介紹

基於SAML的單點登錄介紹

一、背景知識:

      SAML即安全斷言標記語言,英文全稱是Security Assertion Markup Language。它是一個基於XML的標準,用於在不同的安全域(security domain)之間交換認證和授權數據。在SAML標準定義了身份提供者(identity provider)和服務提供者(service provider),這兩者構成了前面所說的不同的安全域。 SAML是OASIS組織安全服務技術委員會(Security Services Technical Committee)的產品。

    SAML(Security Assertion Markup Language)是一個XML框架,也就是一組協議,可以用來傳輸安全聲明。比如,兩臺遠程機器之間要通訊,爲了保證安全,我們可以採用加密等措施,也可以採用SAML來傳輸,傳輸的數據以XML形式,符合SAML規範,這樣我們就可以不要求兩臺機器採用什麼樣的系統,只要求能理解SAML規範即可,顯然比傳統的方式更好。SAML 規範是一組Schema 定義。

可以這麼說,在Web Service 領域,schema就是規範,在Java領域,API就是規範。

  SAML 作用

SAML 主要包括三個方面:

1.認證申明。表明用戶是否已經認證,通常用於單點登錄。

2.屬性申明。表明 某個Subject 的屬性。

3.授權申明。表明 某個資源的權限。

  SAML框架

SAML就是客戶向服務器發送SAML 請求,然後服務器返回SAML響應。數據的傳輸以符合SAML規範的XML格式表示。

SAML 可以建立在SOAP上傳輸,也可以建立在其他協議上傳輸。

因爲SAML的規範由幾個部分構成:SAML Assertion,SAML Prototol,SAML binding等

  安全 
由於SAML在兩個擁有共享用戶的站點間建立了信任關係,所以安全性是需考慮的一個非常重要的因素。SAML中的安全弱點可能危及用戶在目標站點的個人信息。SAML依靠一批制定完善的安全標準,包括SSL和X.509,來保護SAML源站點和目標站點之間通信的安全。源站點和目標站點之間的所有通信都經過了加密。爲確保參與SAML交互的雙方站點都能驗證對方的身份,還使用了證書。

   應用

   目前SAML已經在很多商業/開源產品得到應用推廣,主要有:

IBM Tivoli Access Manager 
Weblogic 
Oblix NetPoint 
SunONE Identity Server 
Baltimore, SelectAccess 
Entegrity Solutions AssureAccess 
Internet2 OpenSAML 
Yale CAS 3 
Netegrity SiteMinder 
Sigaba Secure Messaging Solutions 
RSA Security ClearTrust 
VeriSign Trust Integration Toolkit 
Entrust GetAccess 7

 

二、基於 SAML的SSO

下面簡單介紹使用基於SAML的SSO登錄到WebApp1的過程(下圖源自SAML 的 Google Apps SSO,筆者偷懶,簡單做了修改)

saml_workflow_vertical2

 

此圖片說明了以下步驟。

  1. 用戶嘗試訪問WebApp1。

  2. WebApp1 生成一個 SAML 身份驗證請求。SAML 請求將進行編碼並嵌入到SSO 服務的網址中。包含用戶嘗試訪問的 WebApp1 應用程序的編碼網址的 RelayState 參數也會嵌入到 SSO 網址中。該 RelayState 參數作爲不透明標識符,將直接傳回該標識符而不進行任何修改或檢查。

  3. WebApp1將重定向發送到用戶的瀏覽器。重定向網址包含應向SSO 服務提交的編碼 SAML 身份驗證請求。

  4. SSO(統一認證中心或叫Identity Provider)解碼 SAML 請求,並提取 WebApp1的 ACS(聲明客戶服務)網址以及用戶的目標網址(RelayState 參數)。然後,統一認證中心對用戶進行身份驗證。統一認證中心可能會要求提供有效登錄憑據或檢查有效會話 Cookie 以驗證用戶身份。

  5. 統一認證中心生成一個 SAML 響應,其中包含經過驗證的用戶的用戶名。按照 SAML 2.0 規範,此響應將使用統一認證中心的 DSA/RSA 公鑰和私鑰進行數字簽名。

  6. 統一認證中心對 SAML 響應和 RelayState 參數進行編碼,並將該信息返回到用戶的瀏覽器。統一認證中心提供了一種機制,以便瀏覽器可以將該信息轉發到 WebApp1 ACS。

  7. WebApp1使用統一認證中心的公鑰驗證 SAML 響應。如果成功驗證該響應,ACS 則會將用戶重定向到目標網址。

  8. 用戶將重定向到目標網址並登錄到 WebApp1。

 

三、開源資源:

1,SAML SSO for ASP.NET 
http://samlsso.codeplex.com/

      其中SAML組件使用的是ComponentSpace SAML v2.0 for .NET,此組件貌似是澳洲一家公司開發的,收費,但不貴。

裏邊有VS05,08,10的例子(部分例子是C#,部分是vb.net),也有java調用.net SSO的例子。

2,a set of WinForms and WebForms SAML demos with Full Source Code

 http://samlclients.codeplex.com/

     此開源項目採用的是UltimateSaml.dll SAML組件,但不開源。裏邊同時有C#、Vb.net的例子,Webform及winform的例子。

四、網友的文章推薦:

  1. 揭開SAML的神祕面紗(轉) 
    http://www.cnblogs.com/perfectdesign/archive/2008/04/10/saml_federation.html

  2. Web 單點登錄系統 
    http://blog.csdn.net/shanyou/article/details/5372233

  3. 基於SAML的單點登錄.NET代理端實現方案 
    http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html

  4. SAML

      http://blog.csdn.net/chmsword/article/details/4269602

 

五、本人實現的SSO(介紹建立一個demo簡單的思路)

  1. 採用開源項目http://samlsso.codeplex.com/

  2. 建立一個認證中心(IDP),二個web應用(SP1),一個類庫SSO.Client

a,其中IDP包括2+3個網頁 
2個:一個Default.aspx,一個Login.aspx 
3個:SSOService.aspx(單點登錄服務),SingleLogoutService.aspx(單點登錄退出服務),ArtifactResponder.aspx(HTTP-Artifact應答服務)

b,2個Web的應用結構類似

1+3個網頁 
1個:default.aspx主頁,獲取登錄信息 
3個:AssertionConsumerService.aspx(校驗IDP返回的SAML服務) 
SingleLogoutService.aspx(校驗IDP返回的退出請求及響應) 
ArtifactResponder.aspx(HTTP-Artifact應答服務)

c,SSO.Client類庫

      主要包括一個SSOEntry 及SSOConfig(配置類)【思想可以參考:基於SAML的單點登錄.NET代理端實現方案http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html

 

其中SSOEntry部分代碼如下:

public class SSOEntry : System.Web.IHttpModule  , IRequiresSessionState, IConfigurationSectionHandler 
   { 
         #region IHttpModule 成員

       System.Web.HttpApplication Context;

       public void Dispose() 
       { 
           // throw new Exception("The method or operation is not implemented."); 
       }

       public void Init(System.Web.HttpApplication context) 
       { 
           Context = context; 
           context.AcquireRequestState += new EventHandler(context_BeginRequest);

       } 
       public object Create(object parent, object configContext, XmlNode section) 
       { 
           NameValueSectionHandler handler = new NameValueSectionHandler(); 
           return handler.Create(parent, configContext, section); 
       }

       void context_BeginRequest(object sender, EventArgs e) 
       { 
           HttpApplication application = (HttpApplication)sender;

           Uri url = application.Request.Url; 
           //如果不是aspx網頁,就不管他了,還可以再加上其它條件,根據正則過濾一些無需單點登錄的頁面 
           if (!url.AbsolutePath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase) || url.AbsolutePath.IndexOf("/SAML")>-1) 
               return;

           HttpResponse Response = Context.Response; 
           //Response.AddHeader("P3P", "CP=CAO PSA OUR");//加上這個,防止在Iframe的時間Cookie丟失

           if ("" == Context.User.Identity.Name) 
           { 
               RequestLoginAtIdentityProvider(application);  // 這個方法可以參考開源項目,此處不介紹 
           }

       }

       #endregion

…… 其它代碼省略

}

 

d,WebSite1,WebSite2調用SSO.Client

只需修改Web應用的web.config配置文件即可,加入如下配置信息。這樣在請求Web應用的aspx頁面時,將首先通過SSO.Client.SSOEntry的context_BeginRequest方法判斷用戶是否已登錄,若未登錄或者已超時則生成SAML請求轉發至統一認證中心(IDP)

<!--模塊或子系統配置段配置信息--> 
<configSections> 
   <section name="SSO" type="SSO.Client.SSOEntry,SSO.Client"/> 
</configSections> 
<!--單點登陸配置信息-->

<SSO>

   <!--單點登陸登陸頁面地址--> 
   <add key="SSO.DefaultURL" value="http://127.0.0.1/website1"/> 
   <!--單點登陸服務的頁面地址--> 
   <add key="SSO.SSOServiceURL" value="http://127.0.0.1/SSOIDP/SAML/SSOService.aspx"/> 
   <add key="SSO.LogoutServiceURL" value="http://127.0.0.1/SSOIDP/SAML/SingleLogoutService.aspx"/> 
   <!-- 
     Configuration for communicating with the IdP. 
     Valid values for ServiceBinding(SP to IDP) are: 
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST 
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect 
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact 
   --> 
   <add key="SSO.SpToIdpBinding" value="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/> 
   <!-- 
   Valid values for ServiceBinding(IDP to SP) are: 
   urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST 
  urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact 
  --> 
   <add key="SSO.IdpToSPBinding" value="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/> 
   <!--<add key="SSO.ArtifactResolutionServiceURL" value="http://127.0.0.1/SSOIDP/SAML/ArtifactResolutionService.aspx"/>--> 
</SSO>

 

六、基於SAML的SSO的好處

  1. 出現大大簡化了SSO,提升了安全性

  2. 跨域不再是問題,不需要域名也可訪問

  3. 不僅方便的實現Webform、Winform的單點登錄,而且可以方便的實現java與.net應用的單點登錄

 


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