首页 > 解决方案 > iis如何使用saml2.0访问adfs

问题描述

IIS如何使用saml2.0访问adfs?

在我看来,IIS 需要通过使用 saml 2.0 发送请求来部署 Web 应用程序来访问 adfs。

但是直到现在,我还没有找到部署可以发送 saml2.0.0 的 web 应用程序的方法。

它必须使用 isapi 或 Shibboleth 吗?

解决方案:(1) Shibboleth SP 应在从 SAML IdP 发送的 SAML 响应中提取用户信息后建立 SSO 会话/HTTP 登录会话。(2) 将用户信息插入 SSO 会话/HTTP 登录会话。如何在 Asp.net MVC C# 中从会话而不是数据库中插入和获取数据提供了有关如何将数据插入 HTTP 会话(在 IIS 中)和从 HTTP 会话中提取数据(在 Glassfish 中)的说明。

//在 IIS 会话中["HTTP_MAIL"] = Request.Headers["HTTP_MAIL"];

//在 Glassfish 中 HTTP 重定向字符串 user_email = Session["HTTP_MAIL"];

谢谢你的回答!

先说说我知道的吧。如果有什么不对的地方请指出

  1. Shibboleth SP 保存从 SAML Idp(这次是 ADFS)到三个地方(※)的 SAML 响应的值,我们可以在 https://SP的域名/Shibboleth.sso/Session中看到它

     ※ ①Session ②Server Variables ③Request Headers 参考SP的AttributeAccess

  2. Shibboleth SP 保存值后,自动跳转到浏览器访问的界面。

  3. ②Server Variables和③Request Headers中有信息,所以IIS上面的应用程序可以通过下面的代码通过mail和HTTP_MAIL都可以获取到值。

<% @ Page Language="C#" %>
<%
Response.Write("<h3>Server Variables</h3>");
Response.Write("Name = " + Request["name"] + "<br>");
Response.Write("Email = " + Request["mail"] + "<br>");
Response.Write("Tel = " + Request["tel"] + "<br>");

%>

结果是:

Server Variables
Name = tom
Email = tom@yahoo.com
Tel = 0251-4584-635

问题是什么时候使用HTTP Redirect(HTTP Rewrite等方式也可以),上面的值是怎么传给glassfish的~

参考你的回答,我做了以下事情~

  1. 将上面iis的程序修改成这样:
<% @ Page Language="C#" %>
<%
Response.Write("<h3>Server Variables</h3>");
Response.Write("Name = " + Request["name"] + "<br>");
Response.Write("Email = " + Request["mail"] + "<br>");
Response.Write("Tel = " + Request["tel"] + "<br>");

Session["HTTP_MAIL"] = Request["HTTP_MAIL"];     ※set value to Session
Response.Write("Mail2 = " + Session["HTTP_TEST"] + "<br>");  

%>
  1. 为此创建 Glassfish 的应用程序:
@RequestMapping(value = "/info2", method = RequestMethod.GET)
    public Object getUserInfo2(HttpSession session, Model model) {
    Enumeration<String> headerNames  = session.getAttributeNames();
    StringBuffer stringBuffer = new StringBuffer();
    while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = (String) session.getAttribute(key);
            stringBuffer.append(key + ":" + value + "\n");
        } 
        model.addAttribute("StringBuffer", stringBuffer);
        return "index";

    }

会话中没有任何内容。

似乎在执行之前使用 IIS 的 HTTP 重定向功能在 IIS 上重定向应用程序。换句话说,会话分配似乎没有被执行

我做对了吗?

标签: iissamladfsisapi

解决方案


问题 #1

IIS如何使用saml2.0访问adfs?

在我看来,IIS 需要通过使用 saml 2.0 发送请求来部署 Web 应用程序来访问 adfs。

答案

是的。你是对的。

(1) IIS 需要部署一个 SAML SP(服务提供者)向 ADFS 发送 SAML auth 请求。

(2) 您需要将ADFS 配置为SAML IdP (Identity Provider)。

将ADFS 添加为 SAML 身份提供者的 Microsoft 官方网站提供了有关如何将 ADFS 配置为 SAML IdP 的说明。

问题 #2

它必须使用 isapi 或 Shibboleth 吗?

答案

您可以在 IIS 上部署 Shibboleth SP(服务提供者)。

Shibboleth SP 与 IIS的官方链接提供了有关如何在 IIS 上部署 Shibboleth SP 的说明。

后续问题 #1

最终效果如下: adfs的端点:

iis.*.com/Shibboleth.sso/SAML2/POST
iis.*.com/Shibboleth.sso/SAML2/Artifact

但是adfs是作为post返回的,并且我没有通过iis端的程序获取到request header中的信息

IIS参考这个网站Shibboleth SP でSAML対応

如何通过get获取adfs返回的数据

答案

(1) Shibboleth SP AssertionConsumerService 不为“GET”提供“HTTP-Redirect”端点/URL。

(一)不能“通过get获取adfs返回的数据”。

(二)必须通过POST获取adfs返回的数据。

(2) 假设你的网站是https://shibbolethiis.int.secioss.work

(I) Shibboleth SP AssertionConsumerService 端点/URL 由您的 Shibboleth SP 元数据“ https://shibbolethiis.int.secioss.work/Shibboleth.sso/Metadata ”展示

<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://shibbolethiis.int.secioss.work/Shibboleth.sso/SAML2/POST" index="1"/>

(II) 引用您评论中的链接。即IIS 的 Shibboleth SP でSAML対応

「默认网站」を选択し。IISを再启动します。</p>

これでShibboleth-SPの设定は终了です。以下のURLに接続し、正常に働している确认してください。</p>

https://shibbolethiis.int.secioss.work/Shibboleth.sso/Status

正常に嘉働している场合、以下のようなXMLが返ります。最后の状态タグの内容がOKなら正常です。</p>

(III) 检查您的网站 Shibbolth SP 会话

https://shibbolethiis.int.secioss.work/Shibboleth.sso/Session

上述 Shibboleth SP Session URL 应显示 ADFS 发送的 SAML 响应携带的用户信息

如果您无法从上述 Shibboleth SP 会话 URL 中找到任何用户信息

(III.a) 配置 ADFS 以发送带有 SAML 属性/SAML 断言/SAML 响应的用户信息

(III.b) 参考GitHub 存储库中Shibboleth SP shibboleth-sp-testapp/shibboleth-sp/attribute-map.xml提供的示例,修改 Shibboleth SP“attribute-map.xml”以接受 ADFS 发送的 SAML 属性.

通常 Shibboleth SP 使用 SAML 属性,例如“mail”属性(例如,ethan.smith@example.com)将用户登录到您的网站。

(4)备注

(I)如何使用 Docker 容器构建和运行 Shibboleth SAML IdP 和 SP在 GitHub 存储库中提供了 Shibboleth SP 配置示例。

(II) 为了您的方便,我在上面的 GitHub 存储库中做了一个新的提交,将 ADFS 属性添加到Shibboleth SP shibboleth-sp-testapp/shibboleth-sp/attribute-map.xml 。请注意,我已使用相同的 ADFS 属性成功登录 Box 帐户。

(III)为 SAML 2.0 和 ADFS 3.0 配置属性提供了关于 Shibboleth SP 如何通过“attribute-map.xml”提取 ADFS 返回的用户信息/数据的有价值的信息和讨论。

后续问题 #2

修改属性后。XML,并访问shibboleth.sso/Session,可以显示如下信息。

Attributes mail: 1 value(s) 
tel: 1 value(s) 

IIS参考这个网站Shibboleth SP でSAML対応

5.動作確認 

Display the following information 

HTTP_MAIL:ya*@cn.*.com 
HTTP_TEL:17* 

当我通过 iis 的 HTTP 重定向功能将请求头重定向到 glassfish 时,如何从请求头中获取信息?

答案

另一个 StackOverflow 问题Getting a Request.Headers value提供了有关如何使用 C# 从请求标头中获取信息的解决方案,例如,

if (Request.Headers["HTTP_MAIL"] != null) {
    string user_email = Request.Headers["HTTP_MAIL"];
}

后续问题 #3

我的问题不是问如何在 IIS 上获取 headers,而是如何在 glassfish 上获取登录信息~ 换句话说,从 iis 中获取 request-header 信息后如何将其传递给 glassfish?我还在glassfish get shibboleth sp attribute on iis中问了一个问题,比他目前的评论更详细。

答案

从网络安全的角度来看,您不能重定向用户信息来为 Glassfish 应用程序建立 HTTP 登录会话。否则,黑客可以使用相同的用户信息登录 Glassfish 应用程序,而无需任何身份验证,例如本地用户名/密码身份验证或第三方 SAML 身份验证。

后续问题#4

当使用 HTTP Redirect(HTTP Rewrite 等方式也可以),上面的值是如何传递给 glassfish 的?

会话中没有任何内容。

似乎在执行之前使用 IIS 的 HTTP 重定向功能在 IIS 上重定向应用程序。换句话说,会话分配似乎没有被执行

我做对了吗?

答案

(1) Apache、GlassFish、IIS、Jetty 和 Tomcat 可以被视为托管 Web 应用程序的并行 Web 服务器。

顶级 Java 应用程序服务器:Tomcat、Jetty、GlassFish、WildFly

Microsoft IIS 与 Apache Tomcat:有什么区别?

Microsoft IIS and Apache Tomcat belong to "Web Servers" category of the tech stack.

Windows Server 2016 可以同时运行 IIS 10 Web 服务器和 GlassFish 5.1.0 Web 服务器,而 IIS 10 Web 服务器和 GlassFish 5.1.0 Web 服务器可以运行它们自己的 Web 应用程序。

(2) 从网络安全的角度来看,不同的 Web 应用程序应在其用户通过第三方 SAML IdP(如作为 Shibboleth SAML IdP)。

因此,您不能将用户信息从 IIS 重定向到 Glassfish,因为 IIS 和 Glassfish 应该为被授予访问 Web 应用程序的用户建立自己不同的 HTTP 会话。

分辨率

您可以使用 OneLogin Java SAML SP takeit(编写Java 应用程序以通过 OneLogin 提供 SSO)为基于 Java 的 GlassFish Web 应用程序构建 SAML SP。

请注意,基于 Java 的 GlassFish Web 应用程序的 OneLogin SAML SP 可以与任何 SAML IdP 通信,包括它们自己的 OneLogin SAML IdP、在 Docker 容器上运行的 Shibboleth SAML IdP或我们的零密码身份验证和授权系统提供的 SAML IdP 。


推荐阅读