理解 IBM InfoSphere MDM Server 安全性,第 4 部分: 在 MDM Server 安全中使用 SAML

IBM® InfoSphere™ Master Data Management (MDM) Server 允许用户提供自己的安全数据格式并集成到 MDM 安全框架中。本文描述如何在 MDM 安全中使用 Security Assertion Markup Language (SAML) 断言。

Allen Zhang, 应用程序架构师, WSO2 Inc

Allen ZhangAllen Zhang 是 IBM 多伦多实验室的应用程序架构师。Allen 是 WCC(以前称为 DWL Customer)最初的高级开发人员之一。他参与了市场上最先进的 CDI 产品的设计和开发。目前,他主要关注 MDM 服务器开发中的 Party Domain 和 Product Domain。



2009 年 2 月 02 日

简介

IBM InfoSphere MDM Server 允许用户按自己的格式在 MDM 安全框架中传递和处理安全数据。本文简要介绍如何使用这种机制支持 SAML 断言。它延续前一篇文章(理解 IBM InfoSphere MDM Server 安全性)中的 “身份验证和身份断言” 小节。

Tivoli® Federated Identity Manager

可以使用 Federated Identity Manager 通过定制的身份验证断言解析器检验令牌,从而进一步扩展 MDM Server 的身份验证功能。本系列的下一篇文章将讨论这种方法。

可以使用控制对象把 SAML 身份验证和身份属性语句传递给 MDM Server。在 MDM Server 中,解析这些 SAML 断言,提取出用户身份和组成员关系。这些语句保持 XML 格式,可以支持各种扩展(业务代理、数据扩展或行为扩展)。

定义 SAML

SAML 代表 Security Assertion Markup Language。Wikipedia 上把 SAML 定义为 “一种基于 XML 的标准,用于在安全域之间,也就是在身份提供者(断言的生产者)和服务提供者(断言的消费者)之间,交换身份验证和授权数据。SAML 是由 OASIS Security Services Technical Committee 开发的”。

把用户身份信息传递给 MDM Server

MDM Server 为客户机提供了几种调用服务操作的方法:

  • 通过 RMI/IIOP 在服务控制器上直接调用
  • 通过 HTTP 以 web 服务操作的形式调用
  • 通过 JMS 异步地调用

无论选择哪个接口,所有调用最终会到达服务控制器。服务控制器作为请求和响应框架的入口点。根据事务上下文选择一个请求解析器,请求解析器对请求业务对象进行解析;这个对象的头包含一个控制对象,体包含一个事务对象。

MDM Server 要求在控制对象中传递的用户身份信息是明文文本值或 SAML 断言。

明文文本值

可以使用控制对象的 requesterName 和 userRoles 属性以明文文本值形式把用户身份信息传递给 MDM Server。一个用户可以具有多个用户角色,这些角色可以一个接一个地传递给 MDM Server。

清单 1 给出用户 Jane Doe 的请求示例,requesterName 是 'jdoe',这个用户具有两个角色 CallCentAppUser 和 CstSuppRelL2。

清单 1. 以明文文本形式传递的用户身份信息
<?xml version="1.0" encoding="UTF-8"?>
<TCRMService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="myTCRM.xsd">
	<RequestControl>
		<requestID>123501</requestID>
		<DWLControl>
. . .

			<requesterName>jdoe</requesterName>
			<userRole>CallCentAppUser</userRole>
			<userRole>CstSuppRepL2</userRole>

. . .
		</DWLControl>
	</RequestControl>
	<TCRMTx>
. . .
</TCRMTx>
</TCRMService>

SAML 断言

还可以以身份验证断言形式把用户身份信息传递给 MDM Server,身份验证断言包含用户身份及其属性(角色)。

由服务消费者负责把 SAML 断言传递给 MDM Server。服务消费者可以从身份提供者那里直接获取 SAML 断言,也可以获取其他格式的身份数据并把数据转换为 SAML 断言。

在事务生命周期的各个阶段,都会传递 SAML 断言语句,因此各种扩展也可以使用它们。在默认情况下,MDM Server 能够从 AuthenticationData 中获取控制对象的 requesterName 和 userRoles 属性。取自 SAML 断言的信息优先于通过控制对象属性传递的信息。在引入 SAML 断言集成特性之前的 MDM Server 版本中,一直使用控制对象的 requesterName 和 userRoles 属性。即使在 SAML 断言中传递用户身份信息,MDM Server 中的不同地方仍然使用 requesterName 和 userRoles 属性。

下面的清单 2 给出用户 Jane Doe 的请求示例,其身份是 'jdoe',这个用户具有两个角色 CallCentAppUser 和 CstSuppRelL2。注意,'jdoe' 作为 AuthenticationStatement 中的 NameIdentifier 传递,两个角色 CallCentAppUser 和 CstSuppRelL2 作为 AttributeStatement 中的 AttributeValue 传递。

清单 2. 以 SAML 断言形式传递的用户身份信息
<?xml version="1.0" encoding="UTF-8"?>
<TCRMService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="myTCRM.xsd">
	<RequestControl>
		<requestID>123501</requestID>
		<DWLControl>
. . .

<authData><![CDATA[


<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1" AssertionID=". . ."
  Issuer=". . ." IssueInstant="2008-11-21T10:35:18.796Z"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="urn:oasis:names:tc:SAML:1.0:assertion
    oasis-sstc-saml-schema-assertion-1.1.xsd">
  <saml:Conditions NotBefore=". . ." NotOnOrAfter=". . .">. . .</saml:Conditions>
  <saml:AuthenticationStatement
    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"
    AuthenticationInstant="2008-11-21T10:35:08.707Z">
    <saml:Subject>
      <saml:NameIdentifier 
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName">
          jdoe
      </saml:NameIdentifier>
    </saml:Subject>
  </saml:AuthenticationStatement>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:SubjectConfirmation>
        <saml:ConfirmationMethod>. . .</saml:ConfirmationMethod>
      </saml:SubjectConfirmation> 
	  </saml:Subject>
    <saml:Attribute AttributeName="urn:wcc:dir:attribute-def:userRoles"
      AttributeNamespace="urn:wcc:attributeNamespace:uri">
      <saml:AttributeValue>
        CallCentAppUser 
      </saml:AttributeValue>
      <saml:AttributeValue>
        CstSuppRepL2
      </saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
</saml:Assertion>

]]></authData>

. . .
		</DWLControl>
	</RequestControl>
	<TCRMTx>
. . .
</TCRMTx>
</TCRMService>

把 SAML 断言集成到 MDM Server 安全框架中

MDM Server 安全框架定义了解析事务请求中的身份验证断言所需的接口。身份验证断言的格式可以由用户决定。MDM Server 附带一个默认的身份验证断言解析器,它支持使用 SAML。在默认情况下,支持 SAML 1.1 断言。

下面的类图说明 SAML 断言、安全数据解析器和控制对象之间的关系。

图 1. 使用 SAML11parser 解析用户身份信息
使用 SAML11parser 解析用户身份信息

下面是在 MDM Server 中使用 SAML 断言的步骤:

  1. 请求解析器调用控制对象中的 setAuthData() 方法,从而设置来自事务请求中的 authData 标记值的 SAML 断言。
  2. 选用 SAML11Parser 解析 SAML 断言。这个解析器实现 ISecurityDataParser 接口。
  3. SAML11Parser 用从 SAML 断言解析出的用户 ID 和/或用户角色填充 AuthenticationData 对象。原来的 SAML 断言也存储在 AuthenticationData 中。
  4. 控制对象包含 AuthenticationData。在整个事务处理过程中,作为事务上下文对象传递控制对象。因此,MDM Server 和扩展在整个事务处理过程中都可以使用 SAML 断言。

请求和响应示例

清单 3 是 addContract 事务的 XML 请求示例。在这个请求示例中,以 SAML 断言的形式传递用户身份信息。

清单 3. addContract 事务请求,以 SAML 断言的形式传递用户身份信息
<?xml version="1.0" encoding="UTF-8"?>
<TCRMService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="myTCRM.xsd">
	<RequestControl>
        <requestID>123501</requestID>
        <DWLControl>
            <requesterLanguage>100</requesterLanguage>

<authData><![CDATA[
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1" AssertionID=". . ."
  Issuer=". . ." IssueInstant="2008-11-21T10:35:18.796Z"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="urn:oasis:names:tc:SAML:1.0:assertion
    oasis-sstc-saml-schema-assertion-1.1.xsd">
  <saml:Conditions NotBefore=". . ." NotOnOrAfter=". . .">. . .</saml:Conditions>
  <saml:AuthenticationStatement
    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"
    AuthenticationInstant="2008-11-21T10:35:08.707Z">
    <saml:Subject>
      <saml:NameIdentifier 
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName">
          jdoe
      </saml:NameIdentifier>
    </saml:Subject>
  </saml:AuthenticationStatement>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:SubjectConfirmation>
        <saml:ConfirmationMethod>. . .</saml:ConfirmationMethod>
      </saml:SubjectConfirmation> 
	  </saml:Subject>
    <saml:Attribute AttributeName="urn:wcc:dir:attribute-def:userRoles"
      AttributeNamespace="urn:wcc:attributeNamespace:uri">
      <saml:AttributeValue>
        CallCentAppUser 
      </saml:AttributeValue>
      <saml:AttributeValue>
        CstSuppRepL2
      </saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
</saml:Assertion>
]]></authData>

    	</DWLControl>
    </RequestControl>
    <TCRMTx>
        <TCRMTxType>addContract</TCRMTxType>
        <TCRMTxObject>TCRMContractBObj</TCRMTxObject>
        <TCRMObject>
            <TCRMContractBObj>
                <ContractIdPK/>
                <LineOfBusiness>life ins</LineOfBusiness>
                <CurrencyType>1</CurrencyType>
                <FrequencyModeType>1</FrequencyModeType>
                <BillingType>5</BillingType>
                <PremiumAmount>200</PremiumAmount>
                <NextBillingDate>2009-01-01</NextBillingDate>
                <CurrentCashValueAmount>300.00</CurrentCashValueAmount>
                <BrandName>ul</BrandName>
                <ServiceOrgName>KLM</ServiceOrgName>
                <ServiceProvId>1991</ServiceProvId>
                <BusOrgunitId>444</BusOrgunitId>
            </TCRMContractBObj>
        </TCRMObject>
    </TCRMTx>
</TCRMService>

清单 4 是这个事务的 XML 响应示例。在这个响应 XML 中返回 SAML 断言。

清单 4. addContract 事务响应,在响应中返回传递的 SAML 断言
<?xml version="1.0" encoding="UTF-8"?>
<TCRMService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="tCRMResponse.xsd">
    <ResponseControl>
        <ResultCode>SUCCESS</ResultCode>
        <ServiceTime>125</ServiceTime>
        <DWLControl>
            <requesterLanguage>100</requesterLanguage>
            <requesterLocale>en</requesterLocale>
            <requesterName>jdoe</requesterName>
            <requestID>123501</requestID>
            <userRole>CallCentAppUser</userRole>
            <userRole>CstSuppRepL2</userRole>

<authData><![CDATA[
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
  MajorVersion="1" MinorVersion="1" AssertionID=". . ."
  Issuer=". . ." IssueInstant="2008-11-21T10:35:18.796Z"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="urn:oasis:names:tc:SAML:1.0:assertion
    oasis-sstc-saml-schema-assertion-1.1.xsd">
  <saml:Conditions NotBefore=". . ." NotOnOrAfter=". . .">. . .</saml:Conditions>
  <saml:AuthenticationStatement
    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password"
    AuthenticationInstant="2008-11-21T10:35:08.707Z">
    <saml:Subject>
      <saml:NameIdentifier 
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName">
          jdoe
      </saml:NameIdentifier>
    </saml:Subject>
  </saml:AuthenticationStatement>
  <saml:AttributeStatement>
    <saml:Subject>
      <saml:SubjectConfirmation>
        <saml:ConfirmationMethod>. . .</saml:ConfirmationMethod>
      </saml:SubjectConfirmation> 
	  </saml:Subject>
    <saml:Attribute AttributeName="urn:wcc:dir:attribute-def:userRoles"
      AttributeNamespace="urn:wcc:attributeNamespace:uri">
      <saml:AttributeValue>
        CallCentAppUser 
      </saml:AttributeValue>
      <saml:AttributeValue>
        CstSuppRepL2
      </saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
</saml:Assertion>
]]></authData>

    	</DWLControl>
    </ResponseControl>
    <TxResponse>
        <RequestType>addContract</RequestType>
        <TxResult>
            <ResultCode>SUCCESS</ResultCode>
        </TxResult>
        <ResponseObject>
            <TCRMContractBObj>
                <BillingType>5</BillingType>
                <BillingValue>Payroll Deduction</BillingValue>
                <BrandName>ul</BrandName>
                <BusOrgunitId>444</BusOrgunitId>
                <ContractIdPK>938122728173367195</ContractIdPK>
                <ContractLastUpdateDate>2008-11-21 10:35:33.671</ContractLastUpdateDate>
                <ContractLastUpdateTxId>430122728173365655</ContractLastUpdateTxId>
                <ContractLastUpdateUser>jdoe</ContractLastUpdateUser>
                <CurrencyType>1</CurrencyType>
                <CurrencyValue>U.S. Dollar</CurrencyValue>
                <CurrentCashValueAmount>300.00</CurrentCashValueAmount>
                <FrequencyModeType>1</FrequencyModeType>
                <FrequencyModeValue>Annual</FrequencyModeValue>
                <LineOfBusiness>life ins</LineOfBusiness>
                <NextBillingDate>2009-01-01 23:59:59.0</NextBillingDate>
                <PremiumAmount>200</PremiumAmount>
                <ServiceOrgName>KLM</ServiceOrgName>
                <ServiceProvId>1991</ServiceProvId>
                <DWLStatus>
                    <Status>0</Status>
                </DWLStatus>
            </TCRMContractBObj>
        </ResponseObject>
    </TxResponse>
</TCRMService>

使用其他安全数据格式

正如前面提到的,安全数据格式可以由用户决定。客户机以 CDATA 格式在 authData 标记中传递安全数据。请求和响应框架中的请求解析器保持 authData 不变并设置控制对象。定制的安全数据解析器从 authData 中解析出用户 ID 和用户角色。请求和响应框架中的构造器构造响应并按照传递请求所用的格式返回 authData。

下面是使用其他安全数据格式的步骤:

  1. 创建一个实现 ISecurityDataParser 接口的解析器。
  2. 用刚才创建的类的名称设置配置存储库中的配置项 /DWLCommonServices/Security/SAML/security_data_parser。
  3. 把新的类打包在 jar 文件中并让 MDM Server 企业应用程序可以使用这个 jar 文件。
  4. 在 DWLCommonServices EJB 项目的 MANIFEST.MF 文件中添加 jar 文件名。
  5. 重新启动服务器,使用新的安全数据格式进行测试。

结束语

InfoSphere MDM Server 安全框架提供一种灵活的机制,允许客户机按照自己的格式传递用户的身份信息。MDM Server 在默认情况下支持 SAML 断言,而且很容易根据需要使用其他安全数据格式。

参考资料

学习

获得产品和技术

  • 使用可从 developerWorks 直接下载的 IBM 试用软件 构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML
ArticleID=367665
ArticleTitle=理解 IBM InfoSphere MDM Server 安全性,第 4 部分: 在 MDM Server 安全中使用 SAML
publish-date=02022009