许多组织越来越多地发现将其 Web 应用程序部署到 Bluemix 中既快速又轻松。但是,对于许多公司,这需要为这些由 Bluemix 承载的应用程序创建一个身份验证解决方案,以便只有公司员工和合同工能够访问。这可能被视为一项繁重的工作,需要手动更改网络配置,复制用户数据等。好消息是,有一个解决方案简化了该过程,它将您公司的 SAML 身份提供程序 (IdP) 的身份验证功能扩展到在 Bluemix 中部署和运行的 Web 应用程序。在本文中,我将介绍如何实现它。
“这里介绍的用户身份验证解决方案可在 1 小时内完成,无需安装新软件,更改公司基础设施,或者将用户数据复制到 Bluemix!”
在 5 个简单的步骤中,我将展示如何构建和部署一个示例 Bluemix 应用程序,配置 IBM Single Sign On (SSO) 服务来连接到您的内部 SAML IdP。您将配置示例应用程序,以便只有经过验证的用户能够访问。这可保证无论用户登录到内部 Web 应用程序还是在 Bluemix 上运行的 Web 应用程序,登录体验都是相同的。
此解决方案扩展了您现有的内部 SAML IdP,并将它与 Bluemix 中可用的 SAML SSO 服务实例相集成。因此,用户在登录任何由 Bluemix 承载的 Web 应用程序时,必须连接到公司网络。
在该场景中,用户首先在浏览器中输入一个 URL 来访问一个在 Bluemix 中运行的公司 Web 应用程序,如下图所示。

浏览器仲裁 Bluemix 应用程序与 SAML IdP 之间的 SAML 重定向,消除了 Bluemix 直接访问公司内部网的需要。
要部署和配置本文中的示例应用程序,您将需要一个 DevOps Services 帐户。
要使您的内部 SAML IdP 能够用于 IBM SSO 服务,您将需要以下信息:
您还需要从 Bluemix 下载一个 SAML 2.0 服务提供程序元数据文件。您公司的内部 SAML IdP 管理员将需要导出此元数据文件,才能配置 SAML IdP 来从 Bluemix SSO 服务接收身份验证请求。
以下 Bluemix 和 DevOps 服务用于部署和配置示例应用程序:











也可以使用 Eclipse Studio 或 CLI 来修改或开发应用程序代码。要了解这些方法的更多信息,打开第 1 步中创建的示例 Web 应用程序,选择 Start Coding。参阅 JazzHub 文档 了解编辑代码和构建和部署应用程序的操作说明。
以下说明通过更新 web.xml 和 ibm-application-bnd.xml 文件来将示例 Web 应用程序访问权限制到经过验证的用户。
我们将使用 IBM DevOps 修改示例应用程序的代码和配置:

<url-pattern> 标签中指定的应用程序
URL 的访问限制到 <auth-constraint> 标签中指定的角色。以下示例配置允许系统中的
“any-authenticated” 用户(指定为
<role-name>any-authenticated</role-name>)访问应用程序根
URL(指定为
<url-pattern>/*</url-pattern>)。
您可根据需要修改应用程序的
url-pattern 和 role-name
值。
<security-constraint> <display-name>UserConstraint</display-name> <web-resource-collection> <web-resource-name>UserCollection</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>PUT</http-method> <http-method>HEAD</http-method> <http-method>TRACE</http-method> <http-method>POST</http-method> <http-method>DELETE</http-method> <http-method>OPTIONS</http-method> </web-resource-collection> <auth-constraint> <role-name>any-authenticated</role-name> </auth-constraint> </security-constraint>

以下代码使用 ibm-application-bnd.xml 文件,将 web.xml 文件中定义的角色名称
(any-authenticated) 映射到 Liberty 概要文件 subject
(ALL_AUTHENTICATED_USERS)。您可根据需要将应用程序的 subject
修改为一个特定的系统用户或组。
<?xml version="1.0" encoding="UTF-8"?> <application-bnd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://websphere.ibm.com/xml/ns/javaee" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_0.xsd" version="1.0"> <security-role name="any-authenticated"> <special-subject type="ALL_AUTHENTICATED_USERS" /> </security-role> </application-bnd>
参阅 IBM 知识中心中的 Liberty 概要文件:授权 了解更多信息。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true"
import="java.util.Set"
import="java.security.Principal"
import="javax.security.auth.Subject"
import="com.ibm.websphere.security.auth.WSSubject"
%>
<%
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-control", "no-store");
Subject s = WSSubject.getCallerSubject();
String username="unknown";
if (s != null) {
Set<Principal> principals = s.getPrincipals();
if (principals != null && principals.size() > 0) {
// in production this should be html encoded for safety
username = principals.iterator().next().getName();
}
}
%>
<html>
<h3>Hello: <%=username%></h3>
<p class='description'></p> Congratulations! You have successfully configured company SSO for Bluemix Web App!</span>.
</html>备注:您可在
在 WebSphere 中以编程方式获取用户和组信息 中找到从 Subject
提取用户详细信息的示例代码。

index.jsp。您已在 web.xml 文件中限制了对此页面的访问,所以绑定到此应用程序的 SSO 服务会拦截请求,并显示为此 SSO 服务实例配置的所有身份来源。
因为 SSO 服务是为企业 SAML 身份验证配置的,所以重定向的页面将显示 Sign in with SAML Enterprise 链接。单击此链接时,您会被重定向到 SAML 登录 URL。

取决于您公司的内部 SAML IdP 登录页面的设计方式,此页面的外观将会不同。


恭喜您!您已成功地为 Bluemix 示例 Web 应用程序配置了一个 SAML IdP。
本文中描述的解决方案使公司能够将 Web 应用程序部署到 BLuemix,将访问限制到在公司内部 IdP 中拥有凭据的用户。验证过程要求用户在访问 Web 应用程序时能够访问公司内部网,进而提供了一个额外的安全层。可在内部 SAML IdP 级别配置和维护细粒度、特定于应用程序的身份验证策略。
此解决方案不需要将用户身份凭据复制到 Bluemix 环境。由于此原因,没有与身份存储库不同步相关的问题,而且最重要的是,用户在同一个浏览器会话中从内部部署的 Web 应用程序转移到部署到 Bluemix 的应用程序时获得了一种无缝的单点登录体验。
BLUEMIX SERVICES USED IN THIS TUTORIAL: