Creating a Custom Authentication Plugin in OAM 11gR1
The oracle documentation is not very clear on how to create
a sample OAM plugin and it takes a while to create and get one working.
Recently I had to work on creating a custom cookie for a legacy web application
to achieve single sign on between EPP applications protected by OAM and legacy
web portal. Below are the brief steps on how to create one. The code was created
using eclipse. Below are the steps on how to create a sample OAM plugin.
1)
Create a Sample Java Project. Say SampleOAMPlugin. Important: Please note
that the name of java project, java class and the Meta data xml should be same.
2)
Add the following jar files to the build path of
the eclipse project. Felix.jar, felix-service.jar, extensibility_lifecycle.jar,
oam-plugin.jar,identitystore.jar,identity provider.jar and utilities. .jar.
These jar files will be found in a tmp folder under Domain home . $DOMAIN_HOME/servers/$ADMIN_SERVER_NAME/tmp/_WL_user/oam_admin_11.1.1.3.0/XXXXXX/APP-INF/lib/oam-plugin.jar
3)
Under the src folder in eclipse create a folder
called META_INF and inside it create a file called MANIFEST.MF
4)
Under the src folder create a xml file called SampleOAMPlugin.xml.
5)
If you have any third party library dependent
jar files create a folder say lib under the project at the same level as the
src folder. The jar file which will be created will have only these jar files
and not the ones in the step 2.
6)
Create a java package say sample and create a
java class SampleOAMPlugin , it has
to be same name as of the project.
7)
The java class should extend AbstractAuthenticationPlugIn
found in the package oracle.security.am.plugin.authn.So the java project
structure should be like this:-
8)
Out of the several inherited methods in the
SampleOAMPlugin class we need to implement the the process method .public
ExecutionStatus process(AuthenticationContext context)throws
AuthenticationException method.
9)
To extract the username and password entered on
the custom login page use the below methods. The below methods will only work
when the username and password fields defined on the login form are username
and password.
CredentialParam credentialParam =
context.getCredential().getParam(PluginConstants.KEY_USERNAME);
String userName =
(String)credentialParam.getValue();
credentialParam =
context.getCredential().getParam(PluginConstants.PASSWORD); String password =
(String)credentialParam.getValue();
10)
If you need any values which have to be read at
runtime(like a properties a file in java), like let’s say domain name for the
cookie, or the identity store against which we may want to authenticate the
users you can define that in the meta
data xml created in step 4 . To read those values use below statements.. for
e.g if KEY_IDENTITY_STORE_REF is a field
defined in meta data xml file.
String stepName = context
getStringAttribute(PluginConstants.KEY_STEP_NAME);
String identityStoreRef =
PlugInUtil.getFlowParam(stepName,"KEY_IDENTITY_STORE_REF", context);
11)
For authenticating the users use the below
statements. Though you may not need these if you are authenticating against an
OID. Oracle has two out of box plugins for identifying and authenticating the
users. UserIdentificationPlugin and UserAuthenticationPlugin.
UserIdentityProvider
provider = UserIdentityProviderFactory.getProvider(identityStoreRef);
boolean isAuthenticated =
provider.authenticateUser(userName, password);
12)
For looking up some attribute from user identity
store like OID, for example email you can use the below methods. String[]
userAttributeName = {"mail" };
AuthnUser userauth = new AuthnUser();
userauth.setUserName(userName);
List<String> attributeNames =
Arrays.asList(userAttributeName);
Map<String, String> resultMap =
provider.getUserAttributes(userauth, attributeNames);
String resultAttributeValue =
resultMap.get(userAttributeName[0]);
String emailId = resultAttributeValue;
13)
If you are using this plugin as a for authentication
then, you have to return some mandatory responses in the plugin response and
also set the subject if the user is authenticated, else if you are using Oracle’s
plugin for authentication/identification , the following steps are not required.
Create a subject as follows for the authenticated users.
Subject subject = new Subject();
if (isAuthenticated) {
subject.getPrincipals().add(new
OAMUserPrincipal(userIdentity));
subject.getPrincipals().add(new
OAMUserDNPrincipal(userDN));
if (guid !=
null)subject.getPrincipals().add(new OAMGUIDPrincipal(guid));
else subject.getPrincipals().add(new
OAMGUIDPrincipal(userIdentity));
}context.setSubject(subject);
Set mandatory responses in Plugin Response. The three responses which need to be set are KEY_RETURN_ATTRIBUTE,
KEY_IDENTITY_STORE_REF, KEY_AUTHENTICATED_USER_NAME. PluginResponse rsp = new
PluginResponse();
rsp.setName(PluginConstants.KEY_RETURN_ATTRIBUTE);
rsp.setType(PluginAttributeContextType.LITERAL);
rsp.setValue(provider.getReturnAttributes());//provider
is the user identity provider
context.addResponse(rsp);
// 2 nd response
IDPAdmin idpAdmin =
UserIdentityProviderFactory.getIDPAdmin();
String runtimeIDStore =
idpAdmin.getDefaultProviderName();
rsp = new PluginResponse();
rsp.setName(PluginConstants.KEY_IDENTITY_STORE_REF);
rsp.setType(PluginAttributeContextType.LITERAL);
rsp.setValue(runtimeIDStore);
context.addResponse(rsp);
//3 rd response
UserInfo user =
provider.locateUser(userName);
String userIdentity =
user.getUserObject().getPrincipal().getName();
rsp = new PluginResponse();
rsp.setName(PluginConstants.KEY_AUTHENTICATED_USER_NAME);
rsp.setType(PluginAttributeContextType.LITERAL);
rsp.setValue(userIdentity);
context.addResponse(rsp);
14)
If we need set the custom cookie we need to
create class in the package which should extend oracle.security.am.plugin.GenericTransportToken
and implements the getter and setter methods.
import
oracle.security.am.plugin.GenericTransportToken;
public class TokenClass implements
GenericTransportToken {
/*
* This is a sample Tokenclass that creates
a GenericTransportToken,
* which can be set on the transportContext
as a cookie.
* It has all the cookie
details:Name,Value,MaxAge, Version, Domain and secure flag.
*/
/** The token name. */
private final String m_tokenName;
/** The token version. */
private String m_tokenVersion;
...
...
//Instantiates a new TransportToken.
public TokenClass(String tokenName, String
tokenValue) {
m_tokenName = tokenName;
m_tokenValue = tokenValue;
}
//Retrieve the token name
public String getTokenName() {
return m_tokenName;
}
..
..
@Override
public void setMaxAgeInSeconds(int age) {
this.m_maxAgeInSeconds = age;
}
...
....
@Override
public void setTokenVersion(String version)
{
this.m_tokenVersion = version;
}
}
In the plugin class, call this
class constructor and access the values using the getter and setter methods.
Set the cookie using oracle.security.am.plugin.GenericTransportContext.
GenericTransportContext trContext =
context.getTransportContext();
TokenClass tok = new
TokenClass(cookieName, "cookieValue");
tok.setMaxAgeInSeconds(12000);
tok.setTokenDomain(“.abc.org”);
trContext.setToken(tok, false);
15)
For logging use
private final static Logger LOGGER =
java.util.Logger.getLogger(SampeCookieCreationPlugin.class.getCanonicalName());
LOGGER.info(CLASS_NAME + " Entering
SampleCookieCreationPlugin.process");
To view this logs in oam server diagnostic logs
run the following commands using wlst. connect('weblogic','weblogic1','t3://localhost:7001')
domainRuntime()
setLogLevel(logger="oracle.oam.plugin",level="TRACE:32",
persist="0", target="oam_server1")
After the above commands are run you should
see the following line in logs.
[sample.SampleOAMPlugin] [tid:
[ACTIVE].ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)']
[userId: <anonymous>] [ecid: 0d58708dceef42e5:7313f42d:13ea0e820c9:-8000-0000000000002f7a,0]
[APP: oam_server]sample.SampleOAMPlugin Entering SampleCookieCreationPlugin.process
16)
Jar file Manifest file .In the bundle class path
include the current class. And dependent jar files. Make sure the Symbolic Name
and bundle name are same as the java project name.
Manifest-Version:
1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: SampleOAMPlugin
Bundle-Name: SampleOAMPlugin
Bundle-Version: 10
Bundle-Activator: sample.SampleOAMPlugin
Import-Package: javax.security.auth,
javax.crypto.spec,
javax.crypto,
oracle.security.am.common.utilities.principal,
oracle.security.am.engines.common.identity.provider,
oracle.security.am.plugin,
oracle.security.am.plugin.api,
oracle.security.am.plugin.authn,
oracle.security.idm,
org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .,
lib/core.jar,
lib/j2ee.jar,
lib/redpoint-core.jar
17)
Meta data xml file. Although the oracle
documents says that the interface and implementation elements are optional but it
seems they are required. You will not be able to activate the oam plugin
without these parameters. The Attribute Value pair provides us with an ability
to define parameters whose value can be changed from OAM console. Refer Step 10
on how to read from this xml file in plugin class.
<Plugin name="SampleOAMPlugin"
type="Authentication">
<author>uid=cn=orcladmin</author>
<email>abc@abc.dev</email>
<creationDate>09:32:20,
2010-12-02</creationDate>
<version>10</version>
<description>Custom
Sample Auth Plugin</description>
<interface>oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn</interface>
<implementation>sample.SampleOAMPlugin</implementation>
<configuration>
<AttributeValuePair>
<Attribute
type="string"
length="20">KEY_IDENTITY_STORE_REF</Attribute>
<instanceOverride>false</instanceOverride>
<globalUIOverride>false</globalUIOverride>
<value>DEVOID</value>
</AttributeValuePair>
<AttributeValuePair>
<Attribute
type="string" length="20">CookieDomain</Attribute>
<mandatory>true</mandatory>
<instanceOverride>false</instanceOverride>
<globalUIOverride>false</globalUIOverride>
<value>abc.dev</value>
</AttributeValuePair>
</configuration>
</Plugin>
19)
That’s it . After
this we need to upload this jar file using the OAM console. Reference http://docs.oracle.com/cd/E21764_01/doc.1111/e12491/authnapi.htm#autoId17
Very Helpful.
ReplyDeleteVery helpful. Thanks Abhay for sharing info on this complex topic..!!
ReplyDeleteBrilliant Abhay! It couldn't have been elaborated further! Cheers
ReplyDeleteI like you point 13. It help me lot...
ReplyDeleteThe OAM Product Managers need to hire you to document this process. This is outstanding, whereas the Oracle documentation is outright poor on this topic. It is so bad the sample code is in screen shots: I guess because they don't want some poor developer to cut & paste an example that DOESN'T WORK!
ReplyDeleteThanks again!!
Thanks Richard. Glad that it helped you.
DeleteHello,
ReplyDeleteI am trying to set a plugin response of a type "REDIRECT" as I want to redirect the user to some another url(different from original requested resource).
I am using standard identification and authentication plugins and then a custom plugin for redirection.
my plugin has below statements -
PluginResponse resp = new PluginResponse();
resp.setName("resource_url"); //also tried with PluginConstants.URL, no luck
resp.setType(PluginAttributeContextType.REDIRECT);
resp.setValue("http://www.openldap.org/");
context.addResponse(resp);
However, it is not working as expected.
Could you please help me?
Hi Purva,
DeleteWhile I figure out what can be done in Plugin, Can I suggest you to do the following.In the OAMConsole go to Policy configuration->Application Domains->Your domain->Protected Resource Policy->Specify the url in the Success URL box. The OAM will redirect you to the url specifed in the success URL box.
Try with these lines of code :-
Deletefinal RedirectionContextData redirectionData = new RedirectionContextData(
"url",RedirectionMetaData.URL);
String queryString = "queryParam1=test1;queryParam2=test2";
final RedirectionContextData queryStringData = new RedirectionContextData(
queryString, RedirectionMetaData.QUERY_STRING);
RedirectionActionContext redirectionContext = new RedirectionActionContext();
redirectionContext.getContextData().add(redirectionData);
redirectionContext.getContextData().add(queryStringData);
RedirectionAction action = new RedirectionAction(redirectionContext);
Hi Abhay,
DeleteI tried using the above lines of code to redirect to a URL but it is not getting redirected. I have hard coded the URL for now. Can u please elaborate or share a working example so that i can check if i am missing anything. Any help will be greatly appreciated.
Hi Anuja,
DeleteSee the following from Oracle SAMPLE code :-
/*
* We can specify the login page URL as part of the UserContextData - the plugin will redirect or forward to this page to collect credentials
*
* actionType = REDIRECT_GET or REDIRECT_POST
* -------------------------------------------
* The loginPageURL to which the plugin redirects as part of UserAction should be a fully qualifid URL in this case.
* For eg:- A login application - SampleLoginWAR, can be deployed on any container(external) and we can specify the URL to redirect to.
* loginPageURL = "http://external container host:port/SampleLoginWAR/pages/MFALogin.jsp";
*
* actionType = FORWARD
* ---------------------
* When actionType is set to FORWARD, the userAction can forward to the login page specified at the AuthN scheme configuration.
* If we want to forward to a login page different from the authN scheme configuration, we can specify the loginPageURL as shown below.
* final UserContextData urlContext = new UserContextData(loginPageURL, new CredentialMetaData("URL"));
*
* For eg:- The AuthN scheme may have the configurations as "/SampleLoginWAR/pages/MFALogin.jsp", with ContextRoot as "/SampleLoginWAR".
* There may be a case we want to forward to "/SampleLoginWAR/pages/MFAUserdetails.jsp" to collect userdetails
* and "/SampleLoginWAR/pages/MFAPassworddetails.jsp" to collect password details.
* In such a case we can specify the urlContext as shown below.
*
*/
final UserContextData urlContext = new UserContextData(loginPageURL, new CredentialMetaData("URL"));
//QUERY_STRING: specifies the query parameters that need to be sent with the loginPageURL.
//This can be used/processed by the login page. Any kind of inormation can be passd as query parameters.
String queryString = "queryParam1=testParameter";
final UserContextData queryStringContext =new UserContextData(queryString, new CredentialMetaData("QUERY_STRING"));
//This is the context that holds the different UserContextData - metadata that needs to be collected from the login page.
UserActionContext actionContext = new UserActionContext();
//add the UserContextData to the CredentialActionContext
actionContext.getContextData().add(userNameContext);
actionContext.getContextData().add(passwordContext);
actionContext.getContextData().add(urlContext);
actionContext.getContextData().add(queryStringContext);
/*
* UserActionMetaData - indicates the action type the UserAction class.
* The UserAction does a forward or a redirect (with a GET or POST) to the login page based on the UserActionMetaData value.
* Possible values are : FORWARD, REDIRECT_GET, REDIRECT_POST
*/
UserActionMetaData userAction = UserActionMetaData.FORWARD;
if(actionType.equals("REDIRECT_GET")) {
userAction = UserActionMetaData.REDIRECT_GET;
} else if (actionType.equals("REDIRECT_POST")) {
userAction = UserActionMetaData.REDIRECT_POST;
}
System.out.println("Action MetaData Type "+ userAction.name());
UserAction action = new UserAction(actionContext, userAction);
System.out.println("Setting the execution action in the authentication context");
context.setAction(action);
//Set the status to PAUSE inorder to force a forward/redirect to the login page. The plugin resumes execution when credentials are entered and submitted back to the server.
return status;
}
Abhay,
ReplyDeleteThis is very helpful, however I am not able to get the value of KEY_IDENTITY_STORE_REF defined in my plugin xml file. I have following code in my plugin:
String stepName = context.getStringAttribute(PluginConstants.KEY_STEP_NAME);
String identityStoreRef = PlugInUtil.getFlowParam(stepName,"KEY_IDENTITY_STORE_REF", context);
LOGGER.fine("Step Name "+stepName+" Identity Store Reference "+identityStoreRef);
Step Name ECGLDAPAuthentication Identity Store Reference null - printed in log
KEY_IDENTITY_STORE_REF
false
false
false
OUDIdentityStore
Have you defined the identity store from the OAM console. You have to provide the value of KEY_IDENTITY_STORE_REF in the orchestration steps of the plugin when you upload it.
DeleteHi folks I need help.
ReplyDeleteI follow these steps for consume a web service inside the plugin, my Plugin is activated succesfully but when I deploy get this error:
java.lang.IllegalArgumentException: interface com.conecta.services.ConectaCryptography is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:461)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:690)
at weblogic.wsee.jaxws.spi.ClientInstance.createProxyInstance(ClientInstance.java:143)
at weblogic.wsee.jaxws.spi.WLSProvider$ServiceDelegate.getPort(WLSProvider.java:899)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:344)
at weblogic.wsee.jaxws.spi.WLSProvider$ServiceDelegate.getPort(WLSProvider.java:836)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:326)
at javax.xml.ws.Service.getPort(Service.java:92)
at com.conecta.services.ConectaCryptography_Service.getConectaCryptographyPort(ConectaCryptography_Service.java:56)
at com.paq1.ExamplePlugin.process(ExamplePlugin.java:115)
at oracle.security.am.engine.authn.internal.executor.PlugInExecutor.execute(PlugInExecutor.java:197)
at oracle.security.am.engine.authn.internal.executor.AuthenticationSchemeExecutor.execute(AuthenticationSchemeExecutor.java:105)
at oracle.security.am.engine.authn.internal.controller.AuthenticationEngineControllerImpl.validateUser(AuthenticationEngineControllerImpl.java:267)
at oracle.security.am.engines.enginecontroller.AuthnEngineController.authenticateUser(AuthnEngineController.java:862)
at oracle.security.am.engines.enginecontroller.AuthnEngineController.processEvent(AuthnEngineController.java:319)
at oracle.security.am.controller.MasterController.processEvent(MasterController.java:596)
at oracle.security.am.controller.MasterController.processRequest(MasterController.java:788)
at oracle.security.am.proxy.oam.requesthandler.NGProvider.authenticate(NGProvider.java:754)
at oracle.security.am.proxy.oam.requesthandler.NGProvider.getAuthenticateWAuditResponse(NGProvider.java:1714)
at oracle.security.am.proxy.oam.requesthandler.NGProvider.getResponse(NGProvider.java:375)
at oracle.security.am.proxy.oam.requesthandler.RequestHandler.handleRequest(RequestHandler.java:366)
at oracle.security.am.proxy.oam.requesthandler.RequestHandler.handleMessage(RequestHandler.java:170)
at oracle.security.am.proxy.oam.requesthandler.ControllerMessageBean.getResponseMessage(ControllerMessageBean.java:122)
at oracle.security.am.proxy.oam.requesthandler.ControllerMessageBean_eo7ylc_MDOImpl.__WL_invoke(Unknown Source)
at weblogic.ejb.container.internal.MDOMethodInvoker.invoke(MDOMethodInvoker.java:35)
at oracle.security.am.proxy.oam.requesthandler.ControllerMessageBean_eo7ylc_MDOImpl.getResponseMessage(Unknown Source)
at oracle.security.am.proxy.oam.mina.ObClientToProxyHandler.messageReceived(ObClientToProxyHandler.java:223)
at org.apache.mina.common.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:743)
at org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
at org.apache.mina.common.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:40)
at org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:823)
at org.apache.mina.common.IoFilterEvent.fire(IoFilterEvent.java:54)
at org.apache.mina.common.IoEvent.run(IoEvent.java:62)
at oracle.security.am.proxy.oam.mina.CommonJWorkImpl.run(CommonJWorkImpl.java:41)
at weblogic.work.j2ee.J2EEWorkManager$WorkWithListener.run(J2EEWorkManager.java:184)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
>
Did you check your manifest.mf file ? All your packages should be listed there ? All your referenced third party libraries should be there in the lib folder.
DeleteHi Abhay,
ReplyDeleteI have a custom plugin with external jar references. I have added the interface and impl elements as you mentioned and the manifest file also follows the template you have shared here. However, the plugin activation is failing. Can you please share any troubleshooting tips for this
Did you check your OAM logs enable the trace 32 level from EM console and and you should get some more information ? You should be able to see in the diagnostic logs as to which class in not found ?
DeleteHi Abhay, As a part of my project assignment, I have created a login.html page which accepts user id & password. Then , I created a helloworld.html page & protected it. Now I need your urgent help / guidance to create an OAM plugin to accept the password. It should convert the password to uppercase & create a cookie & print the value using a cookie. Request for urgent help. Thanks Kamal
ReplyDeleteHi Abhay, As a part of my project assignment I have created a Login.html page, which accepts user id & password.Then I have created a page HelloWorld.html and protected it. Now I need your kind guidance in creating an OAM plug-in to accept the password & which should convert the password to uppercase and create a cookie and print the value using a cookie.
ReplyDeleteWould appreciate quick response as it is urgently needed.
Hi Kamal,
ReplyDeleteWhat is the issue you are facing ? the requirement which u have is pretty straightforward.
This is how you get the password:-
credentialParam = context.getCredential().getParam(PluginConstants.PASSWORD);
String password = (String)credentialParam.getValue();
See step 14 how to create cookie.
Hi Abhay,
ReplyDeleteI am facing an issue while importing the plugin jar file in OAM. The error states that the plugin jar name and the plugin XML name do not match.
I have made sure that the names are same, what could be the possible reason for this error?
HI Abhaya,
ReplyDeleteThanks.
When I have tried to import jar, jar file imported successfully and can see inside oam . but plugin is not visible for me.
do you have any working example, can you share here or @madhur.mca@gmail.com
I have created one sample java project - and in sampleplugin.java written only process method, do we need initialize method as well ? is there ant article that can help me.
My basic requirement is we have to implement NTLM authorisation in OAM 11g.
but as in OAM 11g NTLM is not supported so need to write custom plugin
Hi Abhay,
ReplyDeleteThanks for the very useful information. But I am unable to set cookie using the above logic. Please help.
Please find code below:
System.out.println("Setting cookie");
String cookieValue = "My TesCookie";
String cookieName = "TestCookie";
TokenClass tok = new TokenClass(cookieName, cookieValue);
tok.setMaxAgeInSeconds(1200);
GenericTransportContext trContext = authenticationContext.getTransportContext();
trContext.setToken(tok, false);
Map reqParams = trContext.getParameters();
System.out.println(reqParams);
TokenClass below:
package com.goma.customplugin;
import oracle.security.am.plugin.GenericTransportToken;
public class TokenClass implements GenericTransportToken {
private final String m_tokenName;
private String m_tokenValue;
private int m_maxAgeInSeconds;
public TokenClass(String tokenName, String tokenValue) {
m_tokenName = tokenName;
m_tokenValue = tokenValue;
}
@Override
public int getMaxAgeInSeconds() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getTokenDomain() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getTokenName() {
// TODO Auto-generated method stub
return m_tokenName;
}
@Override
public String getTokenValue() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getTokenVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isSecure() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setMaxAgeInSeconds(int age) {
this.m_maxAgeInSeconds = age;
}
@Override
public void setSecure(boolean arg0) {
// TODO Auto-generated method stub
}
@Override
public void setTokenDomain(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void setTokenValue(String value) {
this.m_tokenValue = value;
}
@Override
public void setTokenVersion(String arg0) {
// TODO Auto-generated method stub
}
}
Try setting the domain for the cookie as tok.setTokenDomain(“.abc.org”); -- whatever your correct domain is.
DeleteCustomer has created custom Authentication plug-in of AuthNScheme-A of level 2 and AuthNScheme-B of level 6
ReplyDeleteCustomer has created AuthN Module. Also created 'Step1' with AuthN level 2. On success go to 'Step9'.
The 'Step9' with an AuthN level 6.
Test Case:
----------
User first access first resource protected with AuthN level 2.
Then user access second resource.
- Customer is orchestrating plug-in to verify the user authentication level.
- As the user is already authenticated with AuthN level 2. The first step 'AuthN level-2' should be success, but it is failing.
In detail, when user trying to access protected resource-1 of AuthN level-2 then he can able to access successfully.
Same user when trying to access protected resource-2, then it's Failing.
Expected is, it should go to 'Step9' as the user is already authenticated at AuthN level 2 of 'Step1'.