2014-03-18 56 views
1

以下是我目前的情況。我設置了一個ADFS 2.0服務器,並連接了兩個RP Web應用程序。這些應用程序App1和App2是帶有Web API後端的Web應用程序。使用Javascript AJAX調用。使用ADFS瞭解Thinktecture Web API安全性

從我最初對WIF的理解中,我想我可以通過瀏覽器登錄,然後可以訪問這兩個應用程序。這證明是不正確的,因爲我無法從App1調用App2的Web API函數。我可以做到這一點的唯一方法是通過輸入到App2的URL,只有這樣我才能從應用程序1的後續調用工作(正確的FedAuth cookie傳遞到標題中)

所以我一直在搜索和搜索用於從App1實際調用App2的Web API的方法,但我已經空手而歸。我有一個解決方案最接近的是(我相信)通過添加一個消息處理程序,如本例

http://leastprivilege.com/2013/04/22/asp-net-web-api-security-the-thinktecture-identitymodel-authenticationhandler/

如果我理解正確這,我應該能夠作出的WebAPI收到我的SAML2安全令牌。

我的代碼如下:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 

     var authentication = CreateAuthenticationConfiguration(); 
     config.MessageHandlers.Add(new AuthenticationHandler(authentication)); 

    } 
} 

private static AuthenticationConfiguration CreateAuthenticationConfiguration() 
    { 
     System.Diagnostics.Debugger.Break(); 
     var authentication = new AuthenticationConfiguration 
     { 
      ClaimsAuthenticationManager = new MyClaimsAuthenticationManager(), 
      EnableSessionToken = true, 
      RequireSsl = false 
     }; 

authentication.AddSaml2(
      issuerThumbprint: **Hidden**, 
      issuerName: "https://192.168.0.55/adfs/ls/", 
      audienceUri: "http://localhost/MyCompany.App2/", 
      certificateValidator: X509CertificateValidator.None, 
      options: AuthenticationOptions.ForAuthorizationHeader("AdfsSaml"), 
      scheme: AuthenticationScheme.SchemeOnly("AdfsSaml")); 


     return authentication; 
} 

的調用達到MyClaimsAuthenticationManager.Authenticate(),但是IncomingPrincipal仍然沒有通過認證。我沒有辦法知道它是否收到SAML2令牌,因爲我不能MyClaimsAuthenticationManager.Authenticate()

我的問題之前,任何調試:

1)是否可以叫我的應用2的Web API函數儘管在App1中進行了身份驗證? (他們使用相同的ADFS)

2)如果可能,我使用ThinkTecture AuthenticationHandler在正確的軌道上?

謝謝。

+0

這是因爲用戶被認證到App1中。 App1正試圖代表用戶訪問App2。我敢打賭,如果你從App1的客戶端向App2發出了AJAX調用,它就會工作。在你的情況下,你需要將用戶的身份從App1委託給App2。 –

+0

它不起作用,它沒有App 2必需的FedAuth cookie,所以這個調用被未經授權/重定向到登錄頁面 – Sdupere

回答

0

從你的問題來看,從應用程序1到應用程序2的調用是來自JS還是來自你的服務器代碼,這有點不清楚。

如果是後者,那麼在您的應用1中,如果您有引導令牌,則可以向您的STS發出ws-trust回調以獲取應用2的令牌。您必須閱讀WS-Trust--它被稱爲「委託」。

編輯:我以爲你使用IdentityServer作爲STS,但我意識到你正在使用ADFS。兩者均支持此功能,BTW。

+0

實際上,有時我從JS($ .ajax())調用它,有時從我的服務器代碼。我會研究WS-Trust,我可以用於JS的任何東西?謝謝! – Sdupere

0

您需要爲運行IIS Web應用程序的域帳戶(這將是應用程序正在使用的應用程序池的標識)設置應用程序2的SPN。例如:setspn -a http/app2 domain \ account。因此,您必須使用不使用本地/網絡身份,而是使用特定域帳戶的應用程序池。

確保IIS應用程序設置爲使用應用程序池憑證。當涉及到模擬和授權時,您需要在AD中爲創建的SPN的App1帳戶設置授權目標。授權還要求您爲執行委派的帳戶設置本地安全策略「作爲操作系統的一部分」,在您的情況下,它將是App1的帳戶,即執行模擬操作。