如何通过一个 ADFS 服务器为多个网站提供服务?
How to serve multiple web sites by the one ADFS server?
我有两台服务器:其中一台服务于 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 服务器要求再验证一个。
我不明白我应该如何使用我为 web 输入的 webAPI 相同凭据UI。或者我应该使用 SAML 令牌?
更新
哇。它在没有 SAML 令牌的情况下工作,仅使用 cookie。
当用户尝试对 webUI 进行身份验证时,会在客户端设置不同的 cookie(.AspNet.Federation、MSISAuth、MSISAuthenticated...)。然后我用地址栏中的 webAPI link 替换 webUI link 然后 webAPI 不要求输入登录名和密码。因此数据显示在浏览器中。为 webUI 和 webAPI 也选择了身份验证。
但现在的问题是当 javascript 尝试向 webAPI 发送请求时出现错误:
XMLHttpRequest cannot load
https://my_address/adfs/ls/?wtrealm=urn%3awebapi&wctx=_ No 'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'https://my_address:9001' is therefore not allowed
access.
什么版本的 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
这个post帮我解决了我的问题。
我添加到 index.html 新元素 iframe 的代码中。属性 src 是我的 webAPI 的 link。
我有两台服务器:其中一台服务于 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 服务器要求再验证一个。
我不明白我应该如何使用我为 web 输入的 webAPI 相同凭据UI。或者我应该使用 SAML 令牌?
更新
哇。它在没有 SAML 令牌的情况下工作,仅使用 cookie。 当用户尝试对 webUI 进行身份验证时,会在客户端设置不同的 cookie(.AspNet.Federation、MSISAuth、MSISAuthenticated...)。然后我用地址栏中的 webAPI link 替换 webUI link 然后 webAPI 不要求输入登录名和密码。因此数据显示在浏览器中。为 webUI 和 webAPI 也选择了身份验证。
但现在的问题是当 javascript 尝试向 webAPI 发送请求时出现错误:
XMLHttpRequest cannot load https://my_address/adfs/ls/?wtrealm=urn%3awebapi&wctx=_ No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://my_address:9001' is therefore not allowed access.
什么版本的 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
这个post帮我解决了我的问题。
我添加到 index.html 新元素 iframe 的代码中。属性 src 是我的 webAPI 的 link。