我有兩臺服務器:其中一臺服務於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'因此不允許 訪問。
您可以添加自定義的'IHttpModule'來發送標題。請參閱:http:// charliedigital。com/2015/07/17/adventures-in-single-sign-on-cross-domain-script-request/ –
@CharlesChen謝謝!你可以觀察我的答案,下面鏈接到同一篇文章; – Barabas