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:
-
Avalia o recurso protegido solicitado
-
Determina o IdP a ser usado na operação SSO da Federação
-
Solicita um Método de Autenticação de Federação mais alto do IdP, dependendo do recurso que está sendo solicitado
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:
-
Implementar o plug-in
-
Compile-o
-
Empacotá-lo
-
Fazer upload do plug-in para o OAM
-
Criar um novo Módulo de Autenticação
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:
-
FedAuthnRequestPlugin: Inicia o fluxo SSO de Federação, determina qual IdP usar se não for fornecido por um Plug-in de Autenticação anterior, cria uma solicitação SSO e redireciona o usuário para IdP -
AssertionProcessing: Processa uma Resposta de SSO SAML/OpenID de entrada e mapeia a mensagem para um registro de usuário local no diretório LDAP
A orquestração pode ser vista por:
-
Vá para a Console de Administração do OAM:
http(s)://oam-admin-host:oam-adminport/oamconsole. -
Navegue até Gerenciador de Acesso , Módulos de Autenticação.
-
Abra
FederationScheme. -
Clique na guia Steps para ver os plug-ins.
-
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:
-
IdP para executar SSO de Federação com Opcional Referenciado pela string
KEY_FEDIDP-
Type: string -
Value: IdP Nome do Parceiro
-
-
O Método de Autenticação da Federação para solicitar do IdP Opcional Referenciado pelo
KEY_FEDAUTHNMETHOD-
Tipo
string: string -
Value: O Método de Autenticação da Federação que deve ser definido na solicitação de SSO
-
-
O atributo Comparação do Método de Autenticação da Federação SAML 2.0 Opcional Referenciado pela string
KEY_FEDAUTHNMETHODCOMP-
Type: string -
Value: A comparação a ser usada no SAML
-
-
2.0 Mensagem de Solicitação de Autenticação exata para melhor para melhor mínimo para máximo O Forçar
AuthnWag Opcional Referenciado pela stringKEY_FEDFORCEAUTHN-
Type: string -
Value: A string "verdadeira" ou "falsa" para indicar se o OAM/SP deve ou não solicitar o IdP para desafiar o usuário, mesmo que ele já esteja autenticado no IdP
-
-
A Vag Passiva é Opcional Referenciada pela string
KEY_FEDISPASSIVE-
Type: string -
Value: A string "verdadeiro" ou "falso" para indicar se o IdP pode ou não interagir com o usuário
-
Plug-in de Autenticação Personalizada
Visão Geral
O Plug-in de Autenticação personalizado:
-
Avalia o recurso solicitado
-
Determina o IdP a ser usado
-
Solicita um Método de Autenticação de Federação forte do IdP quando um recurso confidencial é solicitado, se o IdP suportar um Método de Autenticação de Federação mais forte
No exemplo, temos:
-
Três parceiros IdP:
-
AcmeIdP que suporta os seguintes Métodos de Autenticação de Federação
-
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport(padrão, não é necessário solicitá-lo especificamente) -
urn:oasis:names:tc:SAML:2.0:ac:classes:X509 -
WorldBank
-
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport(padrão, não é necessário solicitá-lo especificamente)urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI -
WInsuranceIdP -
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport(padrão, não é necessário solicitá-lo especificamente) -
Três recursos de alto nível:
-
http://company.com/businesspartners/acmebank, vinculado aAcmeIdP -
http://company.com/businesspartners/worldbank, vinculado a WorldBank -
http://company.com/businesspartners/worldinsurance, vinculado aWInsuranceIdP
-
-
Três recursos confidenciais, para os três recursos de alto nível:
-
http://company.com/businesspartners/acmebank/account -
http://company.com/businesspartners/worldban/account -
http://company.com/businesspartners/worldinsurance/account
-
-
O plug-in de Autenticação Personalizado é composto pelo seguinte:
-
Uma classe Java que estende a classe
oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn -
Um arquivo
MANIFEST.MFdescrevendo as classes Java -
Um arquivo XML descrevendo o plug-in
-
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:
-
Estender a classe
oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn -
Implemente os seguintes métodos:
-
público
ExecutionStatus-
process(
AuthenticationContextcontext) geraAuthenticationException -
Deve retornar um status (falha ou sucesso)
-
No nosso exemplo, este método avalia o recurso solicitado
-
Defina
KEY_FEDIDPCredentialParampara indicar o IdP a ser usado -
Defina
KEY_FEDAUTHNMETHODCredentialParampara solicitar um Método de Autenticação de Federação específico do IdP
-
-
String pública
getPluginName()- Retorna o nome do plug-in personalizado
-
Em nosso exemplo, ele retorna
CustomIdPSelectionPlugin -
String pública
getDescription()-
Retorna uma descrição do Plug-in de Autenticação personalizado
-
Em nosso exemplo, ele retorna "Custom IdP Selection Plugin"
-
-
público
Map <String, MonitoringData> getMonitoringData()-
Não usado em um fluxo de Plug-in de Autenticação
-
Em nosso exemplo, ela retorna um valor nulo
-
-
boolean público
getMonitoringStatus()-
Não usado em um fluxo de Plug-in de Autenticação
-
Em nosso exemplo, ela retorna falso
-
-
public int
getRevision()-
Deve ser o mesmo valor da versão especificada no arquivo de manifesto
-
Em nosso exemplo, ele retorna 10
-
-
public void
setMonitoringStatus(boolean status)-
Não usado em um fluxo de Plug-in de Autenticação
-
Em nosso exemplo, esse método está vazio
-
-
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:
-
felix.jar
-
oam-plugin.jar
Esses arquivos estão localizados nos seguintes locais:
-
felix.jar:$IAM_HOME/oam/server/lib/plug/felix.jar -
oam-plugin.jar:$IAM_HOME/oam/serve /lib/plugin/oam-plugin.jar
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:
-
Vá para a Console de Administração do OAM:
http(s)://oam-admin-host:oam-adminport/oamconsole -
Navegue até Gerenciador de Acesso , Plug-ins
-
Clique em Importar Plug-In
-
Selecione o arquivo JAR do plug-in (
CustomIdPSelectionPlugin.jarneste 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:
-
Selecione o plug-in
-
Clique em Distribuir Selecionado
-
A guia Status da Ativação do plug-in mostra o estado do plug-in

Descrição da ilustração Activation_Status_Screen.jpg
Você precisa ativar o plugin:
-
Selecione o plug-in
-
Clique em Ativar Selecionado
-
A guia Status de Ativação do plug-in mostra o estado do plug-in

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:
-
CustomIdPSelectionPluginserá a etapa inicial Orquestração: No Sucesso será mapeado paraFedAuthnRequestPlugin -
Na Falha mapeada para falha
-
No Erro mapeado para falha
Execute as seguintes etapas para criar um novo Módulo de Autenticação:
-
Vá para a Console de Administração do OAM:
http(s)://oam-admin-host:oam-adminport/oamconsole -
Navegue até Gerenciador de Acesso, Módulos de Autenticação
-
Clique em Criar Módulo de Autenticação
-
Selecione Criar Módulo de Autenticação Personalizado
-
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:
-
Clique na guia
Steps -
Clique em Adicionar para adicionar a etapa
FedAuthnRequestPlugin:-
Nome da etapa:
FedAuthnRequestPlugin -
Nome do Plugin:
FedAuthnRequestPlugin
-
-
Clique em OK

Descrição da ilustração Authentication_Steps_Screen.jpg
-
Clique em Adicionar para adicionar a etapa
AssertionProcessing:-
Nome da etapa:
AssertionProcessing -
Nome do Plugin:
FedUserAuthenticationPlugin
-
-
Clique em OK

Descrição da ilustração Assertion_Processing_Screen.jpg
-
Clique em Adicionar para adicionar a etapa
IdPSelection:-
Nome da etapa:
IdPSelection -
Nome do Plugin:
CustomIdPSelectionPlugin
-
-
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:
-
Clique na guia Steps Orchestration
-
Selecione
IdPSelectioncomo a Etapa Inicial -
Para
FedAuthnRequestPlugin:-
Selecionar êxito para o Sucesso
-
Selecione
AssertionProcessingpara Em Caso de Falha -
Selecionar falha para Em Erro
-
-
Para
AssertionProcessing:-
Selecionar êxito para o Sucesso
-
Selecionar falha para Ao Falha
-
Selecionar falha para Em Erro
-
-
Para
IdPSelection:-
Selecione
FedAuthnRequestPluginpara Sucesso -
Selecionar falha para Ao Falha
-
Selecionar falha para Em Erro
-
-
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:
-
Vá para a Console de Administração do OAM:
http(s)://oam-admin-host:oam-adminport/oamconsole -
Navegue até Gerenciador de Acesso, Esquemas de Autenticação
-
Clique em Criar Esquema de Autenticação
-
Digite um nome (por exemplo,
CustomFedScheme) e uma descrição -
Definir o Nível de Autenticação como um valor aceitável (2 no meu exemplo) Selecionar FORM como o Método de Desafio
-
Definir o URL de Redirecionamento do Desafio (Neste exemplo, definimos como
/oam/server/) -
Selecione o Módulo de Autenticação personalizado recém-criado (
CustomFedModuleno exemplo) -
Definir o URL do Desafio (
/pages/servererror.jspneste exemplo) -
Defina o Tipo de Contexto (
customWar, por exemplo) Defina o Valor de Contexto (/oamaqui, pois não usamos nenhuma página) -
Informe o seguinte para os Parâmetros de Desafio pelo menos:
initial_command=NONE is_rsa=true -
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.
Custom Authentication Module in OAM and SP
F60229-01
September 2022
Copyright © 2022, Oracle and/or its affiliates.