如何通过一台ADFS服务器为多个网站提供服务
本文关键字:网站 服务 服务器 ADFS 何通过 一台 | 更新日期: 2023-09-27 18:17:38
我有两个服务器:其中一个服务UI(它被称为web),另一个工作与数据(它被称为webAPI)。
我尝试跨ADFS服务器实现身份验证。它对两个服务器都有依赖方信任: [urn=web,identifier=address/web],[urn=webapi,identifier=address/webapi]。
我调整了web的HttpConfiguration,用户可以认证并使用web提供的网站(很好)。
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 Token)。ADFS的响应也为进一步的请求(MSISAuth, MSISAuthenticated等)设置cookie。
webAPI有相同的HttpConfiguration实现(只有一个区别- wsFedWtrealm是urn: webAPI 而不是urn:web )。然后我尝试从客户端向webAPI发送请求,ADFS服务器要求再验证一次。
我不明白我应该怎么做才能使用我为web输入的webAPI相同的凭据。或者我应该使用SAML Token?
更新
哇。它在没有SAML令牌的情况下工作,仅使用cookie。web用户进行身份验证时,客户端(. asp.net)设置了不同的cookie。Federation, MSISAuth, MSISAuthenticated…)。然后我把地址栏的web链接换成webAPI链接,webAPI就不要求输入登录名和密码了。因此,数据显示在浏览器中。web和webAPI也接受身份验证。
但是现在的问题是,当javascript试图发送请求到webAPI时,我得到了错误:
XMLHttpRequest无法加载https://my_address/adfs/ls/?wtrealm=urn%3awebapi&wctx=_请求的文件中没有'Access-Control-Allow-Origin'标头资源。因此,不允许使用原产地"https://my_address:9001"访问。
什么版本的ADFS?
你混合了两种协议- Web API通常使用OAuth。
为UI使用OpenID Connect,然后它将自然地流入WebAPI,如下所示:在WS2012 R2上使用ADFS保护WebAPI变得更加容易。
或者用一种更复杂的方法——当为非浏览器客户端提供安全webapi时,ADFS使用什么协议
这篇文章帮助我解决了我的问题。
我添加到代码的index.html新的元素iframe。属性src是我的webAPI的链接