isam 驱动程序 下载_将ISAM反向代理配置为与OpenID连接提供程序的PEP

isam 驱动程序 下载

注意:截至2017年5月9日,“执行测试流程”部分(在“步骤2.将反向代理配置为OpenID Connect的联系点”部分中)下的代码已更新。

IBM Security Access Manager(ISAM)在9.0版中添加了OpenID Connect(OIDC)作为联合协议。 OIDC包含配置OpenID Provider(OP)的功能,该功能可以发布用户身份(id_tokens)以及用于身份验证的访问令牌,其方式与OAuth 2.0版相同。 反向代理可以使用OAuth访问令牌作为策略执行点(PEP),可以通过使用此处定义的WS-Trust接口来实现。 传统上,此接口与用于移动API保护定义的ISAM一起使用,但是它与作为OpenID Connect流的一部分发行的访问令牌不兼容。 本文介绍了如何将反向代理配置为与OpenID Connect颁发的访问令牌兼容的策略执行点。

需要执行以下步骤:

  1. 配置OP联盟。
  2. 将反向代理配置为联系点。
  3. 配置STS链以做出授权决定。
  4. 将反向代理配置为策略执行点(PEP)。

在本文中,我将演示如何将反向代理配置为与OpenID Connect提供程序发出的访问令牌兼容的策略执行点。

ISAM上的OpenID Connect提供程序是一个联盟,每组依赖方凭据都是合作伙伴。 在下面描述的过程中,配置了一个OP联合并创建了两个伙伴。 一个代表依赖方实体,另一个代表反向代理/安全令牌服务在充当PEP时使用。

注意:本文中的 “反向代理”始终指的是ISAM反向代理。

步骤1.配置OP联合

可以在联盟用户界面(UI)之外或通过REST API调用来配置和管理联盟。 联合身份验证用户界面位于“ 安全:联合身份 > 联合身份”下 。 如果您使用的是REST服务,请参阅Web服务文档(转到Secure:联合 > 联合 > 创建新的联合 ),以获取有关如何调用联合REST API和要提供的属性的说明。

通过用户界面配置联盟

  1. 选择联合菜单选项。
    该屏幕截图显示了联盟菜单选项
  2. 添加一个新的联盟。
    该屏幕截图显示了添加联盟
  3. 输入发行者值,作为您想要出现在id_token的'iss'声明中的值。 选择HS256签名
    该屏幕截图显示了配置提供程序
  4. 从可用的赠款中至少选择一个授权码
    该屏幕截图显示了配置授权
  5. 选择映射规则。
    该屏幕截图显示了映射规则的选择
  6. 查看摘要以确保所有值均正确。
    该屏幕截图显示了摘要

通过REST配置联盟

使用以下代码创建联盟:

POST_DATA='
{
  "name": "acmeProvider",
  "protocol": "OIDC",
  "role": "op",
  "configuration": {
    "providerId": "acmeProvider",
    "issuerIdentifier": "https://acmeProvider.com",
    "signatureAlgorithm": "HS256",
    "authorizationCodeLength": 30,
    "refreshTokenLength": 50,
    "accessTokenLength": 40,
    "authorizationCodeLifetime": 30,
    "accessTokenLifetime": 7200,
    "authorizationGrantLifetime": 604800,
    "idTokenLifetime": 7200,
    "grantTypesSupported": [
      "authorization_code",
      "implicit",
      "refresh_token"
    ],
    "identityMapping": {
      "activeDelegateId": "default-map",
      "properties": {
        "identityMappingRuleReference": "5"
      }
    }
  }
}'

curl -k -vvv --user $USER:$PASSWORD  -H 'Content-Type: application/json' \
-H 'Accept: application/json' https://$HOST/iam/access/v8/federations/ -d "$POST_DATA"

这将返回包含此联盟的UUID的位置标头。 要列出所有联盟,请发出以下命令。

curl -k -vvv --user $USER:$PASSWORD  -H 'Accept: application/json' \
https://$HOST/iam/access/v8/federations/$FED_UUID/partners

要仅显示一个联合身份验证,请将联合身份验证的UUID包含为路径参数:

curl -k -vvv --user $USER:$PASSWORD  -H 'Accept: application/json' \
https://$HOST/iam/access/v8/federations/$FED_UUID/partners/$PARTNER_UUID

注意:必须先部署未决的更改,然后才能使用此联盟。 部署它们将触发运行时重新启动。

配置OP合作伙伴

OP上每个已配置的合作伙伴代表一组用于获得授权的客户端凭据。 这些客户端凭据由以下组成:

  • 客户编号
  • 客户端机密(可选)
  • 重定向URI
  • 允许的范围(至少必须包含openid

可以为OP合作伙伴配置更多选项。 请参阅IBM知识中心,以获取更多信息。

在接下来的子步骤中配置伙伴。

配置测试伙伴
  1. 选择联盟以添加合作伙伴,然后单击“ 合作伙伴”按钮。
    该屏幕截图显示了添加伙伴
  2. 单击添加,然后输入合作伙伴的友好名称。 启用合作伙伴。
    该屏幕截图显示了字段填充
  3. 手动设置客户端凭据,或选中“ 生成”以创建它们。
    该屏幕截图显示了客户端凭据
  4. 输入显示名称。
    屏幕截图显示了内省
  5. 输入重定向URI。
    该屏幕截图显示了重定向
  6. 输入可以请求的有效范围,并指出是否已预先授权对给定范围的同意。
    该屏幕截图显示了范围
  7. 查看摘要以确保所有值正确。
    该屏幕截图显示了摘要
  8. 使用以下代码创建合作伙伴:
    POST_DATA='
      {
        "role": "op",
        "templateName": "",
        "configuration": {
          "responseTypes": [
            "code"
          ],
          "clientId":"rpClient",
          "clientSecret":"rpClientSecret",
          "clientName": "Reverse proxy Client",
          "tokenEndpointAuthMethod": "clientSecretBasic",
          "scope": [
            "openid",
          ],
          "allowRefreshGrant": true,
          "redirectUris": [
            "https://unused.com/"
          ],
          "allowIntrospect": true
        },
        "name": "reverseProxyClient",
        "enabled": true
      }
    '
    
    curl -k -vvv --user $USER:$PASSWORD  -H 'Content-Type: application/json' \
    -H 'Accept: application/json' https://$HOST/iam/access/v8/federations/$UUID/partners -d "$POST_DATA"

注意:必须先部署未决的更改,然后才能使用此合作伙伴。 这将触发运行时重新启动。 要自动生成一个clientIDclientSecret ,请将其从请求中排除。 要指定一个空白的clientSecret ,请包括属性clientSecret ,其值为“”(空字符串)。 反向代理伙伴不能使用客户机密“”,如果伙伴正在执行授权代码流(如以下示例所示),则不能使用“”。

创建反向代理合作伙伴

要创建反向代理合作伙伴凭据,请使用以下代码段。 如果使用用户界面,请确保选中“ 允许自省”选项。

POST_DATA='
  {
    "role": "op",
    "templateName": "",
    "configuration": {
      "responseTypes": [
        "code"
      ],
      "clientId":"rpClient",
      "clientSecret":"rpClientSecret",
      "clientName": "Reverse proxy Client",
      "tokenEndpointAuthMethod": "clientSecretBasic",
      "scope": [
        "openid",
      ],
      "allowRefreshGrant": true,
      "redirectUris": [
        "https://unused.com/"
      ],
      "allowIntrospect": true
    },
    "name": "reverseProxyClient",
    "enabled": true
  }
'

curl -k -vvv --user $USER:$PASSWORD  -H 'Content-Type: application/json' \
-H 'Accept: application/json' https://$HOST/iam/access/v8/federations/$UUID/partners -d "$POST_DATA"

请务必注意, allowIntrospect设置为true。 此设置允许客户端向/introspect端点发出请求。

步骤2.将反向代理配置为OpenID Connect的联系点

为了利用配置的OpenID Connect Provider联合身份,需要将反向代理配置为适当的联系点。 本文假定使用新配置的反向代理。 有关配置反向代理的更多信息,请参阅ISAM版本9用户文档中的配置实例

配置实例后,使用联合身份验证自动配置Web服务适当配置反向代理。 可以使用以下代码段完成此操作。 要查找联盟的UUID,请参阅上面的“ 配置OP联合 ”。

POST_DATA='
{
  "runtime": {
    "hostname": "localhost",
    "port": "443",
    "username": "easuser",
    "password": "passw0rd"
  },
  "federation_id": "'$FED_UUID'",
  "reuse_certs": true,
  "reuse_acls": true
}
'
curl -k -vvv --user $USER:$PASSWORD -H "Accept: application/json" -H "Content-Type:application/json" \
 https://$HOST/wga/reverseproxy/$REVERSE_PROXY_NAME/fed_config -d "$POST_DATA"

进行此调用后,请部署所有待处理的更改并重新启动反向代理。 有关调用fed_config Web服务的更多信息,请参阅设备的Web服务文档,位于安全:Web设置 > 管理 > 反向代理 > 联合身份配置主题下

注意:必须先部署联合身份验证,然后才能调用联合身份验证配置Web服务。

创建一个测试用户

使用以下命令创建一个用于测试的基本TAM用户。 创建此用户后,可以将属性(例如电话号码)添加到该用户。 有关更多信息,请参见创建用户

pdadmin -a sec_master -p $PASSWORD user create testuser cn=testuser,dc=iswga testuser testuser testPwd
pdadmin -a sec_master -p $PASSWORD user modify testuser account-valid yes

执行测试流程

此时,应该已经配置了OpenID Connect提供程序联合,伙伴和反向代理。 尽管本文没有介绍配置任何类型的客户端,但现在可以获得授权。 下面说明如何使用Curl执行授权代码流。 或者,可以在浏览器中执行流程的前半部分,在/token端点的授权代码交换是通过Curl完成的。 为了启动OpenID Connect流,通过客户端启动的某种方法向/authorize端点发出请求。 可以将下面的URL粘贴到浏览器中以检索授权码,也可以使用Curl。

注意:授权代码的默认生存期为60秒。

您可以使用以下脚本执行授权代码流:

#!/bin/bash
#hostname of the reverse proxy
REVERSE_PROXY_HOSTNAME=isam-demo
PROVIDER_ID=acmeProvider
USERNAME=testuser
#populate with testusers password
PASSWORD=
 
#populate with client credentials
CLIENT_ID=
CLIENT_SECRET=
#state is presented at /authorize and /token
STATE=someState$RANDOM$RANDOM$$
#change to a registered redirect URI.
REDIR_URI=https%3A%2F%2FmyService.com%2Fredirect
 
#initial /authorize request
curl -b cookieJar.txt -c cookieJar.txt -v -k
"https://$REVERSE_PROXY_HOSTNAME/isam/oidc/endpoint/amapp-runtime-$PROVIDER_ID/authorize?scope=openid%20profile%20email&response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIR_URI&state=$STATE"
curl -b cookieJar.txt -c cookieJar.txt -v -k "https://$REVERSE_PROXY_HOSTNAME/isam/sps/amapp-runtime-$PROVIDER_ID/oidc/auth"
#this returns a login form
curl -b cookieJar.txt -c cookieJar.txt -v -k "https://$REVERSE_PROXY_HOSTNAME/isam/sps/auth"
 
#POST to the login form
curl -b cookieJar.txt -c cookieJar.txt -v -k -d
"username=$USERNAME&password=$PASSWORD&login-form-type=pwd" "https://$REVERSE_PROXY_HOSTNAME/pkmslogin.form"
curl -b cookieJar.txt -c cookieJar.txt -v -k "https://$REVERSE_PROXY_HOSTNAME/isam/sps/auth"
curl -b cookieJar.txt -c cookieJar.txt -v -k "https://$REVERSE_PROXY_HOSTNAME/isam/sps/amapp-runtime-$PROVIDER_ID/oidc/auth"
#Extract the consent nonce from the consent page
CONSENT=$(curl -b cookieJar.txt -c cookieJar.txt -v -k
"https://$REVERSE_PROXY_HOSTNAME/isam/oidc/endpoint/amapp-runtime-$PROVIDER_ID/authorize?scope=openid%20profile%20email&response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIR_URI&state=$STATE")
CONSENT_NONCE=$(echo $CONSENT |  grep -o -P '((?<="consentNonce":")[a-zA-Z0-9]*(?=")')
#Hard coded consent decision of "yes" to openid, profile, email
CODE_RSP=$(curl -b cookieJar.txt -c cookieJar.txt -v -k
"https://$REVERSE_PROXY_HOSTNAME/isam/oidc/endpoint/amapp-runtime-$PROVIDER_ID/authorize"
-d
"consentNonce=$CONSENT_NONCE&client_id=$CLIENT_ID&response_type=code&scope=openid+profile+email&state=$STATE&redirect_uri=$REDIR_URI&prompt=consent"
2>&1)
# Extract the code

CODE=$(echo $CODE_RSP | grep -o -P '(?<=code=)[^&]*')
echo code: $CODE
 
#Exchange code for an id token at /token, token does not require a cookieJar
curl -k -u $CLIENT_ID:$CLIENT_SECRET
https://$REVERSE_PROXY_HOSTNAME/isam/oidc/endpoint/amapp-runtime-$PROVIDER_ID/token -d
"code=$CODE&grant_type=authorization_code&state=$STATE&redirect_uri=$REDIR_URI"
 
#Make it stateless
rm cookieJar.txt

此脚本的净输出应该是/token端点的成功响应,作为承载令牌,包括声明id_token 。 此声明是JSON Web令牌(JWT)。 一个示例响应是:

{
  "access_token": "RMOqVQl7WHMNDeQQBwoXlpP41cqQdZqEq5TGSZrM",
  "token_type": "Bearer",
  "expires_in": 7199,
  "scope": "openid profile email",
  "refresh_token": "M62yhoNS7uGYboXGy7hJsHCyx6DhdMaCJFYEEXvtwNf18zY1AP",
  "id_token": "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FjbWVQcm92aWRlci5jb20iLCJ
               hdF9oYXNoIjoiVWtwMlo3SnFnSDRna2lPTGJZZnJpQSIsInN1YiI6InRlc3R1c2VyIiw
               iYXVkIjoiOXNwOWhKck1YcExES1BWWTU3TTQiLCJyZWFsbU5hbWUiOiJtZ2EiLCJleHA
               iOjE0NDQ5NzY4NTMsImlhdCI6MTQ0NDk2OTY1M30.ViLy3ixFSkNBfMUFscFiQA6dVWJ
               p4i0QjL7r0_c6e1s"
}

id_token由三部分组成,前两部分是base64URL编码的JSON。 第三个是用于验证JWT的签名。

$ JWT="eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FjbWVQcm92aWRlci5jb20iLCJhdF9oYXN
       oIjoiVWtwMlo3SnFnSDRna2lPTGJZZnJpQSIsInN1YiI6InRlc3R1c2VyIiwiYXVkIjoiOXNwOWh
       Kck1YcExES1BWWTU3TTQiLCJyZWFsbU5hbWUiOiJtZ2EiLCJleHAiOjE0NDQ5NzY4NTMsImlhdCI
       6MTQ0NDk2OTY1M30.ViLy3ixFSkNBfMUFscFiQA6dVWJp4i0QjL7r0_c6e1s"
$ JWT_HEAD=$(echo $JWT | cut -f1 -d".")
$ echo $JWT_HEAD | base64 -d
{"alg":"HS256"}
$ JWT_BODY=$(echo $JWT | cut -f2 -d".")
$ echo $JWT_BODY | base64 -d
{
  "iss": "https://acmeProvider.com",
  "at_hash": "Ukp2Z7JqgH4gkiOLbYfriA",
  "sub": "testuser",
  "aud": "9sp9hJrMXpLDKPVY57M4",
  "realmName": "mga",
  "exp": 1444976853,
  "iat": 1444969653
}

自省令牌

令牌自省端点允许客户端找出access_token的有效性。 该端点需要使用客户端凭据进行身份验证。 一个示例请求将是:

#!/bin/bash
REVERSE_PROXY_HOSTNAME=isam-demo
ACCESS_TOKEN=zWmP2T7qITV2ibMKaicNl8gxoQ9oWlWNX6VAExPE
PROVIDER_ID=acmeProvider
CLIENT_ID=9sp9hJrMXpLDKPVY57M4
CLIENT_SECRET=BYjqNcIHWGrP0wseZMNg

curl -k -u $CLIENT_ID:$CLIENT_SECRET \
https://$REVERSE_PROXY_HOSTNAME/isam/oidc/endpoint/amapp-runtime-$PROVIDER_ID/introspect \
-d "token=$ACCESS_TOKEN"

这将产生以下输出:

{
  "sub": "testuser",
  "grant_type": "authorization_code",
  "realmName": "mga",
  "scope": "openid profile email",
  "active": true,
  "exp": 1445228044,
  "token_type": "Bearer",
  "iat": 1445220844,
  "client_id": "9sp9hJrMXpLDKPVY57M4"
}

这提供了足够的信息,可以用预期的信息正确地填充STSUU

注意:第2、3、5、7和10行中的值将在映射规则中提取并返回到反向代理,然后将其作为属性包括在内。

步骤3.,配置STS链

要配置的STS链采用一个STSUU,并根据其内容添加WebSEAL可以用作授权决策的属性。 这是一个定义明确的接口 。 通过以下步骤配置STS链:

  1. 创建链模板。
  2. 上传地图模块要使用的映射规则。
  3. 创建链模板的实例。

创建链模板

通过STS用户界面完成创建STS模板。 对于此链,您需要三个模块:

  • 模式下的STSUU模块validate
  • 模式map默认映射模块
  • STSUU模块处于模式issue

请按照以下步骤配置模板:

  1. 单击“ 管理”下的“ 安全令牌服务 ”。
    该屏幕截图显示了sts菜单选项
  2. 单击模板
    该屏幕截图显示了模板选择
  3. 单击添加以添加新模板。
    该屏幕截图显示了添加模板
  4. 填充模板。
    该屏幕截图显示了填充模板

上载映射规则

在创建链的实例之前,需要上载默认映射模块要使用的映射规则。 有一个Web界面,允许上载和编辑JavaScript映射规则。 将要上载的映射规则执行以下操作:

  1. 从STSUU中提取access_token。
  2. 如果没有返回访问令牌,则不更改STSUU。
  3. 如果有访问令牌,请向OP的/introspect端点发出请求。
  4. 检查/introspect的响应是否为200
  5. 如果来自/introspect的响应显示令牌无效,则返回未经授权的决定。
  6. 如果来自/introspect的响应包含属性active = true ,则令牌有效; active = true ,令牌无效。 从自省响应中提取值,并将其插入到STSUU中。

此映射规则填充“ 授权执行点的OAuth STS接口 ”中定义的大多数属性。

  1. ISAM版本9添加了用于管理映射规则的Web界面。 单击 全局设置 下的 映射规则
    该屏幕截图显示了映射规则的选择
  2. 单击添加以添加新规则。
    该屏幕截图显示了新规则的添加
  3. 保存规则。
    该屏幕截图显示了规则的保存

映射规则为:

//Use the trace strings below to debug:
//com.tivoli.am.fim.trustserver.sts.utilities.* so IDMappingExtUtils.traceString will show.
//com.tivoli.am.fim.trustserver.sts.modules.* rule execution pre/post
//com.ibm.security.access.httpclient.* http client debugging.
importPackage(Packages.com.tivoli.am.fim.trustserver.sts);
importPackage(Packages.com.tivoli.am.fim.trustserver.sts.uuser);
importPackage(Packages.com.tivoli.am.fim.trustserver.sts.utilities);
importPackage(Packages.com.ibm.security.access.httpclient);

// Types:
var attribute = "urn:ibm:names:ITFIM:oauth:response:attribute";
var decision = "urn:ibm:names:ITFIM:oauth:response:decision";
var param = "urn:ibm:names:ITFIM:oauth:param";

//Names(minimum):
var USERNAME = "username";
var AUTHZ = "authorized";
var EXPIRES = "expires";
var AT = "access_token";

//Names (extra):

var CLIENT_TYPE = "client_type"; // "confidential" or "public"
var SCOPE = "scope";
var TOKEN_CLIENT_ID = "oauth_token_client_id"

//Constants:
var TRUE = "TRUE";
var FALSE = "FALSE";

// Introspect details:
var ENDPOINT = "https://127.0.0.1/oidc/endpoint/amapp-runtime-acmeProvider/introspect";

// Used to authenticate to /introspect
var CLIENT_ID = "websealClient";
var CLIENT_SECRET = "websealClientSecret";

var access_token = stsuu.getContextAttributes().getAttributeValueByName(AT);

IDMappingExtUtils.traceString("access_token: " + access_token);
if (access_token != null || access_token.trim() != "" ) {
	var body = "token=" + access_token;
	IDMappingExtUtils.traceString("body: " + body);

	var headers = new Headers();
	headers.addHeader("Accept", "*/*");
	/*
	 * httpPost(String url,
	 *          Map headers,
	 *          String body,
	 *          String httpsTrustStore,
	 *          String basicAuthUsername,
	 *          String basicAuthPassword,
	 *          String clientKeyStore,
	 *          String clientKeyAlias);
	 */
	var hr = HttpClient.httpPost(
			ENDPOINT,
			headers,
			body,
			"rt_profile_keys",
			CLIENT_ID,
			CLIENT_SECRET,
			null, null)

	IDMappingExtUtils.traceString("code: " + hr.getCode());
	IDMappingExtUtils.traceString("body: " + hr.getBody());

	if (hr.getCode() == "200") {
		var rsp = JSON.parse(hr.getBody());
		IDMappingExtUtils.traceString("active:" + rsp.active);
		IDMappingExtUtils.traceString("is active:" + (rsp.active == true));
		IDMappingExtUtils.traceString("clientId:" + rsp.client_id);
		IDMappingExtUtils.traceString("sub:" + rsp.sub);
		//active will be false if its bad otherwise
		if(rsp.active == true) {
			// active == authorized
			stsuu.addAttribute(new Attribute(AUTHZ, decision, TRUE));

			//Some attributes
			stsuu.addAttribute(new Attribute(USERNAME, attribute, rsp.sub));
			stsuu.addAttribute(new Attribute(TOKEN_CLIENT_ID, attribute, rsp.client_id));
			stsuu.addAttribute(new Attribute(SCOPE, attribute, rsp.scope));
			stsuu.addAttribute(new Attribute(EXPIRES, decision, secondsToDate(rsp.exp)));

			// Based on the grant type used to get this
			// access_token we decide on the client_type:
			if(rsp.grant_type == "authorization_code"){
				stsuu.addAttribute(new Attribute(CLIENT_TYPE, attribute, "confidential"));
			} else {
				stsuu.addAttribute(new Attribute(CLIENT_TYPE, attribute, "public"));
			}
		} else {
			IDMappingExtUtils.traceString("invalid access token");
			stsuu.addAttribute(new Attribute(AUTHZ, decision, FALSE));
		}
	} else {
		IDMappingExtUtils.traceString("non 200 code");
		stsuu.addAttribute(new Attribute(AUTHZ, decision, FALSE));
	}

} else {
	IDMappingExtUtils.traceString("access_token was null");
	stsuu.addAttribute(new Attribute(AUTHZ, decision, FALSE));
}

/*
 * Helper:
 * Turn an OIDC exp property which is in seconds and turn it into a string
 * suitable for the EXPIRES attribute of a STSUU
 */
function secondsToDate(seconds) {
	var d = new Date(0);
	d.setSeconds(seconds);
	IDMappingExtUtils.traceString("Expires:" + d);
	return IDMappingExtUtils.getTimeStringUTC(d.getFullYear(),
						  d.getMonth(),
						  d.getDay(),
						  d.getHours(),
						  d.getMinutes(),
						  d.getSeconds());
}

创建链

现在有了模板,您可以配置映射规则以使用链的实例。 使用反向代理调用链时将使用的值来配置链。 颁发者地址必须为urn:ibm:ITFIM:oauth20:token:bearer ,但是您可以配置反向代理提供的“应用于”。 它将显示的默认值为https://localhost/sps/oauthfed/oauth10 。 可以在[oauth]节的default-fed-id属性default-fed-id设置反向代理将使用的值。 本示例使用https://localhost/sps/oidc的“应用于”值。

  1. 添加一条链。
    该屏幕截图显示了添加链
  2. 配置一个新链。
    该屏幕截图显示了链配置
  3. 设置“请求类型”,“颁发者”和“应用于”值。
    该屏幕截图显示了值的设置
  4. 配置模块。 在这种情况下,您只能使用一个选项(要使用的规则)配置默认地图模块。
    该屏幕截图显示了模块的配置

测试链

您可以使用下面的代码片段测试配置的STS链。 该请求必须是包含请求安全令牌的SOAP消息。 反向代理将发送的消息将包含有关请求的端点和反向代理的几条信息。 但是,提供的规则仅使用“ access_token”上下文属性。 下面的示例仅提供一个access_token。 反向代理提供的属性可用于增强规则。

#!/bin/bash
#For more on invoking the STS via HTTP.

REVERSE_PROXY_HOSTNAME=isam-demo
ISSUER=urn:ibm:ITFIM:oauth20:token:bearer
APPLIES_TO=https://localhost/sps/oidc
ACCESS_TOKEN=39eAcg8X9PUN6CWGoF9Wnti1KDME9IsjeR8y49fh
USER=easuser
PASSWORD=passw0rd

BODY='
<SOAP-ENV:Envelope
          xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:ns1="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
          xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
          xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
          xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
>
  <SOAP-ENV:Body>
    <ns1:RequestSecurityTokenCollection>
      <ns1:RequestSecurityToken>
        <wsp:AppliesTo>
          <wsa:EndpointReference>
            <wsa:Address>https://localhost/sps/oidc</wsa:Address>
          </wsa:EndpointReference>
        </wsp:AppliesTo>
        <wst:Issuer>
          <wsa:Address>urn:ibm:ITFIM:oauth20:token:bearer</wsa:Address>
        </wst:Issuer>
        <wst:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Validate</wst:RequestType>
        <wst:Base>
          <stsuuser:STSUniversalUser xmlns:stsuuser="urn:ibm:names:ITFIM:1.0:stsuuser">
            <stsuuser:Principal/>
            <stsuuser:AttributeList/>
            <stsuuser:RequestSecurityToken>
              <stsuuser:Attribute name="AppliesTo" type="http://schemas.xmlsoap.org/ws/2004/09/policy">
                <stsuuser:Value>https://localhost/sps/oidc</stsuuser:Value>
              </stsuuser:Attribute>
              <stsuuser:Attribute name="Issuer" type="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                <stsuuser:Value>urn:ibm:ITFIM:oauth20:token:bearer</stsuuser:Value>
              </stsuuser:Attribute>
              <stsuuser:Attribute name="Base" type="urn:ibm:names:ITFIM:1.0:stsuuser">
                <stsuuser:Value>
                  <stsuuser:STSUniversalUser>
                    <stsuuser:ContextAttributes>
                      <stsuuser:Attribute name="access_token" type="urn:ibm:names:ITFIM:oauth:param">
                        <stsuuser:Value>QLW6clF6O6NEXu8KjMZ2r2u9Si4qYtEC67EUMYon</stsuuser:Value>
                      </stsuuser:Attribute>
                    </stsuuser:ContextAttributes>
                  </stsuuser:STSUniversalUser>
                </stsuuser:Value>
              </stsuuser:Attribute>
            </stsuuser:RequestSecurityToken>
            <stsuuser:ContextAttributes>
              <stsuuser:Attribute name="access_token" type="urn:ibm:names:ITFIM:oauth:param">
                <stsuuser:Value>QLW6clF6O6NEXu8KjMZ2r2u9Si4qYtEC67EUMYon</stsuuser:Value>
              </stsuuser:Attribute>
            </stsuuser:ContextAttributes>
            <stsuuser:AdditionalAttributeStatement/>
          </stsuuser:STSUniversalUser>
        </wst:Base>
      </ns1:RequestSecurityToken>
    </ns1:RequestSecurityTokenCollection>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
'
curl -k -vvv --user $USER:$PASSWORD \
https://$REVERSE_PROXY_HOSTNAME/isam/TrustServerWS/SecurityTokenServiceWST13 -d "$BODY"

注意:端点将需要附加一个unauth acl 。 或者,将运行时绑定到外部接口,并更新URL以直接进入运行时。 注意: STS受BA身份验证的保护。 有关配置用户帐户的更多信息,请参见管理用户注册表

步骤4.将反向代理配置为实施点

现在,您需要将反向代理配置为OAuth PEP。 您将使用之前的相同实例。 对配置文件进行以下更改,以启用OAuth授权。 记下default-fed-iddefault-fed-id值,因为它必须与STS链的“应用于”值相对应。

[oauth]
fed-id-param = FederationId
default-fed-id = https://localhost/sps/oidc
user-identity-attribute = username
oauth-auth = both
cluster-name = oauth-cluster

[server]
http-method-disabled-remote = TRACE,CONNECT

[tfim-cluster:oauth-cluster]
basic-auth-user = easuser
basic-auth-passwd = passw0rd
handle-idle-timeout = 240
handle-pool-size = 10
ssl-keyfile = pdsrv.kdb
ssl-keyfile-stash = pdsrv.sth
server = 9,https://127.0.0.1/TrustServerWS/SecurityTokenServiceWST13
ssl-keyfile-label = server
[azn-decision-info]
HTTP_CONTENT_TYPE_HDR = header:content-type
HTTP_HOST_HDR = header:host
HTTP_REQUEST_METHOD = method
HTTP_TRANSFER_ENCODING_HDR = header:transfer-encoding
HTTP_AZN_HDR = header:authorization
HTTP_REQUEST_URI = uri
HTTP_REQUEST_SCHEME = scheme

这是在下面的代码段中编写的脚本。

#! /bin/bash
USER=admin
PASSWORD=
HOST=
INST=default
APPLIES_TO=https://localhost/sps/oidc
RUNTIME=127.0.0.1

function setEntry {
    STZ=$1b
    ENT=$2
    VAL=$3

    curl -k -H "Accept: application/json" -H "Content-Type: application/json" \
    --user $USER:$PASSWORD https://$HOST/wga/reverseproxy/$INST/configuration/stanza/$STZ/entry_name/$ENT \
    -X PUT -d '{"value":"'$VAL'"}'

}

setEntry oauth fed-id-param  FederationId
setEntry oauth default-fed-id  $APPLIES_TO
setEntry oauth user-identity-attribute username
setEntry oauth oauth-auth both
setEntry oauth cluster-name oauth-cluster

setEntry server http-method-disabled-remote TRACE,CONNECT

setEntry "tfim-cluster:oauth-cluster" ssl-keyfile-stash pdsrv.sth
setEntry "tfim-cluster:oauth-cluster" basic-auth-user easuser
setEntry "tfim-cluster:oauth-cluster" handle-idle-timeout 240
setEntry "tfim-cluster:oauth-cluster" handle-pool-size 10
setEntry "tfim-cluster:oauth-cluster" basic-auth-passwd passw0rd
setEntry "tfim-cluster:oauth-cluster" ssl-keyfile pdsrv.kdb
setEntry "tfim-cluster:oauth-cluster" server 9,https://$RUNTIME/TrustServerWS/SecurityTokenServiceWST13
setEntry "tfim-cluster:oauth-cluster" ssl-keyfile-label server

setEntry azn-decision-info HTTP_CONTENT_TYPE_HDR header:content-type
setEntry azn-decision-info HTTP_HOST_HDR header:host
setEntry azn-decision-info HTTP_REQUEST_METHOD method
setEntry azn-decision-info HTTP_TRANSFER_ENCODING_HDR header:transfer-encoding
setEntry azn-decision-info HTTP_AZN_HDR header:authorization
setEntry azn-decision-info HTTP_REQUEST_URI uri
setEntry azn-decision-info HTTP_REQUEST_SCHEME scheme


curl -k -v -L -H 'Accept: application/json' -X PUT --user $USER:$PASSWORD
https://$HOST/isam/pending_changes
curl -k -v -L -H 'Accept: application/json' -H "Content-Type: application/json" -X PUT \
--user $USER:$PASSWORD https://$HOST/wga/reverseproxy/$INST -d
 '{"operation":"restart"}'

配置POP

POP需要配置为触发OAuth EAS。 有关OAuth EAS的更多信息,请参见“ OAuth EAS的高级概述 。您可以使用以下pdadmin命令来配置POP:

pop create oidc-pop
pop modify oidc-pop set attribute eas-trigger oauth_pop_trigger

将此附加到根资源作为测试:

pop attach /WebSEAL/isam-op-default/ oidc-pop
server replicate

测试PEP

现在,访问令牌可以用作通过使用Authorization:Bearer标头通过反向代理对请求进行身份验证的方法。 可以按照以下步骤进行测试:

  1. 获取访问令牌。
  2. 访问不带标题的资源,并提示登录。
  3. 使用授权标头访问资源并被允许通过。

如下所示:

$ curl -v -k -L  https://isam-demo/
> GET / HTTP/1.1
> User-Agent: curl/7.37.0
> Host: isam-demo
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 12505
< content-type: text/html
< date: Tue, 20 Oct 2015 01:06:46 GMT
<
...
      &lt;form class="login-container" method="POST"
      action="/pkmslogin.form?token=Unknown"&gt;
... Login form.

$ curl -v -k -L -H "Authorization: Bearer QLW6clF6O6NEXu8KjMZ2r2u9Si4qYtEC67EUMYon" \
https://isam-demo/
> GET / HTTP/1.1
> User-Agent: curl/7.37.0
> Host: isam-demo
> Accept: */*
> Authorization: Bearer QLW6clF6O6NEXu8KjMZ2r2u9Si4qYtEC67EUMYon
>
< HTTP/1.1 200 OK
< content-length: 510
< content-type: text/html
...
   &lt;center&gt;&lt;img src="/pics/iv30.gif" alt=""&gt;&lt;/center&gt;
...Reverse Proxy Landing page

现在可以将POP附加到各种资源,以允许使用access_tokens访问它们。

结论

这样就完成了配置,以使ISAM反向代理能够接受OpenID Connect访问令牌作为身份验证方法。 您现在应该能够:

  • 通过使用UI或Web服务来配置OpenID Connect联合身份验证。
  • 调用联合身份验证配置Web服务。
  • 执行OpenID Connect授权代码流。
  • 创建一个STS模板和链。
  • 创建POP并将其附加到资源。
  • 通过使用访问令牌作为身份验证方法从反向代理请求页面

翻译自: https://www.ibm.com/developerworks/security/library/se-configure-ISAM-reverse-proxy-PeP-to-OpenID-connect-provider-trs/index.html

isam 驱动程序 下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值