2015-10-13 88 views
0

我有兩臺服務器:其中一臺服務於UI(稱爲webUI),另一臺服務於數據(稱爲webAPI)。如何通過一個ADFS服務器提供多個網站?

我嘗試在整個ADFS服務器上實現身份驗證。它有依賴方信任兩個服務器:[urn = webui,標識符=地址/ webui],[urn = webapi,標識符=地址/ webapi]。

我調整了webUI的HttpConfiguration,用戶可以通過身份驗證並使用webUI服務的網站(這很好)。

 var wsFedMetAdd = ConfigurationManager.AppSettings["wsFedMetAdd"]; 
     if (string.IsNullOrWhiteSpace(wsFedMetAdd)) 
      throw new ConfigurationErrorsException(Properties.Resources.InvalidMetadataAddress); 

     var wsFedWtrealm = ConfigurationManager.AppSettings["wsFedWtrealm"]; 
     if (string.IsNullOrWhiteSpace(wsFedWtrealm)) 
      throw new ConfigurationErrorsException(Properties.Resources.InvalidWtrealm); 

     appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType 
     }); 

     var options = new WsFederationAuthenticationOptions 
     { 
      MetadataAddress = wsFedMetAdd, 
      Wtrealm = wsFedWtrealm, 
      SignInAsAuthenticationType = "Federation" 
     }; 
     appBuilder.UseWsFederationAuthentication(options); 

     config.Filters.Add(new AuthorizeAttribute() { Roles = "Admin" }); 

一旦客戶端獲得RequestSecurityTokenResponse(SAML令牌)。來自ADFS的響應還爲進一步的請求設置了Cookie(MSISAuth,MSISAuthenticated等)。

的的WebAPI具有HttpConfiguration相同FPGA實現(只有一個差別 - wsFedWtrealm是甕:的WebAPI代替甕:WebUI中)。然後我嘗試從客戶端向webAPI發送請求,並且ADFS服務器要求再次進行身份驗證。

我不明白我應該如何使用相同的憑證來輸入webUI的webAPI。或者,也許我應該使用SAML令牌?


UPDATE

哇。它沒有SAML令牌,只使用cookie。 當用戶嘗試對webUI進行身份驗證時,會在客戶端上設置不同的Cookie(.AspNet.Federation,MSISAuth,MSISAuthenticated ...)。然後,我將webUI鏈接替換爲地址欄中的webAPI鏈接,然後webAPI不要求輸入登錄名和密碼。因此數據顯示在瀏覽器中。身份驗證是爲webUI和webAPI提取的。

但現在的問題是我得到的錯誤時,JavaScript的嘗試發送到的WebAPI請求:

的XMLHttpRequest無法加載 https://my_address/adfs/ls/?wtrealm=urn%3awebapi&wctx=_無「訪問控制允許來源」標頭出現在要求 資源。原因'https://my_address:9001'因此不允許 訪問。

+0

您可以添加自定義的'IHttpModule'來發送標題。請參閱:http:// charliedigital。com/2015/07/17/adventures-in-single-sign-on-cross-domain-script-request/ –

+0

@CharlesChen謝謝!你可以觀察我的答案,下面鏈接到同一篇文章; – Barabas

回答

1

post幫我解決我的問題。

我已添加到index.html新元素iframe的代碼中。屬性src是我的webAPI的鏈接。

1

什麼版本的ADFS?

您正在混合使用兩種協議--Web API通常使用OAuth。

使用OpenID Connect作爲用戶界面,然後自然會按照以下流程進入WebAPI:Securing a Web API with ADFS on WS2012 R2 Got Even Easier

或爲一個較爲令人費解的做法 - what protocol to use with ADFS when security webapi for non-browser clients

+0

ADFS版本是3.0。 – Barabas

+0

感謝您的回覆。我很感激。實際上我不想混用協議。也許我不想用錯綜複雜的方法。然而。現在我只想知道,是否可以使用客戶端通過webAPI從webUI獲取的SAML令牌?我對此的想法是我使用webUI,webUI通過ADFS服務器對我進行身份驗證,ADFS服務器將令牌分配給我。然後將此令牌返回給客戶端。然後我想將此令牌發送給webAPI,並且它明白此令牌是作爲ADFS服務器的用戶對我有效。 – Barabas

+0

問題是Web API使用JSON令牌,而WS-Fed使用SAML令牌。所以你會傾向於WCF。 – nzpcmad

相關問題