2012-03-12 49 views
1

我已經搜索(探測,甚至)對此的答案,但迄今尚未提出任何有用的東西。我對ADFS,STS和WIF都很陌生,請原諒任何明顯的無知或不適當的術語使用。 ;)如何查看來自STS/IdP的重定向狀態

我目前通過ADFS將自定義MVC3應用程序與外部IdP集成在一起。 ADFS到IdP的設置完成並正常工作。

該網站的某些部分可由匿名用戶訪問 - 在web.config認證模式下已設置爲無。其他部分受自定義System.Web.Mvc.AuthorizeAttribute裝飾的控制器/操作方法保護。

對使用​​WsFederationAuthenticationModule的web.config進行的所有常規修改都已完成,並且它可以工作95%;用戶可以瀏覽網站的匿名訪問部分。當他們嘗試擊中受保護的部分時,authorize屬性會檢查他們是否在與HttpContext.Current.User關聯的IClaimsPrincipals中擁有來自我們IdP的一些自定義信息,如果沒有,則將ActionResult設置爲401; WsFederationAuthenticationModule啓動並將它們重定向到IdP的登錄頁面。當他們輸入他們的詳細信息時,他們會被一些FedAuth cookies成功重定向,然後授權通過。

問題出現在IdP登錄頁面時。這個特殊的IdP有一個鏈接,可以直接返回到我們的網站(原始請求到同一頁面),這個SAML響應嵌入某處(這是根據他們的文檔)

urn:oasis:names: tc:SAML:2.0:status:AuthnFailed

此時,他們現在是「未經授權」,所有用戶將看到(至少在開發中)是一個401頁面。您必須殺掉會話或以其他方式擺脫該cookie才能重新開始。

我需要做的是攔截來自IdP的重定向請求,並基本檢查該特定的SAML狀態,因爲用戶應該被重定向到未經授權的區域之一,就好像什麼都沒有發生過一樣。我已經在global.asax中嘗試過類似的東西:

protected void Application_Start() 
    { 
     // mvc stuff here.... 

     // add handler to intercept handling creation of security tokens by WsFederationAuthnticationModule 
     FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated; 
    } 

    void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e) 
    { 
     FederatedAuthentication 
      .WSFederationAuthenticationModule 
      .SessionSecurityTokenCreated += WSFederationAuthenticationModule_SecuityTokenCreated; 
    } 

    public void WSFederationAuthenticationModule_SecuityTokenCreated (Object sender, SessionSecurityTokenCreatedEventArgs args) 
    {   
     var token = args.SessionToken; 
     // do something with the session token here e.g. check for SAML status 
    } 

..但我無法看到任何有用的令牌;什麼都沒有表明具體的迴應狀態。事實上,有一個FedAuth cookie 在所有但事實上,從Idp的自定義信息是一個死的放棄,用戶一直在那裏,但以某種方式未能通過身份驗證,但原則上我希望能夠看到該狀態。我可能不得不在IdP處理超時......

也許我這樣做是全部錯誤,或只是普通的老不懂,但可以以某種方式填補我如何確定這些響應狀態?

Phew。謝謝! :D

回答

2

好吧,我要回答我自己的問題。

我是否可以從我的IdP獲取該自定義狀態的答案目前是否定的。 (

但是,這只是因爲ADFS沒有設置捕獲它並將其傳遞。顯然,您需要執行一些自定義編碼以從ADFS和IdP之間打開的後向通道捕獲信息....遠遠超出了當前的工作範圍。

作爲一個變通的時刻:

  • 如果提出要求到現場並沒有SAML令牌,它的用戶一個新的請求誰已經在IDP
  • 再沒身份驗證嘗試
  • 如果有一個SAML令牌但是從IDP在令牌沒有ID,則用戶未能驗證由於某種原因
    • 如果有一個SAML令牌與ID(當他們AUTH正確這是唯一存在的)目前,用戶已正確授權

不是很好,但可以接受。順便說一句,一切歸功於YMC這個SO職位下面的代碼,它可以讓你檢查SAML令牌:

void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e) 
    { 
     var message = SignInResponseMessage.CreateFromFormPost(Request) as SignInResponseMessage; 
     var rstr = new WSFederationSerializer() 
      .CreateResponse(message, 
      new WSTrustSerializationContext(
       SecurityTokenHandlerCollectionManager.CreateDefaultSecurityTokenHandlerCollectionManager())); 
    } 

四氯乙烯!

+0

糟糕,該代碼應該在global.asax – oolong 2012-03-13 01:57:07