如何通过一个ADFS服务器提供多个网站?

问题描述:

我有两台服务器:其中一台服务于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

post帮我解决我的问题。

我已添加到index.html新元素iframe的代码中。属性src是我的webAPI的链接。

什么版本的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