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

时间:2015-10-13 10:59:52

标签: c# asp.net-web-api saml adfs ws-federation

我有两台服务器:其中一台服务于UI(称为webUI),另一台服务器处理数据(称为webAPI)。

我尝试在ADFS服务器上实现身份验证。它为两个服务器都有依赖方信任:[urn = webui,identifier = address / webui],[urn = webapi,identifier = address / 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实现(只有一个区别 - wsFedWtrealm是 urn:webapi 而不是 urn:webui )。然后我尝试从客户端向webAPI发送请求,ADFS服务器要求再验证一次。

我无法理解如何使用我为webUI输入的webAPI相同的凭据。或者我应该使用SAML令牌?

更新

哇。没有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'因此是不允许的   访问。

2 个答案:

答案 0 :(得分:1)

什么版本的ADFS?

您正在混合使用两种协议 - Web API通常使用OAuth。

为UI使用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

答案 1 :(得分:1)

post帮助我解决了我的问题。

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