Módulo de Autenticação Personalizada no OAM e no SP

Este artigo cria um novo Módulo de Autenticação personalizado no OAM/SP, que é feito de Plug-ins de Autenticação de Federação do OAM existentes e de um plug-in personalizado que:

Para obter mais informações sobre como projetar um Plug-in de Autenticação personalizado, consulte o OAM Developer's Guide, que descreve como desenvolver esse módulo.

Foque em como:

Módulo de Autenticação da Federação

O Módulo de Autenticação de Federação OOTB, chamado FederationPlugin, é feito de dois plug-ins:

A orquestração pode ser vista por:

  1. Vá para a Console de Administração do OAM: http(s)://oam-admin-host:oam-adminport/oamconsole.

  2. Navegue até Gerenciador de Acesso , Módulos de Autenticação.

  3. Abra FederationScheme.

  4. Clique na guia Steps para ver os plug-ins.

  5. Clique na guia Steps Orchestration para ver a orquestração entre os diferentes plug-ins e o plug-in usado para iniciar a operação.

Descrição da ilustração Steps_Orchestration_Screen.jpg

Plug-in FedAuthnRequestPlugin

O FedAuthnRequestPlugin pode consumir informações de um Plug-in de Autenticação personalizado anterior que afeta como a operação SSO de Federação será acionada.

A instância AuthenticationContext compartilhada entre os Plug-ins de Autenticação contém objetos CredentialParam que permitem que os vários plug-ins se comuniquem no runtime.

oracle.security.am.plugin.authn.AuthenticationContext: Contexto da operação de autenticação Compartilhada entre os diversos Plug-ins de Autenticação

oracle.security.am.plugin.authn.Credential: Coleção de dados de credenciais Armazenados no AuthenticationContext

oracle.security.am.plugin.authn.CredentialParam: Parâmetro de credencial única Referenciado por um nome e tem um tipo (string na maioria das vezes) Tem um valor, dependendo do tipo Armazenado na instância de Credencial

Usando esse mecanismo, o FedAuthnRequestPlugin pode consumir vários tipos de informações ao iniciar uma operação SSO de Federação, armazenada na instância Credencial:

Plug-in de Autenticação Personalizada

Visão Geral

O Plug-in de Autenticação personalizado:

No exemplo, temos:

Esses três elementos são agrupados em um arquivo JAR que é submetido a upload para o servidor OAM por meio da Console de Administração do OAM. Depois de fazer upload e ativá-lo, crie um Módulo de Autenticação da Federação.

Classe Java

A classe que implementa meu plug-in de Autenticação personalizado deve seguir o seguinte:

O código a seguir é um exemplo do plug-in personalizado.

 package userauthn;
 import java.util.Map;
 import oracle.security.am.plugin.ExecutionStatus; import oracle.security.am.plugin.MonitoringData;
 import oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn; import oracle.security.am.plugin.authn.AuthenticationContext; import oracle.security.am.plugin.authn.AuthenticationException; import oracle.security.am.plugin.authn.CredentialParam;
 public class CustomIdPSelectionPlugin extends
 AbstractAuthenticationPlugIn
 {
  public ExecutionStatus process(AuthenticationContext context)
  throws AuthenticationException {
  // requested URL
  String resourceURL = context.getResourceURL();
  // determines the IdP based on the request resource
  String idpPartnerName = null;
  if (resourceURL.startsWith("http://company.com/businesspartners/acmebank"))
  idpPartnerName = "AcmeIdP";
  else if (resourceURL.startsWith("http://company.com/businesspartners/worldbank"))
  idpPartnerName = "WorldBank";
  else if (resourceURL.startsWith("http://company.com/businesspartners/worldinsurance"))
  idpPartnerName = "WInsuranceIdP";
  // if IdP was determined, create a Credential param
  // instance in the AuthenticationContext
  // the OAM/SP FedAuthnRequestPlugin will consume it
 to start Federation SSO if (idpPartnerName != null) {
  CredentialParam idpParam = new
 CredentialParam();
  idpParam.setName("KEY_FEDIDP");
  idpParam.setType("string");
  idpParam.setValue(idpPartnerName);

 context.getCredential().addCredentialParam("KEY_FEDIDP", idpParam);
  }
  // here, the plugin evaluates if the account subpath is being requested
  // if it is, it requests from IdP higher Fed Auth
 Method
  String fedAuthnMethod = null;
  if ("AcmeIdP".equals(idpPartnerName) &&
  resourceURL.startsWith("http://company.com/businesspartners/acmebank/account")) { // AcmeIdP supports X.509 as the higher
 authentication method
  fedAuthnMethod =
 "urn:oasis:names:tc:SAML:2.0:ac:classes:X509";
  } else if ("WorldBank".equals(idpPartnerName) &&
  resourceURL.startsWith("http://company.com/businesspartners/worldbank/account")) // WorldBank supports smart card as the higher
 authentication method
  fedAuthnMethod =
 "urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI";
  } else if ("WInsuranceIdP".equals(idpPartnerName)
 &&
  resourceURL.startsWith("http://company.com/businesspartners/worldinsurance/account"))
  {
  // WInsuranceIdP does not support another fed
 authn method
  }
  // if another fed authn method was requested, create a Credential param
  // instance in the AuthenticationContext
  // the OAM/SP FedAuthnRequestPlugin consumes it to start Federation SSO if (fedAuthnMethod != null) {
  CredentialParam fedAuthnParam = new
 CredentialParam();

 fedAuthnParam.setName("KEY_FEDAUTHNMETHOD")
  fedAuthnParam.setType("string");
  fedAuthnParam.setValue(fedAuthnMethod);

 context.getCredential().addCredentialParam("KEY_FEDAUTHNMETHOD fedAuthnParam);
  }
  // return success, which is mapped to
 FedAuthnRequestPlugin in the
  // Authentication Module steps orchestration
  return ExecutionStatus.SUCCESS;
  }
  public String getPluginName() {
  return "CustomIdPSelectionPlugin";
  }
  public String getDescription() {
  return "Custom IdP Selection Plugin";
  }
  public Map<String, MonitoringData> getMonitoringData() {
  return null;
  }
  public boolean getMonitoringStatus() {
  return false;
  }
  public int getRevision() {
  return 10;
  }
 public void setMonitoringStatus(boolean arg0) {
  } }

Arquivo de registro de plug-in

O plug-in de Autenticação personalizado deve ser definido em um arquivo XML de plug-in como:

<Plugin type="Authentication">
<author>uid=admin</author>
<email>admin@example</email>
<creationDate>08:00:00,2014-01-15</creationDate>
<description>Custom IdP Selection
Plugin</description>
<confguration>
</confguration>

Observação Importante: O arquivo XML deve ter o mesmo nome da classe que implementa o plug-in, neste caso CustomIdPSelectionPlugin.xml

Consulte o Guia do Desenvolvedor do OAM para obter mais informações

Arquivo Manifest

Antes de empacotar o plug-in de Autenticação personalizado em uma JAR fle, um MANIFEST.MF deve ser definido como:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CustomIdPSelectionPlugin
Bundle-SymbolicName: CustomIdPSelectionPlugin
Bundle-Version: 10
Bundle-Activator: userauthn.CustomIdPSelectionPlugin Import-Package:
org.osgi.framework;version="1.3.0",oracle.security.am. plugin,oracle.security.am.plugin.authn Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Consulte o Guia do Desenvolvedor do OAM para obter mais informações

Observação: O arquivo de manifesto deve incluir a propriedade ImportPackage, que lista todos os pacotes usados no plug-in

Criando o Plug-in

Compilação

Os seguintes arquivos JAR da implantação do OAM precisam ser usados para compilação:

Esses arquivos estão localizados nos seguintes locais:

Neste exemplo, inserimos o arquivo CustomIdPSelectionPlugin.java em uma pasta src/userautn:

bash-4.1$ ls -l src/userauthn/total 4
-rw-r--r-- 1 root root 3894 Mar 1 11:42 CustomIdPSelectionPlugin.java

Para compilar, execute o seguinte comando:

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/serve/lib/plugin/felix.jar:$IAM_HOME/oam/server/lib/plu /oam-plugin.jar src/userauthn/*.java

Empacotando o Plug-in Personalizado

Criamos o MANIFEST.MF no diretório atual com base no conteúdo listado na seção anterior e o CustomIdPSelectionPlugin.xml no diretório src, que contém a definição de plug-in listada na seção anterior.

find
.
./MANIFEST.MF
./src
./src/userauthn
./src/userauthn/CustomIdPSelectionPlugin.class
./src/userauthn/CustomIdPSelectionPlugin.java ./src/CustomIdPSelectionPlugin.xm

Para criar o arquivo JAR CustomIdPSelectionPlugin.jar que contém o plug-in e os arquivos necessários, execute o seguinte comando:

jar cfvm CustomIdPSelectionPlugin.jar MANIFEST.MF -C src/ .
added manifest
adding: userauthn/(in = 0) (out= 0)(stored 0%) adding: userauthn/CustomIdPSelectionPlugin.class(in =2717) (out= 1267)(deflated 53%)
adding: userauthn/CustomIdPSelectionPlugin.java(in =3894) (out= 1055)(deflated 72%)
adding: CustomIdPSelectionPlugin.xml(in = 234) (out= 155)(deflated 33%)

Isso cria o CustomIdPSelectionPlugin.jar. Para exibir o conteúdo do arquivo:

unzip -l CustomIdPSelectionPlugin.jar Archive: CustomIdPSelectionPlugin.jar
Tamanho Data Hora Nome
0 03-01-2014 10h14 META-INF/
425 03-01-2014 10h14 META-INF/MANIFEST.MF
0 03-01-2014 10h13 userauthn/
2717 03-01-2014 10h13 userauthn/CustomIdPSelectionPlugin.class
3894 03-01-2014 09h56 userauthn/CustomIdPSelectionPlugin.java
234 03-01-2014 10h03 CustomIdPSelectionPlugin.xml
7270     6 pés

Observação Importante: o arquivo JAR deve ter o mesmo nome da classe que implementa o plug-in; nesse caso, CustomIdPSelectionPlugin.jar

Implantação do Plug-in de Autenticação Personalizada

Execute as seguintes etapas para implantar o plug-in de Autenticação personalizado no OAM:

  1. Vá para a Console de Administração do OAM: http(s)://oam-admin-host:oam-adminport/oamconsole

  2. Navegue até Gerenciador de Acesso , Plug-ins

  3. Clique em Importar Plug-In

  4. Selecione o arquivo JAR do plug-in (CustomIdPSelectionPlugin.jar neste exemplo)

Descrição da ilustração Import_Plug-In_Screen.jpg

O plug-in estará em um estado de upload:

Descrição da ilustração Plug-In_State_Screen.jpg

Você precisa distribuir o plug-in aos servidores OAM de runtime e ativá-lo:

Descrição da ilustração Activation_Status_Screen.jpg

Você precisa ativar o plugin:

Descrição da ilustração Activate_Plugin_Screen.jpg

Criando o Módulo de Autenticação

Crie um novo Módulo de Autenticação de Federação, com base no Módulo de Autenticação FederationPlugin existente, que difere do existente:

Execute as seguintes etapas para criar um novo Módulo de Autenticação:

  1. Vá para a Console de Administração do OAM: http(s)://oam-admin-host:oam-adminport/oamconsole

  2. Navegue até Gerenciador de Acesso, Módulos de Autenticação

  3. Clique em Criar Módulo de Autenticação

  4. Selecione Criar Módulo de Autenticação Personalizado

  5. Digite um Nome (CustomFedModule, por exemplo)

Descrição da ilustração Authentication_Module_Screen.jpg

Execute as seguintes etapas para adicionar etapas ao novo Módulo de Autenticação:

  1. Clique na guia Steps

  2. Clique em Adicionar para adicionar a etapa FedAuthnRequestPlugin:

    1. Nome da etapa: FedAuthnRequestPlugin

    2. Nome do Plugin: FedAuthnRequestPlugin

  3. Clique em OK

Descrição da ilustração Authentication_Steps_Screen.jpg

  1. Clique em Adicionar para adicionar a etapa AssertionProcessing:

    1. Nome da etapa: AssertionProcessing

    2. Nome do Plugin: FedUserAuthenticationPlugin

  2. Clique em OK

Descrição da ilustração Assertion_Processing_Screen.jpg

  1. Clique em Adicionar para adicionar a etapa IdPSelection:

    1. Nome da etapa: IdPSelection

    2. Nome do Plugin: CustomIdPSelectionPlugin

  2. Clique em OK.

Descrição da ilustração IdP_Selection_Screen.jpg

A guia Steps mostra:

Descrição da ilustração Steps_Screen.jpg

Execute as seguintes etapas para definir a orquestração de etapas para o novo Módulo de Autenticação:

  1. Clique na guia Steps Orchestration

  2. Selecione IdPSelection como a Etapa Inicial

  3. Para FedAuthnRequestPlugin:

    1. Selecionar êxito para o Sucesso

    2. Selecione AssertionProcessing para Em Caso de Falha

    3. Selecionar falha para Em Erro

  4. Para AssertionProcessing:

    1. Selecionar êxito para o Sucesso

    2. Selecionar falha para Ao Falha

    3. Selecionar falha para Em Erro

  5. Para IdPSelection:

    1. Selecione FedAuthnRequestPlugin para Sucesso

    2. Selecionar falha para Ao Falha

    3. Selecionar falha para Em Erro

  6. Clique em Aplicar.

Descrição da ilustração Define_steps_orchestration_Screen.jpg

Esquema de Autenticação

Antes de ser capaz de proteger recursos com uma Política de Autenticação que usa esse novo Módulo de Autenticação, é necessário criar um novo Esquema de Autenticação, referenciando esse novo módulo personalizado. Isso é obrigatório, pois a Política de Autenticação está vinculada a um Esquema de Autenticação, não a um Módulo de Autenticação.

Para criar um novo Esquema de Autenticação para esse módulo personalizado, execute as seguintes etapas:

  1. Vá para a Console de Administração do OAM: http(s)://oam-admin-host:oam-adminport/oamconsole

  2. Navegue até Gerenciador de Acesso, Esquemas de Autenticação

  3. Clique em Criar Esquema de Autenticação

  4. Digite um nome (por exemplo, CustomFedScheme) e uma descrição

  5. Definir o Nível de Autenticação como um valor aceitável (2 no meu exemplo) Selecionar FORM como o Método de Desafio

  6. Definir o URL de Redirecionamento do Desafio (Neste exemplo, definimos como /oam/server/)

  7. Selecione o Módulo de Autenticação personalizado recém-criado (CustomFedModule no exemplo)

  8. Definir o URL do Desafio (/pages/servererror.jsp neste exemplo)

  9. Defina o Tipo de Contexto (customWar, por exemplo) Defina o Valor de Contexto (/oam aqui, pois não usamos nenhuma página)

  10. Informe o seguinte para os Parâmetros de Desafio pelo menos: initial_command=NONE is_rsa=true

  11. Clique em Aplicar

Descrição da ilustração Authentication_Scheme_Screen.jpg

Teste

Proteja um recurso com uma Política de Autenticação usando o Esquema de Autenticação recém-criado. Isso chama o Módulo de Autenticação personalizado.

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.