Extract Subjectid from token in JaxRS Service
by Mike Love
Hi,
I am successfully authenticating an AngularJS client calling REST Services.
The token is validated as expected after login. On calling the REST service,
the authorization hearer (Bearer token) is available as HTTP Header as
expected.
Now, in the REST Service processing I want to extract the UserId (SubjectId)
so that I can lookup additional information before continuing with
processing.
I have seen that the JS adapter has a keycloak object that provides access
the this information, is there a similar Java helper class to extract this
information?
Regards,
Mike Love
--
********************************************************************************
This email and any accompanying attachments may contain confidential and
proprietary information. This information is private and protected by law
and, accordingly, if you are not the intended recipient, you are requested
to delete this entire communication immediately and are notified that any
disclosure, copying or distribution of or taking any action based on this
information is prohibited.
Emails cannot be guaranteed to be secure or free of errors or viruses. The
sender does not accept any liability or responsibility for any
interception, corruption, destruction, loss, late arrival or incompleteness
of or tampering or interference with any of the information contained in
this email or for its incorrect delivery or non-delivery for whatsoever
reason or for its effect on any electronic device of the recipient.
********************************************************************************
9 years, 10 months
Re: [keycloak-user] keycloak-war-dist-all-1.1.0 on wildfly8.2 problems
by Christina Lau
I need to update some lib in the keycloak auth server. This is because I want to extend the user account to add my own pages. I had a Jira issue opened on this but it was not fixed.
So my soln (which worked in 1.0) was to update a few lib in keycloak to add my own custom page to store some custom data. Therefore the appliance dist didn’t work for me cos it doesn’t even have the auth server.
Can you let me know how I can port my existing soln over? Thx.
9 years, 10 months
keycloak-war-dist-all-1.1.0 on wildfly8.2 problems
by Christina Lau
Do we need this?
<subsystem xmlns="urn:jboss:domain:keycloak:1.0">
<auth-server name="main-auth-server">
<enabled>true</enabled>
<web-context>auth</web-context>
</auth-server>
</subsystem>
If I have this, I get this error:
11:17:29,821 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "auth-server.war")]) - failure description: {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"auth-server.war\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"auth-server.war\".POST_MODULE: JBAS018733: Failed to process phase POST_MODULE of deployment \"auth-server.war\"
Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.naming.context.java.module.auth.auth.ValidatorFactory is already registered”}}
If I don’t have this, I get this error when deploying the demo app.
Caused by: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK"}}
9 years, 10 months
Unable to use war version either (keycloak-war-dist-all-1.1.0)
by Christina Lau
I tried to use the war dist on top of wildfly 8.2 together with the adapter, and changing standalone.xml. I can start the Keycloak server and logged in as admin, but I am unable to deploy the demo example. I keep getting this error: Unknown authentication mechanism KEYCLOAK. Please advice. Thanks...
10:12:31,417 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./customer-portal: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./customer-portal: Failed to start service
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_55]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_55]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_55]
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:222)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
... 3 more
Caused by: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK
at io.undertow.servlet.core.DeploymentManagerImpl.setupSecurityHandlers(DeploymentManagerImpl.java:323)
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:198)
... 7 more
10:12:31,420 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "customer-portal.war")]) - failure description: {"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./customer-portal" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./customer-portal: Failed to start service
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK
Caused by: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK"}}
10:12:31,421 ERROR [org.jboss.as.server] (management-handler-thread - 1) JBAS015870: Deploy of deployment "customer-portal.war" was rolled back with the following failure message:
{"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./customer-portal" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./customer-portal: Failed to start service
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK
Caused by: java.lang.RuntimeException: UT010039: Unknown authentication mechanism KEYCLOAK"}}
9 years, 10 months
Two-way SSL via Undertow in keycloak-appliance-dist-all-1.1.0.Final
by Sahil Sachdeva
Hello Everybody,
I am new to keycloak and playing around a little. I have small REST service
i have deployed in the keycloak server and am trying to secure it. This is
how far i have gotten:
1) I got the basic auth running.
2 ) I was abel to force SSL all through. Using a truststore in the adapter
and the necessary settings in standalone.xml
to take a step further i added:
<authentication>
<truststore path="server.truststore" relative-to="jboss.server.config.dir"
keystore-password="mypassword"/>
</authentication>
to the security-realm which i used in step 2 to enable SSL, added the
truststore to the required directory. How ever this broke the application
partly. I can reach the master-realm login and admin console. When i go to
the URL of the REST service i am redirected to the loginpage of my
application realm. But after sucessfully logging in, i get a 403 forbidden
and "SSLPeerUnverifiedException: peer not authenticated" error in the logs.
Does any one have an idea why? The only thing that changed from one way SSL
to two-way SSL is the undertow configuration, why does it disturb the
adapter?
Best,
Sahil
9 years, 10 months
keycloak-appliance-dist-all-1.1.0.Final does not have an auth-server.war
by Christina Lau
Hi, after unzipping keycloak-appliance-dist-all-1.1.0.Final.zip, it does not have a auth-server.war in the keycloak/standalone/deployments folder.
I tried to copy the auth-server.war from the keycloak-war-dist-all-1.1.0.Final.zip, but I can’t make it work.
Can you tell me what the steps are to get auth-server.war to work in the appliance-dist-all?
According to the documentation, it should be there (it used to be there), but it is missing now.
I need to update the lib folders with some customization. Thx for your help.
Christina
9 years, 10 months
how to implement SSO among services with Keycloak
by Kevin Chen
In our environment, we will have multiple JBOSS instance that will host different services, they will use the same Keycloak server for authentication.
One of the requirement for us is once an user is authenticated with one service, and if that service need invoke another service running in a different JBOSS instance, user should not be asked to logged in again. How can we obtain a new token and pass it to the next hop?
Thanks
Kevin
----------------------------------------------------------------------
This e-mail, including any attached files, may contain confidential and privileged information for the sole use of the intended recipient. Any review, use, distribution, or disclosure by others is strictly prohibited. If you are not the intended recipient (or authorized to receive information for the intended recipient), please contact the sender by reply e-mail and delete all copies of this message.
9 years, 10 months
Keycloak 1.1.0.Final Released
by Stian Thorgersen
The Keycloak team is proud to announce the release of Keycloak 1.1.0.Final. Highlights in this release includes:
* SAML 2.0
* Clustering
* Jetty, Tomcat and Fuse adapters
* HTTP Security Proxy
* Automatic migration of db schema
We’re already started working on features for the next release. Some exiting features coming soon includes:
* Identity brokering
* Custom user profiles
* Kerberos
* OpenID Connect interop
9 years, 10 months
Application Managed Security (Non-Adapter) SAML or OpenID Integration Example
by Andrew Reifers
Hello All,
First off I'm a NOOB with SSO, so please educate me kindly on any ignorance within my questions.
>From my research thus far and previous mailing posts sent to this user list:
Keycloak is very tuned to using a Servlet Container security approach with keycloak adapters utilizing the .json/.xml configuration file. I've been able to get a basic authentication working using a completely front end approach. To be clear it's an Angular JS front end and it was extremely straight forward just porting over the example. The problem is that I'm trying to tie the authentication to the server application layer (Spring Security). I am pretty married to Spring Security at this point and would like to authenticate via an application managed approach. There are multiple libraries within Spring Security that support industry standards that are in compatible with Keycloak (SAML, OpenID, OAuth etc).
To be fair I have't ruled out a Servlet Security approach but I've spent a weekend (again SSO Noob here) trying to migrate my existing spring security (Application Managed Security) application to a Container using the tomcat adapter and it's been painful to say the least. I am still using Spring Boot and Java Config. In an attempt to decouple all the existing security controls that are application managed I've been able to basically accomplish removing the existing security : You can see the existing code and output below for my entire current setup for a KeyCloakServerConfiguration Servlet and if you see anything obvious let me know. I'm not sure how the forms login handoff is suppose to occur at this point. Should it just be an iframe sourcing in the SSO login form?
OK so what would be much much more convenient at this point is a few examples of integrating manually with Keycloak rather then using the adapters. Does anyone have an example or documentation on how to us SAML or OpenID at an application managed level (Spring Security SAML or OpenID example would be amazing)? Specifically without using a keycloak adapter. Thanks in advance for any support/information you can provide.
Best, Andrew
@Configuration
public class KeyCloakServerConfiguration {
@Bean
public EmbeddedServletContainerCustomizer getKeycloakContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(
ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
if (configurableEmbeddedServletContainer instanceof TomcatEmbeddedServletContainerFactory) {
TomcatEmbeddedServletContainerFactory container = (TomcatEmbeddedServletContainerFactory) configurableEmbeddedServletContainer;
KeycloakAuthenticatorValve authenticatorValve = new KeycloakAuthenticatorValve();
container.addContextValves(authenticatorValve);
container.addContextCustomizers(getKeycloakContextCustomizer());
}
}
};
}
@Bean
public TomcatContextCustomizer getKeycloakContextCustomizer() {
return new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
SecurityConstraint secConstraints = new SecurityConstraint();
secConstraints.setAuthConstraint(true);
secConstraints.addAuthRole("ROLE_USER");
//The only time the application Should Allow Puts is when and administrator
//is authenticated with the site.
SecurityCollection putCollection = new SecurityCollection();
putCollection.addPattern("/**");
putCollection.addMethod("POST");
SecurityCollection getAuthenticatedMaterialsCollection = new SecurityCollection();
getAuthenticatedMaterialsCollection.addPattern("/**");
getAuthenticatedMaterialsCollection.addPattern("/*");
secConstraints.addCollection(putCollection);
secConstraints.addCollection(getAuthenticatedMaterialsCollection);
context.addConstraint(secConstraints);
LoginConfig loginConfig = new LoginConfig();
loginConfig.setAuthMethod("KEYCLOAK");
context.setLoginConfig(loginConfig);
context.addParameter("keycloak.config.resolver",
SpringBootKeycloakConfigResolver.class.getName());
}
};
}
public static class SpringBootKeycloakConfigResolver implements
KeycloakConfigResolver {
private KeycloakDeployment keycloakDeployment;
@Override
public KeycloakDeployment resolve(HttpFacade.Request request) {
if (keycloakDeployment != null) {
return keycloakDeployment;
}
InputStream configInputStream = getClass().getResourceAsStream(
"/keycloak.json");
if (configInputStream == null) {
keycloakDeployment = new KeycloakDeployment();
} else {
keycloakDeployment = KeycloakDeploymentBuilder
.build(configInputStream);
}
return keycloakDeployment;
}
}
Here is the console output. So what I gather is that it appears to be at least intercepting the requests appropriately and it is successfully loading the .json resource file.
[DEBUG] org.keycloak.adapters.PreAuthActionsHandler - adminRequest http://localhost:8080/
[DEBUG] org.keycloak.adapters.KeycloakDeployment - resolveBrowserUrls
[DEBUG] org.keycloak.adapters.KeycloakDeployment - resolveNonBrowserUrls
[DEBUG] org.keycloak.adapters.KeycloakDeploymentBuilder - Use authServerUrl: http://192.168.53.252:8080/auth, codeUrl: http://192.168.53.252:8080/auth/realms/Spring-Development/protocol/openid..., relativeUrls: NEVER
9 years, 10 months
Noob question -- 'forbidden' on demo after redirect
by Walter Rice
Hi,
I am trying to set up the demo as per the youtube videos (#1 and #2). I am
using keycloak 1.0.5. I have set up per the video (i think), however things
aren't working as expected.
I browse to http://localhost:8080/customer-portal/ and all is fine. I click
Customer Listing and I am redirected to login page as expected. I enter my
name/pw , this is successful and then I am redirected back to
http://localhost:8080/customer-portal/customers/view.jsp but the page is
'Forbidden' (redirect uri appears ok here?)
I am using the 'full' version with bundled wildfly server.
*customer app:*
keycloak file
{
"realm": "cryo198",
"realm-public-key":
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFnsEHg1o9UMBpMoHqLxYesXgDsTHnv1vF0AgrznxAcLfmYUdjvBNdIXZNfB7I7tG9OMHvX21h9arHdcdg2qqk9adLjHuImg/LhYHVOrosJ/sybohrR/Im+k1fTsw/5p/nwZKOF1DLL4/4SZAY2h19FGCi0ZgIvE80psq98UvCNQIDAQAB",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "customer-portal",
"credentials": {
"secret": "a0872aa0-113d-435c-a9d6-56cd9b270e22"
}
}
*web.xml*
<login-config>
<auth-method>KEYCLOAK</auth-method>
<realm-name>cryo198</realm-name>
</login-config>
*redirect URI:*
/customer-portal/*
*database app:*
{
"realm": "cryo198",
"realm-public-key":
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFnsEHg1o9UMBpMoHqLxYesXgDsTHnv1vF0AgrznxAcLfmYUdjvBNdIXZNfB7I7tG9OMHvX21h9arHdcdg2qqk9adLjHuImg/LhYHVOrosJ/sybohrR/Im+k1fTsw/5p/nwZKOF1DLL4/4SZAY2h19FGCi0ZgIvE80psq98UvCNQIDAQAB",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "NONE",
"resource": "database",
"bearer-only": "true"
}
*web.xml*
<login-config>
<auth-method>KEYCLOAK</auth-method>
<realm-name>cryo198</realm-name>
</login-config>
*redirect URI:*
n./a ..set as bearer only
*deployed apps:*
$
/c/tools/keycloak-appliance-dist-all-1.0.5.Final/keycloak-appliance-dist-all-1.0.5.Final/keycloak/bin/jboss-cli.sh
-c --command="deploy -l"
NAME RUNTIME-NAME ENABLED STATUS
admin-access.war admin-access.war true OK
angular-product.war angular-product.war true OK
auth-server.war auth-server.war true OK
customer-portal-js.war customer-portal-js.war true OK
customer-portal.war customer-portal.war true OK
database.war database.war true OK
product-portal.war product-portal.war true OK
*Log:*
2015-02-13 21:22:29,665 DEBUG [org.keycloak.adapters.PreAuthActionsHandler]
(default task-41) adminRequest http://localhost:8080/customer-portal/custo
mers/view.jsp
2015-02-13 21:22:29,667 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-41) --> authenticate()
2015-02-13 21:22:29,668 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-41) try bearer
2015-02-13 21:22:29,669 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-41) try oauth
2015-02-13 21:22:29,669 DEBUG [org.keycloak.adapters.RequestAuthenticator]
(default task-41) session was null, returning null
2015-02-13 21:22:29,670 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-41) there
was no code
2015-02-13 21:22:29,670 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-41)
redirecting to auth server
2015-02-13 21:22:29,671 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-41)
callback uri: http://localhost:8080/customer-portal/
customers/view.jsp
2015-02-13 21:22:29,672 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-41) Sending
redirect to login page: http://localhost:808
0/auth/realms/cryo198/tokens/login?client_id=customer-portal&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fcustomer-portal%2Fcustomers%2Fview.jsp&state
=2%2F8185a8ea-5a38-4a91-b990-1b32ccabb2e8&login=true
2015-02-13 21:22:29,701 DEBUG
[org.keycloak.services.resources.TokenService] (default task-42) replacing
relative valid redirect with: http://localhos
t:8080/customer-portal/*
2015-02-13 21:22:29,702 DEBUG
[org.keycloak.services.managers.AuthenticationManager] (default task-42)
Could not find cookie: KEYCLOAK_IDENTITY
2015-02-13 21:22:46,300 DEBUG
[org.keycloak.services.resources.TokenService] (default task-43) replacing
relative valid redirect with: http://localhos
t:8080/customer-portal/*
2015-02-13 21:22:46,301 DEBUG
[org.keycloak.services.managers.AuthenticationManager] (default task-43)
validating password for user: walt
2015-02-13 21:22:46,306 DEBUG
[org.keycloak.services.managers.AuthenticationManager] (default task-43)
Expiring remember me cookie
2015-02-13 21:22:46,307 DEBUG
[org.keycloak.services.managers.AuthenticationManager] (default task-43)
Expiring cookie: KEYCLOAK_REMEMBER_ME path: /au
th/realms/cryo198
2015-02-13 21:22:46,308 DEBUG
[org.keycloak.services.resources.flows.OAuthFlows] (default task-43)
processAccessCode: isResource: true
2015-02-13 21:22:46,308 DEBUG
[org.keycloak.services.resources.flows.OAuthFlows] (default task-43)
processAccessCode: go to oauth page?: false
2015-02-13 21:22:46,329 DEBUG
[org.keycloak.services.resources.flows.OAuthFlows] (default task-43)
redirectAccessCode: state: 2/8185a8ea-5a38-4a91-b99
0-1b32ccabb2e8
2015-02-13 21:22:46,340 DEBUG
[org.keycloak.services.managers.AuthenticationManager] (default task-43)
Create login cookie - name: KEYCLOAK_IDENTITY,
path: /auth/realms/cryo198, max-age: -1
2015-02-13 21:22:46,387 DEBUG [org.keycloak.adapters.PreAuthActionsHandler]
(default task-44) adminRequest http://localhost:8080/customer-portal/custo
mers/view.jsp?code=zf9VUvG6-QkAWtF8xDFcJfnBnrY.OTY1YjllMzMtZDdlNS00YWQwLWEwMzgtZjIzMTJhODZjMTIx&state=2%2F8185a8ea-5a38-4a91-b990-1b32ccabb2e8
2015-02-13 21:22:46,388 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-44) --> authenticate()
2015-02-13 21:22:46,389 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-44) try bearer
2015-02-13 21:22:46,389 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-44) try oauth
2015-02-13 21:22:46,389 DEBUG [org.keycloak.adapters.RequestAuthenticator]
(default task-44) session was null, returning null
2015-02-13 21:22:46,390 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-44) there
was a code, resolving
2015-02-13 21:22:46,390 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-44)
checking state cookie for after code
2015-02-13 21:22:46,390 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-44) **
reseting application state cookie
2015-02-13 21:22:46,477 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-44) Token
Verification succeeded!
2015-02-13 21:22:46,478 DEBUG
[org.keycloak.adapters.OAuthRequestAuthenticator] (default task-44)
successful authenticated
2015-02-13 21:22:46,478 TRACE
[org.keycloak.adapters.RefreshableKeycloakSecurityContext] (default
task-44) checking whether to refresh.
2015-02-13 21:22:46,478 TRACE
[org.keycloak.adapters.undertow.KeycloakUndertowAccount] (default task-44)
use realm role mappings
2015-02-13 21:22:46,479 DEBUG
[org.keycloak.adapters.wildfly.WildflyRequestAuthenticator] (default
task-44) propagate security context to wildfly
2015-02-13 21:22:46,481 TRACE
[org.keycloak.adapters.RefreshableKeycloakSecurityContext] (default
task-44) checking whether to refresh.
2015-02-13 21:22:46,484 DEBUG [org.keycloak.adapters.RequestAuthenticator]
(default task-44) AUTHENTICATED
2015-02-13 21:22:46,502 DEBUG [org.keycloak.adapters.PreAuthActionsHandler]
(default task-46) adminRequest http://localhost:8080/customer-portal/custo
mers/view.jsp
2015-02-13 21:22:46,505 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-46) --> authenticate()
2015-02-13 21:22:46,506 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-46) try bearer
2015-02-13 21:22:46,506 TRACE [org.keycloak.adapters.RequestAuthenticator]
(default task-46) try oauth
2015-02-13 21:22:46,507 DEBUG
[org.keycloak.adapters.undertow.KeycloakUndertowAccount] (default task-46)
session is active
2015-02-13 21:22:46,508 DEBUG [org.keycloak.adapters.RequestAuthenticator]
(default task-46) Cached account found
2015-02-13 21:22:46,508 DEBUG
[org.keycloak.adapters.wildfly.WildflyRequestAuthenticator] (default
task-46) propagate security context to wildfly
2015-02-13 21:22:46,509 DEBUG [org.keycloak.adapters.RequestAuthenticator]
(default task-46) AUTHENTICATED: was cached
2015-02-13 21:22:46,510 DEBUG
[org.keycloak.adapters.AuthenticatedActionsHandler] (default task-46)
AuthenticatedActionsValve.invoke http://localhost:
8080/customer-portal/customers/view.jsp
Many thanks
W
9 years, 10 months