admin-reuse -- Found one more Data Grid link to fix based on a separate PR.

This commit is contained in:
AndyMunro 2021-06-17 10:39:30 -04:00 committed by Marek Posolda
parent 26087f0ece
commit e15ebe8306
137 changed files with 577 additions and 964 deletions

View file

@ -114,7 +114,7 @@ public class HeaderMojo extends AbstractMojo {
try(PrintStream ps = new PrintStream(new FileOutputStream(out));BufferedReader br = new BufferedReader(new FileReader(f));){ try(PrintStream ps = new PrintStream(new FileOutputStream(out));BufferedReader br = new BufferedReader(new FileReader(f));){
for (String l = br.readLine(); l != null; l = br.readLine()) { for (String l = br.readLine(); l != null; l = br.readLine()) {
ps.println(l); ps.println(l);
if (l.contains("=")) { if (l.startsWith("=")) {
break; break;
} }
} }

View file

@ -5,7 +5,7 @@
[IMPORTANT] [IMPORTANT]
==== ====
Red Hat JBoss Middleware for OpenShift images are pulled on demand from the secured Red Hat Registry: link:https://access.redhat.com/containers/[registry.redhat.io], which requires authentication. To retrieve content, you will need to log into the registry using the Red Hat account. Red Hat JBoss Middleware for OpenShift images are pulled on demand from the secured Red Hat Registry: link:https://catalog.redhat.com[registry.redhat.io], which requires authentication. To retrieve content, you will need to log into the registry using the Red Hat account.
To consume container images from *_registry.redhat.io_* in shared environments such as OpenShift, it is recommended for an administrator to use a Registry Service Account, also referred to as authentication tokens, in place of an individual person's Red Hat Customer Portal credentials. To consume container images from *_registry.redhat.io_* in shared environments such as OpenShift, it is recommended for an administrator to use a Registry Service Account, also referred to as authentication tokens, in place of an individual person's Red Hat Customer Portal credentials.

View file

@ -1,3 +1,3 @@
VERSION=15.0.1 VERSION=15.0.2
SHORT_VERSION=15.0 SHORT_VERSION=15.0
NPM_VERSION=15.0.1 NPM_VERSION=15.0.2

View file

@ -12,7 +12,7 @@ Let's go over these steps.
Adapters are no longer included with the appliance or war distribution. Each adapter is a separate download on the Keycloak download site. Adapters are no longer included with the appliance or war distribution. Each adapter is a separate download on the Keycloak download site.
They are also available as a maven artifact. They are also available as a maven artifact.
You must unzip the Jetty 9.x distro into Jetty 9.x's link:https://www.eclipse.org/jetty/documentation/current/#quickstart-common-config[base directory]. You must unzip the Jetty 9.x distro into Jetty 9.x's link:https://www.eclipse.org/jetty/documentation/jetty-9/index.html[base directory].
Including adapter's jars within your WEB-INF/lib directory will not work! Including adapter's jars within your WEB-INF/lib directory will not work!
In the example below, the Jetty base is named `your-base`: In the example below, the Jetty base is named `your-base`:

View file

@ -167,11 +167,7 @@ While Spring Security's XML namespace simplifies configuration, customizing the
<security:http auto-config="false" entry-point-ref="keycloakAuthenticationEntryPoint"> <security:http auto-config="false" entry-point-ref="keycloakAuthenticationEntryPoint">
<security:custom-filter ref="keycloakPreAuthActionsFilter" before="LOGOUT_FILTER" /> <security:custom-filter ref="keycloakPreAuthActionsFilter" before="LOGOUT_FILTER" />
<security:custom-filter ref="keycloakAuthenticationProcessingFilter" before="FORM_LOGIN_FILTER" /> <security:custom-filter ref="keycloakAuthenticationProcessingFilter" before="FORM_LOGIN_FILTER" />
<<<<<<< HEAD
<security:custom-filter ref="keycloakSecurityContextRequestFilter" after="FORM_LOGIN_FILTER" /> <security:custom-filter ref="keycloakSecurityContextRequestFilter" after="FORM_LOGIN_FILTER" />
=======
<security:custom-filter ref="keycloakSecurityContextRequestFilter" after="FORM_LOGIN_FILTER" />
>>>>>>> correction to themes
<security:intercept-url pattern="/customers**" access="ROLE_USER" /> <security:intercept-url pattern="/customers**" access="ROLE_USER" />
<security:intercept-url pattern="/admin**" access="ROLE_ADMIN" /> <security:intercept-url pattern="/admin**" access="ROLE_ADMIN" />
<security:custom-filter ref="logoutFilter" position="LOGOUT_FILTER" /> <security:custom-filter ref="logoutFilter" position="LOGOUT_FILTER" />

View file

@ -1,23 +0,0 @@
=== Basic steps to secure applications and services
These are the basic steps for setting up an application or a service in Keycloak.
Configure a client adapter using one of these options:
* A {project_name} adapter
* A third party library adapter
Register a client using one of these options:
* The Admin Console
* The client registration service
* The CLI
[role="_additional-resources"]
.Additional resources
This guide provide the detailed instructions for these steps. Additional information on using the Admin Console exists in the Server Administration Guide. That guide refers to creating a client rather than registering a client.

View file

@ -1,21 +0,0 @@
These are the basic steps for setting up an application or a service in Keycloak.
Configure a client adapter using one of these options:
* A {project_name} adapter
* A third party library adapter
Register a client using one of these options:
* The Admin Console
* The client registration service
* The CLI
[role="_additional-resources"]
== Additional resources
This guide provide the detailed instructions for these steps. Additional information on using the Admin Console exists in the Server Administration Guide. That guide refers to creating a client rather than registering a client.

View file

@ -1,13 +0,0 @@
=== Terminology
These terms are used in this guide:
* `Clients` are entities that can request Keycloak to authenticate a user. Most often, clients are applications and services that want to use Keycloak to secure themselves and provide a single sign-on solution. Clients can also be entities that just want to request identity information or an access token so that they can securely invoke other services on the network that are secured by Keycloak.
* `Applications` include a wide range of applications that work for specific platforms for each protocol
* A `service account` is built-in account that exists for each client. The client uses this account to obtain an access token.
* `Client adapters` are libraries that make it very easy to secure applications and services with Keycloak. We call them adapters rather than libraries as they provide a tight integration to the underlying platform and framework. This makes our adapters easy to use and they require less boilerplate code than what is typically required by a library.
* `Creating a client` and `registering a client` are the same action. The Admin Console includes a Create Client option which performs the same action that is performed by using the Client Registration Services.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -10,7 +10,7 @@
<orgname>Red Hat Customer Content Services</orgname> <orgname>Red Hat Customer Content Services</orgname>
</authorgroup> </authorgroup>
<legalnotice lang="en-US" version="5.0" xmlns="http://docbook.org/ns/docbook"> <legalnotice lang="en-US" version="5.0" xmlns="http://docbook.org/ns/docbook">
<para> Copyright <trademark class="copyright"></trademark> 2019 Red Hat, Inc. </para> <para> Copyright <trademark class="copyright"></trademark> 2021 Red Hat, Inc. </para>
<para>Licensed under the Apache License, Version 2.0 (the "License"); <para>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at</para> You may obtain a copy of the License at</para>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View file

@ -54,11 +54,11 @@ include::topics/identity-broker/session-data.adoc[]
include::topics/identity-broker/first-login-flow.adoc[] include::topics/identity-broker/first-login-flow.adoc[]
include::topics/identity-broker/tokens.adoc[] include::topics/identity-broker/tokens.adoc[]
include::topics/identity-broker/logout.adoc[] include::topics/identity-broker/logout.adoc[]
include::topics/sso-protocols.adoc[]
include::topics/admin-console-permissions.adoc[] include::topics/admin-console-permissions.adoc[]
include::topics/admin-console-permissions/master-realm.adoc[] include::topics/admin-console-permissions/master-realm.adoc[]
include::topics/admin-console-permissions/per-realm.adoc[] include::topics/admin-console-permissions/per-realm.adoc[]
include::topics/admin-console-permissions/fine-grain.adoc[] include::topics/admin-console-permissions/fine-grain.adoc[]
include::topics/sso-protocols.adoc[]
include::topics/assembly-managing-clients.adoc[] include::topics/assembly-managing-clients.adoc[]
include::topics/vault.adoc[] include::topics/vault.adoc[]
include::topics/events.adoc[] include::topics/events.adoc[]
@ -74,12 +74,14 @@ include::topics/threat/clickjacking.adoc[]
include::topics/threat/ssl.adoc[] include::topics/threat/ssl.adoc[]
include::topics/threat/csrf.adoc[] include::topics/threat/csrf.adoc[]
include::topics/threat/redirect.adoc[] include::topics/threat/redirect.adoc[]
include::topics/threat/fapi-compliance.adoc[]
include::topics/threat/compromised-tokens.adoc[] include::topics/threat/compromised-tokens.adoc[]
include::topics/threat/compromised-codes.adoc[] include::topics/threat/compromised-codes.adoc[]
include::topics/threat/open-redirect.adoc[] include::topics/threat/open-redirect.adoc[]
include::topics/threat/password-db-compromised.adoc[] include::topics/threat/password-db-compromised.adoc[]
include::topics/threat/scope.adoc[] include::topics/threat/scope.adoc[]
include::topics/threat/audience-limit.adoc[] include::topics/threat/audience-limit.adoc[]
include::topics/threat/auth-sessions-limit.adoc[]
include::topics/threat/sql.adoc[] include::topics/threat/sql.adoc[]
include::topics/account.adoc[] include::topics/account.adoc[]
include::topics/admin-cli.adoc[] include::topics/admin-cli.adoc[]

View file

@ -1,6 +1,6 @@
[[_fine_grain_permissions]] [[_fine_grain_permissions]]
=== Fine Grain Admin Permissions === Fine grain admin permissions
:tech_feature_name: Fine Grain Admin Permissions :tech_feature_name: Fine Grain Admin Permissions
:tech_feature_setting: -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled :tech_feature_setting: -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled
@ -27,7 +27,7 @@ There are some important things to note about fine grain admin permissions:
* Fine grain permissions are used to grant additional permissions. You cannot override the * Fine grain permissions are used to grant additional permissions. You cannot override the
default behavior of the built in admin roles. default behavior of the built in admin roles.
==== Managing One Specific Client ==== Managing one specific client
Let's look first at allowing Let's look first at allowing
an admin to manage one client and one client only. In our example, we have a realm an admin to manage one client and one client only. In our example, we have a realm
@ -36,17 +36,17 @@ user in that realm permission to only manage that application.
IMPORTANT: You cannot do cross realm fine grain permissions. Admins in the `master` realm are limited to the predefined admin roles defined in previous chapters. IMPORTANT: You cannot do cross realm fine grain permissions. Admins in the `master` realm are limited to the predefined admin roles defined in previous chapters.
===== Permission Setup ===== Permission setup
The first thing we must do is login to the Admin Console so we can set up permissions for that client. We navigate to the management section The first thing we must do is login to the Admin Console so we can set up permissions for that client. We navigate to the management section
of the client, we want to define fine-grain permissions for. of the client, we want to define fine-grain permissions for.
.Client Management .Client management
image:{project_images}/fine-grain-client.png[] image:{project_images}/fine-grain-client.png[]
You should see a tab menu item called `Permissions`. Click on that tab. You should see a tab menu item called `Permissions`. Click on that tab.
.Client Permissions Tab .Client permissions tab
image:{project_images}/fine-grain-client-permissions-tab-off.png[] image:{project_images}/fine-grain-client-permissions-tab-off.png[]
By default, each client is not enabled to do fine grain permissions. So turn the `Permissions Enabled` switch to on By default, each client is not enabled to do fine grain permissions. So turn the `Permissions Enabled` switch to on
@ -54,7 +54,7 @@ to initialize permissions.
IMPORTANT: If you turn the `Permissions Enabled` switch to off, it will delete any and all permissions you have defined for this client. IMPORTANT: If you turn the `Permissions Enabled` switch to off, it will delete any and all permissions you have defined for this client.
.Client Permissions Tab .Client permissions tab
image:{project_images}/fine-grain-client-permissions-tab-on.png[] image:{project_images}/fine-grain-client-permissions-tab-on.png[]
When you switch `Permissions Enabled` to on, it initializes various permission objects behind the scenes When you switch `Permissions Enabled` to on, it initializes various permission objects behind the scenes
@ -63,7 +63,7 @@ interested in the `manage` permission for the client. Clicking on that will red
to the permission that handles the `manage` permission for the client. All authorization to the permission that handles the `manage` permission for the client. All authorization
objects are contained in the `realm-management` client's `Authorization` tab. objects are contained in the `realm-management` client's `Authorization` tab.
.Client Manage Permission .Client manage permission
image:{project_images}/fine-grain-client-manage-permissions.png[] image:{project_images}/fine-grain-client-manage-permissions.png[]
When first initialized the `manage` permission does not have any policies associated with it. When first initialized the `manage` permission does not have any policies associated with it.
@ -74,13 +74,13 @@ There's a pull down menu on this page called `Create policy`. There's a multitu
you can define. You can define a policy that is associated with a role or a group or even define you can define. You can define a policy that is associated with a role or a group or even define
rules in JavaScript. For this simple example, we're going to create a `User Policy`. rules in JavaScript. For this simple example, we're going to create a `User Policy`.
.User Policy .User policy
image:{project_images}/fine-grain-client-user-policy.png[] image:{project_images}/fine-grain-client-user-policy.png[]
This policy will match a hard-coded user in the user database. In this case, it is the `sales-admin` user. We must then go back to the This policy will match a hard-coded user in the user database. In this case, it is the `sales-admin` user. We must then go back to the
`sales-application` client's `manage` permission page and assign the policy to the permission object. `sales-application` client's `manage` permission page and assign the policy to the permission object.
.Assign User Policy .Assign user policy
image:{project_images}/fine-grain-client-assign-user-policy.png[] image:{project_images}/fine-grain-client-assign-user-policy.png[]
The `sales-admin` user can now has permission to manage the `sales-application` client. The `sales-admin` user can now has permission to manage the `sales-application` client.
@ -98,17 +98,17 @@ role tells the Admin Console that it should render client menus for the `sales-a
IMPORTANT If you do not set the `query-clients` role, restricted admins like `sales-admin` will not see any menu options when they log into the Admin Console IMPORTANT If you do not set the `query-clients` role, restricted admins like `sales-admin` will not see any menu options when they log into the Admin Console
===== Testing It Out. ===== Testing it out
Next, we log out of the master realm and re-login to the <<_per_realm_admin_permissions, dedicated admin console>> for the `test` realm Next, we log out of the master realm and re-login to the <<_per_realm_admin_permissions, dedicated admin console>> for the `test` realm
using the `sales-admin` as a username. This is located under `/auth/admin/test/console`. using the `sales-admin` as a username. This is located under `/auth/admin/test/console`.
.Sales Admin Login .Sales admin login
image:{project_images}/fine-grain-sales-admin-login.png[] image:{project_images}/fine-grain-sales-admin-login.png[]
This admin is now able to manage this one client. This admin is now able to manage this one client.
==== Restrict User Role Mapping ==== Restrict user role mapping
Another thing you might want to do is to restrict the set of roles an admin is allowed Another thing you might want to do is to restrict the set of roles an admin is allowed
to assign to a user. Continuing our last example, let's expand the permission set of the 'sales-admin' to assign to a user. Continuing our last example, let's expand the permission set of the 'sales-admin'
@ -119,26 +119,26 @@ and not perform any other types of user administration.
The `sales-application` has defined three different client roles. The `sales-application` has defined three different client roles.
.Sales Application Roles .Sales application roles
image:{project_images}/fine-grain-sales-application-roles.png[] image:{project_images}/fine-grain-sales-application-roles.png[]
We want the `sales-admin` user to be able to map these roles to any user in the system. The We want the `sales-admin` user to be able to map these roles to any user in the system. The
first step to do this is to allow the role to be mapped by the admin. If we click on the first step to do this is to allow the role to be mapped by the admin. If we click on the
`viewLeads` role, you'll see that there is a `Permissions` tab for this role. `viewLeads` role, you'll see that there is a `Permissions` tab for this role.
.View Leads Role Permission Tab .View leads role permission tab
image:{project_images}/fine-grain-view-leads-role-tab.png[] image:{project_images}/fine-grain-view-leads-role-tab.png[]
If we click on that tab and turn the `Permissions Enabled` on, you'll see that there If we click on that tab and turn the `Permissions Enabled` on, you'll see that there
are a number of actions we can apply policies to. are a number of actions we can apply policies to.
.View Leads Permissions .View leads permissions
image:{project_images}/fine-grain-view-leads-permissions.png[] image:{project_images}/fine-grain-view-leads-permissions.png[]
The one we are interested in is `map-role`. Click on this permission and add the same The one we are interested in is `map-role`. Click on this permission and add the same
User Policy that was created in the earlier example. User Policy that was created in the earlier example.
.Map-roles Permission .Map-roles permission
image:{project_images}/fine-grain-map-roles-permission.png[] image:{project_images}/fine-grain-map-roles-permission.png[]
What we've done is say that the `sales-admin` can map the `viewLeads` role. What we have What we've done is say that the `sales-admin` can map the `viewLeads` role. What we have
@ -147,7 +147,7 @@ we must go to the `Users` section of the admin console for this realm. Clicking
`Users` left menu item brings us to the users interface of the realm. You should see a `Users` left menu item brings us to the users interface of the realm. You should see a
`Permissions` tab. Click on that and enable it. `Permissions` tab. Click on that and enable it.
.Users Permissions .Users permissions
image:{project_images}/fine-grain-users-permissions.png[] image:{project_images}/fine-grain-users-permissions.png[]
The permission we are interested in is `map-roles`. This is a restrictive policy The permission we are interested in is `map-roles`. This is a restrictive policy
@ -162,7 +162,7 @@ allow the admin to view users in the realm he wants to add the `sales-applicatio
image:{project_images}/fine-grain-add-view-users.png[] image:{project_images}/fine-grain-add-view-users.png[]
===== Testing It Out. ===== Testing it out
Next, we log out of the master realm and re-login to the <<_per_realm_admin_permissions, dedicated admin console>> for the `test` realm Next, we log out of the master realm and re-login to the <<_per_realm_admin_permissions, dedicated admin console>> for the `test` realm
using the `sales-admin` as a username. This is located under `/auth/admin/test/console`. using the `sales-admin` as a username. This is located under `/auth/admin/test/console`.
@ -172,25 +172,25 @@ users you'll see that each user detail page is read only, except for the `Role M
Going to this tab you'll find that there are no `Available` roles for the admin to Going to this tab you'll find that there are no `Available` roles for the admin to
map to the user except when we browse the `sales-application` roles. map to the user except when we browse the `sales-application` roles.
.Add viewLeads .Add viewleads
image:{project_images}/fine-grain-add-view-leads.png[] image:{project_images}/fine-grain-add-view-leads.png[]
We've only specified that the `sales-admin` can map the `viewLeads` role. We've only specified that the `sales-admin` can map the `viewLeads` role.
===== Per Client map-roles Shortcut ===== Per client map-roles shortcut
It would be tedious if we had to do this for every client role that the `sales-application` published. It would be tedious if we had to do this for every client role that the `sales-application` published.
to make things easier, there's a way to specify that an admin can map any role defined to make things easier, there's a way to specify that an admin can map any role defined
by a client. If we log back into the admin console to our master realm admin and go back by a client. If we log back into the admin console to our master realm admin and go back
to the `sales-application` permissions page, you'll see the `map-roles` permission. to the `sales-application` permissions page, you'll see the `map-roles` permission.
.Client map-roles Permission .Client map-roles permission
image:{project_images}/fine-grain-client-permissions-tab-on.png[] image:{project_images}/fine-grain-client-permissions-tab-on.png[]
If you grant access to this particular permission to an admin, that admin will be able If you grant access to this particular permission to an admin, that admin will be able
map any role defined by the client. map any role defined by the client.
==== Full List of Permissions ==== Full list of permissions
You can do a lot more with fine grain permissions beyond managing a specific client or the specific roles of a client. You can do a lot more with fine grain permissions beyond managing a specific client or the specific roles of a client.
This chapter defines the whole list of permission types that can be described for This chapter defines the whole list of permission types that can be described for

View file

@ -1,5 +1,5 @@
=== Master Realm Access Control === Master realm access control
The `master` realm in {project_name} is a special realm and treated differently than other realms. The `master` realm in {project_name} is a special realm and treated differently than other realms.
Users in the {project_name} `master` realm can be granted permission to manage zero or more realms that are deployed on the {project_name} server. Users in the {project_name} `master` realm can be granted permission to manage zero or more realms that are deployed on the {project_name} server.
@ -7,7 +7,7 @@ When a realm is created, {project_name} automatically creates various roles that
Access to The Admin Console and Admin REST endpoints can be controlled by mapping these roles to users in the `master` realm. Access to The Admin Console and Admin REST endpoints can be controlled by mapping these roles to users in the `master` realm.
It's possible to create multiple super users, as well as users that can only manage specific realms. It's possible to create multiple super users, as well as users that can only manage specific realms.
==== Global Roles ==== Global roles
There are two realm-level roles in the `master` realm. There are two realm-level roles in the `master` realm.
These are: These are:
@ -18,7 +18,7 @@ These are:
Users with the `admin` role are super users and have full access to manage any realm on the server. Users with the `create-realm` role Users with the `admin` role are super users and have full access to manage any realm on the server. Users with the `create-realm` role
are allowed to create new realms. They will be granted full access to any new realm they create. are allowed to create new realms. They will be granted full access to any new realm they create.
==== Realm Specific Roles ==== Realm specific roles
Admin users within the `master` realm can be granted management privileges to one or more other realms in the system. Admin users within the `master` realm can be granted management privileges to one or more other realms in the system.
Each realm in {project_name} is represented by a client in the `master` realm. Each realm in {project_name} is represented by a client in the `master` realm.

View file

@ -1,6 +1,6 @@
[[_per_realm_admin_permissions]] [[_per_realm_admin_permissions]]
=== Dedicated Realm Admin Consoles === Dedicated realm admin consoles
Each realm has a dedicated Admin Console that can be accessed by going to the url `/auth/admin/{realm-name}/console`. Each realm has a dedicated Admin Console that can be accessed by going to the url `/auth/admin/{realm-name}/console`.
Users within that realm can be granted realm management permissions by assigning specific user role mappings. Users within that realm can be granted realm management permissions by assigning specific user role mappings.

View file

@ -17,3 +17,4 @@ include::clients/con-client-links.adoc[leveloffset=+2]
include::clients/con-protocol-mappers.adoc[leveloffset=+2] include::clients/con-protocol-mappers.adoc[leveloffset=+2]
include::clients/proc-generating-client-adapter-config.adoc[leveloffset=+2] include::clients/proc-generating-client-adapter-config.adoc[leveloffset=+2]
include::clients/con-client-scopes.adoc[leveloffset=+2] include::clients/con-client-scopes.adoc[leveloffset=+2]
include::clients/client-policies.adoc[leveloffset=+2]

View file

@ -28,4 +28,5 @@ include::users/proc-registering-new-user.adoc[leveloffset=3]
include::users/proc-enabling-recaptcha.adoc[leveloffset=+2] include::users/proc-enabling-recaptcha.adoc[leveloffset=+2]
include::users/ref-personal-data-collected.adoc[leveloffset=+2] include::users/ref-personal-data-collected.adoc[leveloffset=+2]
include::users/user-profile.adoc[leveloffset=+2]

View file

@ -1,5 +1,5 @@
== Configuring Authentication == Configuring authentication
This chapter covers several authentication topics. These topics include: This chapter covers several authentication topics. These topics include:

View file

@ -1,14 +0,0 @@
[[_oidc_clients]]
=== OIDC Clients
[role="_abstract"]
xref:con-oidc_{context}[OpenID Connect] is the recommended protocol to secure applications. It was designed from the ground up to be web friendly and it works best with HTML5/JavaScript applications.
include::proc-creating-oidc-client.adoc[]
include::con-basic-settings.adoc[]
include::con-advanced-settings.adoc[]
=======
>>>>>>> ee3211e6... applying indentation using leveloffsets
>>>>>>> 25f32ee4... applying indentation using leveloffsets
include::oidc/con-audience.adoc[]

View file

@ -1,129 +0,0 @@
[[_client-saml-configuration]]
=== SAML Clients
{project_name} supports <<_saml,SAML 2.0>> for registered applications.
POST and Redirect bindings are supported. You can choose to require client signature validation. You can have the server sign and/or encrypt responses as well.
.Procedure
. Click `Clients` in the left navigation pane.
. Click *Create* to go to the `Add Client` page.
+
.Add Client
image:{project_images}/add-client-saml.png[]
. Enter the `Client ID` of the client. This is often a URL and is the expected `issuer` value in SAML requests sent by the application.
. Select `saml` in the `Client Protocol` drop down box.
. Enter the `Client SAML Endpoint` URL. This URL is where you want the {project_name} server to send SAML requests and responses. Generally, applications have one URL for processing SAML requests. Multiple URLs can be set in the `Settings` tab of the client.
. Click *Save*. This action creates the client and brings you to the `Settings` tab.
+
.Client Settings
image:{project_images}/client-settings-saml.png[]
+
The following list describes each setting:
+
`Client ID`:: The alpha-numeric ID string that is used in OIDC requests and in the {project_name} database to identify the client. This value must match the issuer value sent with AuthNRequests. {project_name} pulls the issuer from the Authn SAML request and match it to a client by this value.
`Name`:: The name for the client in a {project_name} UI screen. To localize
the name, set up a replacement string value. For example, a string value such as $\{myapp}. See the link:{developerguide_link}[{developerguide_name}] for more information.
`Description`:: The description of the client. This setting can also be localized.
`Enabled`:: When set to OFF, the client cannot request authentication.
`Consent Required`:: When set to ON, users see a consent page that grants access to that application. The page also displays the metadata of the information that the client can access. If you have ever done a social login to Facebook, you often see a similar page. Red Hat Single Sign-On provides the same functionality.
`Include AuthnStatement`:: SAML login responses may specify the authentication method used, such as password, as well as timestamps of the login and the session expiration.
This switch is enabled by default, so that the `AuthnStatement` element will be included in login responses. Setting this to OFF prevents clients from determining the maximum session length, which can create client sessions that do not expire.
`Sign Documents`:: When set to ON, {project_name} signs the document using the realms private key.
`Optimize REDIRECT signing key lookup`:: When set to ON, the SP messages include the {project_name} native extension. This extension contains a hint with the signing key ID. The SP uses the extension for signature validation instead of attempting to validate the signature using keys.
+
This option applies to REDIRECT bindings where the signature is transferred in query parameters and this information is not found in the signature information. This is contrary to POST binding messages where key ID is always included in document signature.
+
This option is used when {project_name} server and adapter provide the IDP and SP. This option is only relevant when `Sign Documents` is set to ON.
`Sign Assertions`:: The assertion is signed and embedded in the SAML XML Auth response.
`Signature Algorithm`:: The algorithm used in signing SAML documents.
`SAML Signature Key Name`:: Signed SAML documents sent using POST binding contain the identification of the signing key in the `KeyName` element. This action can be controlled by the `SAML Signature Key Name` option. This option controls the contents of the `Keyname`.
+
--
* _KEY_ID_:: The `KeyName` contains the key ID. This option is the default option.
* _CERT_SUBJECT_:: The `KeyName` contains the subject from the certificate corresponding to the realm key. This option is expected by Microsoft Active Directory Federation Services.
* _NONE_:: The `KeyName` hint is completely omitted from the SAML message.
--
+
`Canonicalization Method`:: The canonicalization method for XML signatures.
`Encrypt Assertions`:: Encrypts the assertions in SAML documents with the realms private key. The AES algorithm uses a key size of 128 bits.
`Client Signature Required`:: If this switch is set to ON, documents coming from a client are expected to be signed. {project_name} validates this signature using the client public key or certificate set up in the `SAML Keys` tab.
`Force POST Binding`:: By default, {project_name} responds using the initial SAML binding of the original request. By setting this switch to ON, {project_name} responds using the SAML POST binding even if the original request used the redirect binding.
`Front Channel Logout`:: If this switch is set to ON, the application requires a browser redirect to perform a logout. For example, the application may require a cookie to be reset which could only be done via a redirect. If this switch is set to OFF, {project_name} invokes a background SAML request to log out of the application.
`Force Name ID Format`:: If a request has a name ID policy, ignore it and use the value configured in the admin console under `Name ID Format`.
`Name ID Format`:: The Name ID Format for the subject. This format is used if no name ID policy is specified in a request, or if the Force Name ID Format attribute is set to ON.
<<<<<<< HEAD
Client Signature Required::
Expect that documents coming from a client are signed.
{project_name} will validate this signature using the client public key or cert set up in the `Keys` tab.
=======
`Root URL`:: When {project_name} uses a configured relative URL, this value is prepended to the URL.
>>>>>>> c775d1cd... removing client-saml.adoc
`Valid Redirect URIs`:: Enter a URL pattern and click the + sign to add. Click the - sign to remove. Click the `Save` button to save these changes.
Wildcards values are allowed only at the end of a URL. For example, http://host.com/*$$.
This field is used when the exact SAML endpoints are not registered and {project_name} pulls the Assertion Consumer URL from a request.
`Base URL`:: If {project_name} needs to link to a client, this URL is used.
`Master SAML Processing URL`:: This URL is used for all SAML requests and the response is directed to the SP. It is used as the Assertion Consumer Service URL and the Single Logout Service URL.
+
If login requests contain the Assertion Consumer Service URL then those login requests will take precedence. This URL must be validated by a registered Valid Redirect URI pattern.
<<<<<<< HEAD
Name ID Format::
Name ID Format for the subject.
If no name ID policy is specified in the request or if the Force Name ID Format attribute is true, this value is used.
Properties used for each of the respective formats are defined below.
You can change the attribute used by the NameID Mapper.
|===
|Name ID Format|Properties/Attributes Used|Example
|username (unspecified)
|Username Property
|example_user
|email
|Email Property
|example_user@example.com
|persistent
|saml.persistent.name.id.for.$clientId Attribute
|G-6e2a1050-0fc0-479b-bf6e-29cd3ccb373b
|transient
|property and attribute values are not used
|G-bfb85c10-57d7-4331-81bc-52f104599d79
|===
=======
`Assertion Consumer Service POST Binding URL`:: POST Binding URL for the Assertion Consumer Service.
>>>>>>> fa08830f... removing client-saml.adoc
`Assertion Consumer Service Redirect Binding URL`:: Redirect Binding URL for the Assertion Consumer Service.
`Logout Service POST Binding URL`:: POST Binding URL for the Logout Service.
`Logout Service Redirect Binding URL`:: Redirect Binding URL for the Logout Service.

View file

@ -1,193 +0,0 @@
[[_client_scopes]]
=== Client Scopes
If you have many applications you need to secure and register within your organization, it can become tedious to configure the
<<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>> for each of these clients. {project_name} allows
you to define a shared client configuration in an entity called a _client scope_.
Client scopes also provide support for the OAuth 2 `scope` parameter, which allows a client application to request more or fewer
claims or roles in the access token, according to the application needs.
To create a client scope, follow these steps:
* Go to the `Client Scopes` left menu item. This initial screen shows you a list of currently defined client scopes.
.Client Scopes List
image:{project_images}/client-scopes-list.png[]
* Click the `Create` button. Name the client scope and save. A _client scope_ will have similar tabs to a regular clients. You can
define <<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>>, which can be inherited by other clients,
and which are configured to inherit from this client scope.
==== Protocol
When you are creating the client scope, you must choose the `Protocol`. Only the clients which use same protocol can then be linked
with this client scope.
Once you have created new realm, you can see that there is a list of pre-defined (builtin) client scopes in the menu.
* For the SAML protocol, there is one builtin client scope, `roles_list`, which contains one protocol mapper for showing the roles
list in the SAML assertion.
* For the OpenID Connect protocol, there are client scopes `profile`, `email`, `address`, `phone`, `offline_access`, `roles`,
`web-origins` and `microprofile-jwt`.
The client scope, `offline_access`, is useful when client wants to obtain offline tokens. Learn about offline tokens in the
<<_offline-access, Offline Access section>> or in the https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess[OpenID Connect specification],
where scope parameter is defined with the value `offline_access`.
The client scopes `profile`, `email`, `address` and `phone` are also defined in the https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims[OpenID Connect specification].
These client scopes do not have any role scope mappings defined, but they have some protocol mappers defined, and these mappers correspond
to the claims defined in the OpenID Connect specification.
For example, when you click to open the `phone` client scope and open the `Mappers` tab, you will see the protocol mappers, which
correspond to the claims defined in the specification for the scope `phone`.
.Client Scope Mappers
image:{project_images}/client-scopes-phone.png[]
When the `phone` client scope is linked to a client, that client automatically inherits all the protocol mappers defined in the
`phone` client scope. Access tokens issued for this client will contain the phone number information about the user, assuming that
the user has a defined phone number.
Builtin client scopes contain exactly the protocol mappers as defined per the specification,
however you are free to edit client scopes and create/update/remove any protocol mappers (or role scope mappings).
The client scope `roles` is not defined in the OpenID Connect specification and it is also not added automatically to the `scope`
claim in the access token. This client scope has some mappers, which are used to add roles of the user to the access token and
possibly add some audiences for the clients with at least one client role as described in the <<_audience_resolve, Audience section>>.
The client scope `web-origins` is also not defined in the OpenID Connect specification and not added to the `scope` claim. This is used
to add allowed web origins to the access token `allowed-origins` claim.
The client scope `microprofile-jwt` was created to handle the claims defined in the https://wiki.eclipse.org/MicroProfile/JWT_Auth[MicroProfile/JWT Auth Specification].
This client scope defines a user property mapper for the `upn` claim and also a realm role mapper for the `groups` claim. These mappers
can be changed as needed so that different properties can be used to create the MicroProfile/JWT specific claims.
==== Consent related settings
Client scope contains options related to the consent screen. Those options are useful only if the linked client is configured to
require consent (if the `Consent Required` switch is enabled on the client).
Display On Consent Screen::
If on, and if this client scope is added to a client with consent required, then the text specified by `Consent Screen Text` will
be displayed on the consent screen, which is shown once the user is authenticated and right before he is redirected from {project_name}
to the client. If the switch is off, then this client scope will not be displayed on the consent screen.
Consent Screen Text::
The text shown on the consent screen when this client scope is added to some client with consent required defaults to
the name of client scope. The value for this text is localizable by specifying a substitution variable
with `${var-name}` strings. The localized value is then configured within property files in your theme. See the
link:{developerguide_link}[{developerguide_name}] for more information on localization.
[[_client_scopes_linking]]
==== Link Client Scope with the Client
Linking between client scope and client is configured in the `Client Scopes` tab of the particular client. There are 2 ways of
linking between client scope and client.
Default Client Scopes::
This is applicable for both OpenID Connect and SAML clients. Default client scopes are always applied when issuing OpenID Connect tokens
or SAML assertions for this client. The client will inherit Protocol mappers and Role Scope Mappings defined on the client
scope. For the OpenID Connect Protocol, the Mappers and Role Scope Mappings are always applied, regardless of the value used for the scope
parameter in the OpenID Connect authorization request.
Optional Client Scopes::
This is applicable only for OpenID Connect clients. Optional client scopes are applied when issuing tokens for this client,
but only when they are requested by the `scope` parameter in the OpenID Connect authorization request.
===== Example
For this example, we assume that the client has `profile` and `email` linked as default client scopes, and `phone` and `address`
are linked as optional client scopes. The client will use the value of the scope parameter when sending a request to the OpenID Connect authorization
endpoint:
```
scope=openid phone
```
The scope parameter contains the string, with the scope values divided by space (which is also the reason why a client scope name
cannot contain a space character in it). The value `openid` is the meta-value used for all OpenID Connect requests, so we will ignore
it for this example. The token will contain mappers and role scope mappings from the client scopes `profile`, `email` (which are
default scopes) and `phone` (an optional client scope requested by the scope parameter).
[[_client_scopes_evaluate]]
==== Evaluating Client Scopes
The tabs `Mappers` and `Scope` of the client contain the protocol mappers and role scope mappings declared solely for this client.
They do not contain the mappers and scope mappings inherited from client scopes. However, it may be useful to see what the
effective protocol mappers will be (protocol mappers defined on the client itself as well as inherited from the linked client scopes)
and the effective role scope mappings used when you generate the token for the particular client.
You can see all of these when you click the `Client Scopes` tab for the client and then open the sub-tab `Evaluate`. From here you
can select the optional client scopes that you want to apply. This will also show you the value of the `scope` parameter, which needs to
be sent from the application to the {project_name} OpenID Connect authorization endpoint.
.Evaluating Client Scopes
image:{project_images}/client-scopes-evaluate.png[]
NOTE: If you want to see how you can send a custom value for a `scope` parameter from your application, see the
link:{adapterguide_link}#_params_forwarding[parameters forwarding section], if your application uses the servlet adapter, or the
link:{adapterguide_link}#_javascript_adapter[javascript adapter section], if your application uses the javascript adapter.
===== Generating Example Tokens and User Info
If you select a user in the `Evaluate` screen, the following example data is generated:
* Generated Access Token: An access token that will be generated and sent to the client when the selected user is authenticated.
* Generated ID Token: An ID Token that will be generated and sent to the client when the selected user is authenticated.
* Generated User Info: The information about the user that is returned by the UserInfo Endpoint.
All examples are generated for the particular user and issued for the particular client, with the specified
value of `scope` parameter. The examples include all of the claims and role mappings used.
==== Client Scopes Permissions
When issuing tokens for a particular user, the client scope is applied only if the user is permitted to use it. In the case that
a client scope does not have any role scope mappings defined on itself, then each user is automatically permitted to use this
client scope. However, when a client scope has any role scope mappings defined on itself, then the user must be a member of at least
one of the roles. In other words, there must be an intersection between the user roles and the roles of the client scope. Composite
roles are taken into account when evaluating this intersection.
If a user is not permitted to use the client scope, then no protocol mappers or role scope mappings will be used when generating tokens
and the client scope will not appear in the _scope_ value in the token.
==== Realm Default Client Scopes
The `Realm Default Client Scopes` allow you to define set of client scopes, which will be automatically linked to newly created clients.
Open the left menu item `Client Scopes` and then select `Default Client Scopes`.
From here, select the client scopes that you want to add as `Default Client Scopes` to newly created clients and `Optional Client Scopes`
to newly created clients.
.Default Client Scopes
image:{project_images}/client-scopes-default.png[]
Once the client is created, you can unlink the default client scopes, if needed. This is similar to how you
remove <<_default_roles, Default Roles>>.
==== Scopes explained
The term `scope` is used in {project_name} on few places. Various occurrences of scopes are related to each other, but may have
a different context and meaning. To clarify, here we explain the various `scopes` used in {project_name}.
Client scope::
Referenced in this chapter. Client scopes are entities in {project_name}, which are configured at the realm level and they can be
linked to clients. The client scopes are referenced by their name when a request is sent to the {project_name} authorization endpoint
with a corresponding value of the `scope` parameter. The details are described in the <<_client_scopes_linking, section about
client scopes linking>>.
Role scope mapping::
This can be seen when you open tab `Scope` of a client or client scope. Role scope mapping allows you to limit the roles which can
be used in the access tokens. The details are described in the <<_role_scope_mappings, Role Scope Mappings section>>.
ifeval::[{project_community}==true]
Authorization scopes::
This is used by the Authorization feature. The `Authorization Scope` is the action which can be done in the application.
More details in the link:{authorizationguide_link}[Authorization Services Guide].
endif::[]

View file

@ -1,80 +0,0 @@
[[_client-credentials]]
==== Confidential Client Credentials
If you've set the client's <<_access-type, access type>> to `confidential` in the client's
`Settings` tab, a new `Credentials` tab will show up. Note that the `Credentials` tab only
shows up after you've clicked the `Save` button at the bottom of the settings screen with a
`confidential` access type. As part of dealing with this type of client you have to configure
the client's credentials.
.Credentials Tab
image:{project_images}/client-credentials.png[]
The `Client Authenticator` list box specifies the type of credential you are going to use for your confidential client.
It defaults to client ID and secret. The secret is automatically generated for you and the `Regenerate Secret`
button allows you to recreate this secret if you want or need to.
Alternatively, you can opt to use a signed Json Web Token (JWT) or x509 certificate validation (also called Mutual TLS) instead of a secret.
.Signed JWT
image:{project_images}/client-credentials-jwt.png[]
When choosing this credential type you will have to also generate a private key and certificate for the client in the tab `Keys`.
The private key will be used to sign the JWT, while the certificate is used by the server to verify the signature.
.Keys Tab
image:images/client-oidc-keys.png[]
Click on the `Generate new keys and certificate` button to start this process.
.Generate Keys
image:{project_images}/generate-client-keys.png[]
When you generate these keys, {project_name} will store the certificate, and you'll need to download the private key
and certificate for your client to use. Pick the archive format you want and specify the password for the private key
and store.
You can also opt to
generate these via an external tool and just import the client's certificate.
.Import Certificate
image:{project_images}/import-client-cert.png[]
There are multiple formats you can import from, just choose the archive format you have the certificate stored in,
select the file, and click the `Import` button.
Finally note that you don't even need to import certificate if you choose to `Use JWKS URL` . In that case, you can provide the URL where
client publishes its public key in https://self-issued.info/docs/draft-ietf-jose-json-web-key.html[JWK] format. This is flexible because when
client changes its keys, {project_name} will automatically download them without need to re-import anything on {project_name} side.
If you use client secured by {project_name} adapter, you can configure the JWKS URL like https://myhost.com/myapp/k_jwks assuming that https://myhost.com/myapp is the
root URL of your client application. See link:{developerguide_link}[{developerguide_name}] for additional details.
WARNING: For the performance purposes, {project_name} caches the public keys of the OIDC clients. If you think that private key of your client
was compromised, it is obviously good to update your keys, but it's also good to clear the keys cache. See <<_clear-cache, Clearing the cache>>
section for more details.
.Signed JWT with Client Secret
If you select this option in the `Client Authenticator` list box, you can use a JWT signed by client secret instead of the private key.
This client secret will be used to sign the JWT by the client.
.X509 Certificate
By enabling this option {project_name} will validate if the client uses proper X509 certificate during the TLS Handshake.
NOTE: This option requires mutual TLS in {project_name}, see <<_enable-mtls-wildfly, Enable mutual SSL in WildFly>>.
.X509 Certificate
image:{project_images}/x509-client-auth.png[]
The validator checks also the certificate's Subject DN field with configured regexp validation expression. For some
use cases, it is sufficient to accept all certificates. In that case, you can use `(.*?)(?:$)` expression.
There are two ways for {project_name} to obtain the Client ID from the request. The first option is the `client_id`
parameter in the query (described in Section 2.2 of the https://datatracker.ietf.org/doc/html/rfc6749[OAuth 2.0 Specification]).
The second option is to supply `client_id` as a form parameter.

View file

@ -1,12 +1,11 @@
=== Conditions in conditional flows
=== Conditions in Conditional flows
As was mentioned in <<_execution-requirements, Execution requirements>>, _Condition_ executions can be only contained in _Conditional_ subflow. As was mentioned in <<_execution-requirements, Execution requirements>>, _Condition_ executions can be only contained in _Conditional_ subflow.
If all _Condition_ executions evaluate as true, then the _Conditional_ sub-flow acts as _Required_. If all _Condition_ executions evaluate as true, then the _Conditional_ sub-flow acts as _Required_.
You can process the next execution in the _Conditional_ sub-flow. You can process the next execution in the _Conditional_ sub-flow.
If some executions included in the _Conditional_ sub-flow evaluate as false, then the whole sub-flow is considered as _Disabled_. If some executions included in the _Conditional_ sub-flow evaluate as false, then the whole sub-flow is considered as _Disabled_.
==== Available Conditions ==== Available conditions
`Condition - User Role`:: `Condition - User Role`::
This execution has the ability to determine if the user has a role defined by _User role_ field. This execution has the ability to determine if the user has a role defined by _User role_ field.
@ -72,10 +71,10 @@ This example includes `Condition - User Role` and `Deny Access` executions.
.Browser flow .Browser flow
image:images/deny-access-flow.png[] image:images/deny-access-flow.png[]
.Condition - User Role configuration .Condition - user role configuration
image:images/deny-access-role-condition.png[] image:images/deny-access-role-condition.png[]
.Configuration of the `Deny Access` is really easy. You can specify an arbitrary alias and required message like this: .Configuration of the `Deny Access` is really easy. You can specify an arbitrary Alias and required message like this:
image:images/deny-access-execution-cond.png[] image:images/deny-access-execution-cond.png[]
The last thing is defining the property with an error message in the login theme `messages_en.properties` (for English): The last thing is defining the property with an error message in the login theme `messages_en.properties` (for English):

View file

@ -1,6 +1,6 @@
[[_authentication-flows]] [[_authentication-flows]]
=== Authentication Flows === Authentication flows
An _authentication flow_ is a container of authentications, screens, and actions, during log in, registration, and other {project_name} workflows. An _authentication flow_ is a container of authentications, screens, and actions, during log in, registration, and other {project_name} workflows.
To view all the flows, actions, and checks, each flow requires: To view all the flows, actions, and checks, each flow requires:
@ -15,7 +15,7 @@ To view all the flows, actions, and checks, each flow requires:
In the drop-down list, select *browser* to display the Browser Flow screen. In the drop-down list, select *browser* to display the Browser Flow screen.
.Browser Flow .Browser flow
image:{project_images}/browser-flow.png[Browser Flow] image:{project_images}/browser-flow.png[Browser Flow]
Hover over the question-mark tooltip of the drop-down list to view a description of the flow. Two sections exist. Hover over the question-mark tooltip of the drop-down list to view a description of the flow. Two sections exist.
@ -39,20 +39,18 @@ This action is configured through the *Actions* > *Config* link. It redirects to
+ +
Since this sub-flow is marked as _alternative_, it will not be executed if the *Cookie* authentication type passed. This sub-flow contains an additional authentication type that needs to be executed. {project_name} loads the executions for this sub-flow and processes them. Since this sub-flow is marked as _alternative_, it will not be executed if the *Cookie* authentication type passed. This sub-flow contains an additional authentication type that needs to be executed. {project_name} loads the executions for this sub-flow and processes them.
.. The first execution is the *Username Password Form*, an authentication type that renders the username and password page. It is marked as _required_, so the user must enter a valid username and password. The first execution is the *Username Password Form*, an authentication type that renders the username and password page. It is marked as _required_, so the user must enter a valid username and password.
.. The second execution is the *Browser - Conditional OTP* sub-flow. This sub-flow is _conditional_ and executes depending on the result of the *Condition - User Configured* execution. If the result is true, {project_name} loads the executions for this sub-flow and processes them. The second execution is the *Browser - Conditional OTP* sub-flow. This sub-flow is _conditional_ and executes depending on the result of the *Condition - User Configured* execution. If the result is true, {project_name} loads the executions for this sub-flow and processes them.
.. The next execution is the *Condition - User Configured* authentication. This authentication checks if {project_name} has configured other executions in the flow for the user. The *Browser - Conditional OTP* sub-flow executes only when the user has a configured OTP credential. The next execution is the *Condition - User Configured* authentication. This authentication checks if {project_name} has configured other executions in the flow for the user. The *Browser - Conditional OTP* sub-flow executes only when the user has a configured OTP credential.
.. The final execution is the *OTP Form*. {project_name} marks this execution as _required_ but it runs only when the user has an OTP credential set up because of the setup in the _conditional_ sub-flow. If not, the user does not see an OTP form. The final execution is the *OTP Form*. {project_name} marks this execution as _required_ but it runs only when the user has an OTP credential set up because of the setup in the _conditional_ sub-flow. If not, the user does not see an OTP form.
[[_execution-requirements]]
==== Execution requirements
===== Requirement ===== Requirement
A set of radio buttons that control the execution of an action executes. A set of radio buttons that control the execution of an action executes.
[[_execution-requirements]]
====== Required ====== Required
All _Required_ elements in the flow must be successfully sequentially executed. The flow terminates if a required element fails. All _Required_ elements in the flow must be successfully sequentially executed. The flow terminates if a required element fails.
@ -162,7 +160,7 @@ To illustrate the creation of flows, this section describes creating an advanced
.The common part with the browser flow .The common part with the browser flow
image:images/Passwordless-browser-login-common.png[] image:images/Passwordless-browser-login-common.png[]
+ +
. Click *Actions* for the *Forms* execution. . Click *Actions for the *Forms* execution.
. Select *Add execution*. . Select *Add execution*.
. Select *Username Form* from the drop-down list. . Select *Username Form* from the drop-down list.
. Click *Save*. . Click *Save*.

View file

@ -57,7 +57,7 @@ Install a Kerberos client on your machine.
.Procedure .Procedure
. Install a Kerberos client. If your machine runs Fedora, Ubuntu, or RHEL, install the link:https://www.freeipa.org/page/Downloads[freeipa-client] package, containing a Kerberos client and other utilities. . Install a Kerberos client. If your machine runs Fedora, Ubuntu, or RHEL, install the link:https://www.freeipa.org/page/Downloads[freeipa-client] package, containing a Kerberos client and other utilities.
. Configure the Kerberos client (on Linux, the configuration settings are in the link:https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html`[/etc/krb5.conf] file ). . Configure the Kerberos client (on Linux, the configuration settings are in the link:https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html[/etc/krb5.conf] file ).
+ +
Add your Kerberos realm to the configuration and configure the HTTP domains your server runs on. Add your Kerberos realm to the configuration and configure the HTTP domains your server runs on.
+ +
@ -74,16 +74,16 @@ For example, for the MYDOMAIN.ORG realm, you can configure the `domain_realm` se
+ +
For the MIT Kerberos example above, we exported keytab to the `/tmp/http.keytab` file. If your _Key Distribution Centre (KDC)_ and {project_name} run on the same host, the file is already available. For the MIT Kerberos example above, we exported keytab to the `/tmp/http.keytab` file. If your _Key Distribution Centre (KDC)_ and {project_name} run on the same host, the file is already available.
===== Enabling SPNEGO Processing ===== Enabling SPNEGO processing
By default, {project_name} disables SPNEGO protocol support. To enable it, go to the <<_authentication-flows, browser flow>> and enable *Kerberos*. By default, {project_name} disables SPNEGO protocol support. To enable it, go to the <<_authentication-flows, browser flow>> and enable *Kerberos*.
.Browser Flow .Browser flow
image:{project_images}/browser-flow.png[Browser Flow] image:{project_images}/browser-flow.png[Browser Flow]
Set the *Kerberos* requirement from _disabled_ to _alternative_ (Kerberos is optional) or _required_ (browser must have Kerberos enabled). If you have not configured the browser to work with SPNEGO or Kerberos, {project_name} falls back to the regular login screen. Set the *Kerberos* requirement from _disabled_ to _alternative_ (Kerberos is optional) or _required_ (browser must have Kerberos enabled). If you have not configured the browser to work with SPNEGO or Kerberos, {project_name} falls back to the regular login screen.
===== Configure Kerberos User Storage Federation Provider ===== Configure Kerberos user storage federation providerxs
You must now use <<_user-storage-federation,User Storage Federation>> to configure how {project_name} interprets Kerberos tickets. Two different federation providers exist with Kerberos authentication support. You must now use <<_user-storage-federation,User Storage Federation>> to configure how {project_name} interprets Kerberos tickets. Two different federation providers exist with Kerberos authentication support.
@ -92,7 +92,7 @@ To authenticate with Kerberos backed by an LDAP server, configure the <<_ldap, L
.Procedure .Procedure
. Go to the configuration page for your LDAP provider. . Go to the configuration page for your LDAP provider.
+ +
.LDAP Kerberos Integration .Ldap kerberos integration
image:{project_images}/ldap-kerberos.png[LDAP Kerberos Integration] image:{project_images}/ldap-kerberos.png[LDAP Kerberos Integration]
+ +
. Toggle *Allow Kerberos authentication* to *ON* . Toggle *Allow Kerberos authentication* to *ON*
@ -105,7 +105,7 @@ If an LDAP server is not backing up your Kerberos solution, use the *Kerberos* U
. Click *User Federation* in the menu. . Click *User Federation* in the menu.
. Select *Kerberos* from the *Add provider* select box. . Select *Kerberos* from the *Add provider* select box.
+ +
.Kerberos User Storage Provider .Kerberos user storage provider
image:{project_images}/kerberos-provider.png[Kerberos User Storage Provider] image:{project_images}/kerberos-provider.png[Kerberos User Storage Provider]
The *Kerberos* provider parses the Kerberos ticket for simple principal information and imports the information into the local {project_name} database. The *Kerberos* provider parses the Kerberos ticket for simple principal information and imports the information into the local {project_name} database.
@ -122,7 +122,7 @@ In Windows domains, clients do not need to adjust their configuration. Internet
ifeval::[{project_community}==true] ifeval::[{project_community}==true]
==== Example setups ==== Example setups
===== {project_name} and FreeIPA docker image ===== {Project_name} and FreeIPA docker image
When you install https://www.docker.com/[docker], run a docker image with the FreeIPA server installed. FreeIPA provides an integrated security solution with MIT Kerberos and 389 LDAP server. The image also contains a {project_name} server configured with an LDAP Federation provider and enabled SPNEGO/Kerberos authentication against the FreeIPA server. See details https://github.com/mposolda/keycloak-freeipa-docker/blob/master/README.md[here]. When you install https://www.docker.com/[docker], run a docker image with the FreeIPA server installed. FreeIPA provides an integrated security solution with MIT Kerberos and 389 LDAP server. The image also contains a {project_name} server configured with an LDAP Federation provider and enabled SPNEGO/Kerberos authentication against the FreeIPA server. See details https://github.com/mposolda/keycloak-freeipa-docker/blob/master/README.md[here].
@ -131,7 +131,7 @@ When you install https://www.docker.com/[docker], run a docker image with the Fr
For quick testing and unit tests, use a simple http://directory.apache.org/apacheds/[ApacheDS] Kerberos server. You must build {project_name} from the source and then run the Kerberos server with the maven-exec-plugin from our test suite. See details https://github.com/keycloak/keycloak/blob/master/docs/tests.md#kerberos-server[here]. For quick testing and unit tests, use a simple http://directory.apache.org/apacheds/[ApacheDS] Kerberos server. You must build {project_name} from the source and then run the Kerberos server with the maven-exec-plugin from our test suite. See details https://github.com/keycloak/keycloak/blob/master/docs/tests.md#kerberos-server[here].
endif::[] endif::[]
==== Credential Delegation ==== Credential delegation
Kerberos supports the credential delegation. Applications may need access to the Kerberos ticket so they can re-use it to interact with other services secured by Kerberos. Because the {project_name} server processed the SPNEGO protocol, you must propagate the GSS credential to your application within the OpenID Connect token claim or a SAML assertion attribute. {project_name} transmits this to your application from the {project_name} server. To insert this claim into the token or assertion, each application must enable the built-in protocol mapper `gss delegation credential`. This mapper is available in the *Mappers* tab of the application's client page. See <<_protocol-mappers, Protocol Mappers>> chapter for more details. Kerberos supports the credential delegation. Applications may need access to the Kerberos ticket so they can re-use it to interact with other services secured by Kerberos. Because the {project_name} server processed the SPNEGO protocol, you must propagate the GSS credential to your application within the OpenID Connect token claim or a SAML assertion attribute. {project_name} transmits this to your application from the {project_name} server. To insert this claim into the token or assertion, each application must enable the built-in protocol mapper `gss delegation credential`. This mapper is available in the *Mappers* tab of the application's client page. See <<_protocol-mappers, Protocol Mappers>> chapter for more details.

View file

@ -1,14 +1,14 @@
=== One Time Password (OTP) Policies === One Time Password (OTP) policies
{project_name} has several policies for setting up a FreeOTP or Google Authenticator One-Time Password generator. Click the *Authentication* menu and click the *OTP Policy* tab. {project_name} has several policies for setting up a FreeOTP or Google Authenticator One-Time Password generator. Click the *Authentication* menu and click the *OTP Policy* tab.
.OTP Policy .Otp policy
image:{project_images}/otp-policy.png[OTP Policy] image:{project_images}/otp-policy.png[OTP Policy]
{project_name} generates a QR code on the OTP set-up page, based on information configured in the *OTP Policy* tab. FreeOTP and Google Authenticator scan the QR code when configuring OTP. {project_name} generates a QR code on the OTP set-up page, based on information configured in the *OTP Policy* tab. FreeOTP and Google Authenticator scan the QR code when configuring OTP.
==== Time-Based or Counter-Based One Time Passwords ==== Time-based or counter-based one time passwords
The algorithms available in {project_name} for your OTP generators are time-based and counter-based. The algorithms available in {project_name} for your OTP generators are time-based and counter-based.
@ -20,37 +20,37 @@ TOTP is more secure than HOTP because the matchable OTP is valid for a short win
HOTP requires a database update every time the server increments the counter. This update is a performance drain on the authentication server during heavy load. To increase efficiency, TOTP does not remember passwords used, so there is no need to perform database updates. The drawback is that it is possible to re-use TOTPs in the valid time interval. HOTP requires a database update every time the server increments the counter. This update is a performance drain on the authentication server during heavy load. To increase efficiency, TOTP does not remember passwords used, so there is no need to perform database updates. The drawback is that it is possible to re-use TOTPs in the valid time interval.
==== TOTP Configuration Options ==== TOTP configuration options
===== OTP Hash Algorithm ===== OTP hash algorithm
The default algorithm is SHA1. The other, more secure options are SHA256 and SHA512. The default algorithm is SHA1. The other, more secure options are SHA256 and SHA512.
===== Number of Digits ===== Number of digits
The length of the OTP. Short OTP's are user-friendly, easier to type, and easier to remember. Longer OTP's are more secure than shorter OTP's. The length of the OTP. Short OTP's are user-friendly, easier to type, and easier to remember. Longer OTP's are more secure than shorter OTP's.
===== Look Ahead Window ===== Look ahead window
The number of intervals the server attempts to match the hash. This option is present in {project_name} if the clock of the TOTP generator or authentication server become out-of-sync. The default value of 1 is adequate. For example, if the time interval for a token is 30 seconds, the default value of 1 means it will accept valid tokens in the 30-second window. Every increment of this value increases the valid window by 30 seconds. The number of intervals the server attempts to match the hash. This option is present in {project_name} if the clock of the TOTP generator or authentication server become out-of-sync. The default value of 1 is adequate. For example, if the time interval for a token is 30 seconds, the default value of 1 means it will accept valid tokens in the 30-second window. Every increment of this value increases the valid window by 30 seconds.
===== OTP Token Period ===== OTP token period
The time interval in seconds the server matches a hash. Each time the interval passes, the token generator generates a TOTP. The time interval in seconds the server matches a hash. Each time the interval passes, the token generator generates a TOTP.
==== HOTP Configuration Options ==== HOTP configuration options
===== OTP Hash Algorithm ===== OTP hash algorithm
The default algorithm is SHA1. The other, more secure options are SHA256 and SHA512. The default algorithm is SHA1. The other, more secure options are SHA256 and SHA512.
===== Number of Digits ===== Number of digits
The length of the OTP. Short OTPs are user-friendly, easier to type, and easier to remember. Longer OTPs are more secure than shorter OTPs. The length of the OTP. Short OTPs are user-friendly, easier to type, and easier to remember. Longer OTPs are more secure than shorter OTPs.
===== Look Ahead Window ===== Look ahead window
The number of intervals the server attempts to match the hash. This option is present in {project_name} if the clock of the TOTP generator or authentication server become out-of-sync. The default value of 1 is adequate. This option is present in {project_name} to cover when the user's counter gets ahead of the server. The number of intervals the server attempts to match the hash. This option is present in {project_name} if the clock of the TOTP generator or authentication server become out-of-sync. The default value of 1 is adequate. This option is present in {project_name} to cover when the user's counter gets ahead of the server.
===== Initial Counter ===== Initial counter
The value of the initial counter. The value of the initial counter.

View file

@ -1,7 +1,7 @@
[[_password-policies]] [[_password-policies]]
=== Password Policies === Password policies
When {project_name} creates a realm, it does not associate password policies with the realm. You can set a simple password with no restrictions on its length, security, or complexity. Simple passwords are unacceptable in production environments. {project_name} has a set of password policies available through the Admin Console. When {project_name} creates a realm, it does not associate password policies with the realm. You can set a simple password with no restrictions on its length, security, or complexity. Simple passwords are unacceptable in production environments. {project_name} has a set of password policies available through the Admin Console.
@ -12,15 +12,15 @@ When {project_name} creates a realm, it does not associate password policies wit
. Enter a value for the *Policy Value* corresponding with the policy chosen. . Enter a value for the *Policy Value* corresponding with the policy chosen.
. Click *Save*. . Click *Save*.
+ +
Password Policy Password policy
image:{project_images}/password-policy.png[Password Policy] image:{project_images}/password-policy.png[Password Policy]
After saving the policy, {project_name} enforces the policy for new users and sets an Update Password action for existing users to ensure they change their password the next time they log in. For example: After saving the policy, {project_name} enforces the policy for new users and sets an Update Password action for existing users to ensure they change their password the next time they log in. For example:
.Failed Password Policy .Failed password policy
image:{project_images}/failed-password-policy.png[Failed Password Policy] image:{project_images}/failed-password-policy.png[Failed Password Policy]
==== Password Policy Types ==== Password policy types
ifeval::[{project_community}==true] ifeval::[{project_community}==true]
@ -36,13 +36,13 @@ If you change the hashing algorithm, password hashes in storage will not change
endif::[] endif::[]
ifeval::[{project_product}==true] ifeval::[{project_product}==true]
===== Hashing Algorithm ===== Hashing algorithm
Passwords are not stored in clear text. Before storage or validation, {project_name} hashes passwords using standard hashing algorithms {project_name} that support the PBKDF2, PBKDF2-SHA256 and PBKDF-SHA512 hashing algorithms. Passwords are not stored in clear text. Before storage or validation, {project_name} hashes passwords using standard hashing algorithms {project_name} that support the PBKDF2, PBKDF2-SHA256 and PBKDF-SHA512 hashing algorithms.
endif::[] endif::[]
===== Hashing Iterations ===== Hashing iterations
Specifies the number of times {project_name} hashes passwords before storage or verification. The default value is 27,500. Specifies the number of times {project_name} hashes passwords before storage or verification. The default value is 27,500.
{project_name} hashes passwords to ensure that hostile actors with access to the password database cannot read passwords through reverse engineering. {project_name} hashes passwords to ensure that hostile actors with access to the password database cannot read passwords through reverse engineering.
@ -56,39 +56,39 @@ A high hashing iteration value can impact performance as it requires higher CPU
The number of numerical digits required in the password string. The number of numerical digits required in the password string.
===== Lowercase Characters ===== Lowercase characters
The number of lower case letters required in the password string. The number of lower case letters required in the password string.
===== Uppercase Characters ===== Uppercase characters
The number of upper case letters required in the password string. The number of upper case letters required in the password string.
===== Special Characters ===== Special characters
The number of special characters required in the password string. The number of special characters required in the password string.
===== Not Username ===== Not username
The password cannot be the same as the username. The password cannot be the same as the username.
===== Not Email ===== Not email
The password cannot be the same as the email address of the user. The password cannot be the same as the email address of the user.
===== Regular Expression ===== Regular expression
Password must match one or more defined regular expression patterns. Password must match one or more defined regular expression patterns.
===== Expire Password ===== Expire password
The number of days the password is valid. When the number of days has expired, the user must change their password. The number of days the password is valid. When the number of days has expired, the user must change their password.
===== Not Recently Used ===== Not recently used
Password cannot be already used by the user. {project_name} stores a history of used passwords. The number of old passwords stored is configurable in {project_name}. Password cannot be already used by the user. {project_name} stores a history of used passwords. The number of old passwords stored is configurable in {project_name}.
===== Password Blacklist ===== Password blacklist
Password must not be in a blacklist file. Password must not be in a blacklist file.
* Blacklist files are UTF-8 plain-text files with Unix line endings. Every line represents a blacklisted password. * Blacklist files are UTF-8 plain-text files with Unix line endings. Every line represents a blacklisted password.

View file

@ -2,7 +2,7 @@
=== W3C Web Authentication (WebAuthn) === W3C Web Authentication (WebAuthn)
{project_name} provides limited support for https://www.w3.org/TR/webauthn/[W3C Web Authentication (WebAuthn)]. {project_name} works as a WebAuthn's https://www.w3.org/TR/webauthn/#rp-operations[Relying Party (RP)]. {project_name} provides limited support for https://www.w3.org/TR/webauthn/[W3C Web Authentication (WebAuthn)]. {project_name} works as a WebAuthn's https://www.w3.org/TR/webauthn/#webauthn-relying-party[Relying Party (RP)].
ifeval::[{project_product}==true] ifeval::[{project_product}==true]
:tech_feature_name: WebAuthn :tech_feature_name: WebAuthn
@ -29,7 +29,7 @@ WebAuthn's operations success depends on the user's WebAuthn supporting authenti
The setup procedure of WebAuthn support for 2FA is the following : The setup procedure of WebAuthn support for 2FA is the following :
[[_webauthn-register]] [[_webauthn-register]]
===== Enable WebAuthn Authenticator Registration ===== Enable WebAuthn authenticator registration
. Click *Authentication* in the menu. . Click *Authentication* in the menu.
. Click the *Required Actions* tab. . Click the *Required Actions* tab.
@ -41,7 +41,7 @@ The setup procedure of WebAuthn support for 2FA is the following :
Mark the *Default Action* checkbox if you want all new users to be required to register their WebAuthn credentials. Mark the *Default Action* checkbox if you want all new users to be required to register their WebAuthn credentials.
[[_webauthn-authenticator-setup]] [[_webauthn-authenticator-setup]]
===== Adding WebAuthn Authentication to a Browser Flow ===== Adding WebAuthn authentication to a browser flow
. Click *Authentication* in the menu. . Click *Authentication* in the menu.
. Click the *Browser* flow. . Click the *Browser* flow.
@ -107,7 +107,7 @@ The user can choose between using WebAuthn and OTP for the second factor:
+ +
image:images/webauthn-browser-flow-conditional-with-OTP.png[] image:images/webauthn-browser-flow-conditional-with-OTP.png[]
==== Authenticate with WebAuthn Authenticator ==== Authenticate with WebAuthn authenticator
After registering a WebAuthn authenticator, the user carries out the following operations: After registering a WebAuthn authenticator, the user carries out the following operations:
@ -116,7 +116,7 @@ After registering a WebAuthn authenticator, the user carries out the following o
==== Managing WebAuthn as an administrator ==== Managing WebAuthn as an administrator
===== Managing Credentials ===== Managing credentials
{project_name} manages WebAuthn credentials similarly to other credentials from xref:ref-user-credentials_{context}[User credential management]: {project_name} manages WebAuthn credentials similarly to other credentials from xref:ref-user-credentials_{context}[User credential management]:
@ -126,7 +126,7 @@ After registering a WebAuthn authenticator, the user carries out the following o
* Administrators can set a label for the credential by setting a value in the *User Label* field and saving the data. * Administrators can set a label for the credential by setting a value in the *User Label* field and saving the data.
[[_webauthn-policy]] [[_webauthn-policy]]
===== Managing Policy ===== Managing policy
Administrators can configure WebAuthn related operations as *WebAuthn Policy* per realm. Administrators can configure WebAuthn related operations as *WebAuthn Policy* per realm.
@ -145,19 +145,19 @@ The configurable items and their description are as follows:
|The readable server name as a WebAuthn Relying Party. This item is mandatory and applies to the registration of the WebAuthn authenticator. The default setting is "keycloak". For more details, see https://www.w3.org/TR/webauthn/#dictionary-pkcredentialentity[WebAuthn Specification]. |The readable server name as a WebAuthn Relying Party. This item is mandatory and applies to the registration of the WebAuthn authenticator. The default setting is "keycloak". For more details, see https://www.w3.org/TR/webauthn/#dictionary-pkcredentialentity[WebAuthn Specification].
|Signature Algorithms |Signature Algorithms
|The algorithms telling the WebAuthn authenticator which signature algorithms to use for the https://www.w3.org/TR/webauthn/#public-key-credential[Public Key Credential]. {project_name} uses the Public Key Credential to sign and verify https://www.w3.org/TR/webauthn/#authentication-assertion[Authentication Assertions]. If no algorithms exist, the default https://tools.ietf.org/html/rfc8152#section-8.1[ES256] is adapted. ES256 is an optional configuration item applying to the registration of WebAuthn authenticators. For more details, see https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialparameters[WebAuthn Specification]. |The algorithms telling the WebAuthn authenticator which signature algorithms to use for the https://www.w3.org/TR/webauthn/#iface-pkcredential[Public Key Credential]. {project_name} uses the Public Key Credential to sign and verify https://www.w3.org/TR/webauthn/#authentication-assertion[Authentication Assertions]. If no algorithms exist, the default https://datatracker.ietf.org/doc/html/rfc8152#section-8.1[ES256] is adapted. ES256 is an optional configuration item applying to the registration of WebAuthn authenticators. For more details, see https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialparameters[WebAuthn Specification].
|Relying Party ID |Relying Party ID
|The ID of a WebAuthn Relying Party that determines the scope of https://www.w3.org/TR/webauthn/#public-key-credential[Public Key Credentials]. The ID must be the origin's effective domain. This ID is an optional configuration item applied to the registration of WebAuthn authenticators. If this entry is blank, {project_name} adapts the host part of {project_name}'s base URL. For more details, see https://www.w3.org/TR/webauthn/#rp-id[WebAuthn Specification]. |The ID of a WebAuthn Relying Party that determines the scope of https://www.w3.org/TR/webauthn/#public-key-credential[Public Key Credentials]. The ID must be the origin's effective domain. This ID is an optional configuration item applied to the registration of WebAuthn authenticators. If this entry is blank, {project_name} adapts the host part of {project_name}'s base URL. For more details, see https://www.w3.org/TR/webauthn/[WebAuthn Specification].
|Attestation Conveyance Preference |Attestation Conveyance Preference
|The WebAuthn API implementation on the browser (https://www.w3.org/TR/webauthn/#webauthn-client[WebAuthn Client]) is the preferential method to generate Attestation statements. This preference is an optional configuration item applying to the registration of the WebAuthn authenticator. If no option exists, its behavior is the same as selecting "none". For more details, see https://www.w3.org/TR/webauthn/#attestation-convey[WebAuthn Specification]. |The WebAuthn API implementation on the browser (https://www.w3.org/TR/webauthn/#webauthn-client[WebAuthn Client]) is the preferential method to generate Attestation statements. This preference is an optional configuration item applying to the registration of the WebAuthn authenticator. If no option exists, its behavior is the same as selecting "none". For more details, see https://www.w3.org/TR/webauthn/[WebAuthn Specification].
|Authenticator Attachment |Authenticator Attachment
|The acceptable attachment pattern of a WebAuthn authenticator for the WebAuthn Client. This pattern is an optional configuration item applying to the registration of the WebAuthn authenticator. For more details, see https://www.w3.org/TR/webauthn/#enumdef-authenticatorattachment[WebAuthn Specification]. |The acceptable attachment pattern of a WebAuthn authenticator for the WebAuthn Client. This pattern is an optional configuration item applying to the registration of the WebAuthn authenticator. For more details, see https://www.w3.org/TR/webauthn/#enumdef-authenticatorattachment[WebAuthn Specification].
|Require Resident Key |Require Resident Key
|The option requiring that the WebAuthn authenticator generates the Public Key Credential as https://www.w3.org/TR/webauthn/#client-side-resident-public-key-credential-source[Client-side-resident Public Key Credential Source]. This option applies to the registration of the WebAuthn authenticator. If left blank, its behavior is the same as selecting "No". For more details, see https://www.w3.org/TR/webauthn/#dom-authenticatorselectioncriteria-requireresidentkey[WebAuthn Specification]. |The option requiring that the WebAuthn authenticator generates the Public Key Credential as https://www.w3.org/TR/webauthn/[Client-side-resident Public Key Credential Source]. This option applies to the registration of the WebAuthn authenticator. If left blank, its behavior is the same as selecting "No". For more details, see https://www.w3.org/TR/webauthn/#dom-authenticatorselectioncriteria-requireresidentkey[WebAuthn Specification].
|User Verification Requirement |User Verification Requirement
|The option requiring that the WebAuthn authenticator confirms the verification of a user. This is an optional configuration item applying to the registration of a WebAuthn authenticator and the authentication of a user by a WebAuthn authenticator. If no option exists, its behavior is the same as selecting "preferred". For more details, see https://www.w3.org/TR/webauthn/#dom-authenticatorselectioncriteria-userverification[WebAuthn Specification for registering a WebAuthn authenticator] and https://www.w3.org/TR/webauthn/#dom-publickeycredentialrequestoptions-userverification[WebAuthn Specification for authenticating the user by a WebAuthn authenticator]. |The option requiring that the WebAuthn authenticator confirms the verification of a user. This is an optional configuration item applying to the registration of a WebAuthn authenticator and the authentication of a user by a WebAuthn authenticator. If no option exists, its behavior is the same as selecting "preferred". For more details, see https://www.w3.org/TR/webauthn/#dom-authenticatorselectioncriteria-userverification[WebAuthn Specification for registering a WebAuthn authenticator] and https://www.w3.org/TR/webauthn/#dom-publickeycredentialrequestoptions-userverification[WebAuthn Specification for authenticating the user by a WebAuthn authenticator].
@ -173,7 +173,7 @@ The configurable items and their description are as follows:
|=== |===
==== Attestation Statement Verification ==== Attestation statement verification
When registering a WebAuthn authenticator, {project_name} verifies the trustworthiness of the attestation statement generated by the WebAuthn authenticator. {project_name} requires the trust anchor's certificates for this. {project_name} uses the link:{installguide_truststore_link}[{installguide_truststore_name}], so you must import these certificates into it in advance. When registering a WebAuthn authenticator, {project_name} verifies the trustworthiness of the attestation statement generated by the WebAuthn authenticator. {project_name} requires the trust anchor's certificates for this. {project_name} uses the link:{installguide_truststore_link}[{installguide_truststore_name}], so you must import these certificates into it in advance.
@ -182,7 +182,7 @@ To omit this validation, disable this truststore or set the WebAuthn policy's co
==== Managing WebAuthn credentials as a user ==== Managing WebAuthn credentials as a user
===== Register WebAuthn Authenticator ===== Register WebAuthn authenticator
The appropriate method to register a WebAuthn authenticator depends on whether the user has already registered an account on {project_name}. The appropriate method to register a WebAuthn authenticator depends on whether the user has already registered an account on {project_name}.
@ -201,10 +201,10 @@ After successfully registering, the browser asks the user to enter the text of t
===== Existing user ===== Existing user
[[_webauthn_passwordless]] If `WebAuthn Authenticator` is set up as required as shown in the first example, then when existing users try to log in, they are required to register their WebAuthn authenticator automatically:
==== Passwordless WebAuthn together with Two-Factor
.Procedure .Procedure
. Open the login form. . Open the login form.
. Enter the items on the form. . Enter the items on the form.
. Click *Save*. . Click *Save*.
@ -212,6 +212,7 @@ After successfully registering, the browser asks the user to enter the text of t
After successful registration, the user's browser asks the user to enter the text of their WebAuthn authenticator's label. After successful registration, the user's browser asks the user to enter the text of their WebAuthn authenticator's label.
[[_webauthn_passwordless]]
==== Passwordless WebAuthn together with Two-Factor ==== Passwordless WebAuthn together with Two-Factor
{project_name} uses WebAuthn for two-factor authentication, but you can use WebAuthn as the first-factor authentication. In this case, users with `passwordless` WebAuthn credentials can authenticate to {project_name} without a password. {project_name} can use WebAuthn as both the passwordless and two-factor authentication mechanism in the context of a realm and a single authentication flow. {project_name} uses WebAuthn for two-factor authentication, but you can use WebAuthn as the first-factor authentication. In this case, users with `passwordless` WebAuthn credentials can authenticate to {project_name} without a password. {project_name} can use WebAuthn as both the passwordless and two-factor authentication mechanism in the context of a realm and a single authentication flow.

View file

@ -1,6 +1,6 @@
[[_x509]]
=== X.509 Client Certificate User Authentication [[_x509]]
=== X.509 client certificate user authentication
{project_name} supports logging in with an X.509 client certificate if you have configured the server to use mutual SSL authentication. {project_name} supports logging in with an X.509 client certificate if you have configured the server to use mutual SSL authentication.
@ -44,7 +44,7 @@ Supported Certificate Identity Sources:
* SHA-256 Certificate thumbprint * SHA-256 Certificate thumbprint
* Full certificate in PEM format * Full certificate in PEM format
===== Regular Expressions ===== Regular expressions
{project_name} extracts the certificate identity from Subject DN or Issuer DN by using a regular expression as a filter. For example, this regular expression matches the email attribute: {project_name} extracts the certificate identity from Subject DN or Issuer DN by using a regular expression as a filter. For example, this regular expression matches the email attribute:
``` ```
@ -65,21 +65,21 @@ The certificate identity mapping can map the extracted user identity to an exist
* Using `Full certificate in PEM format` as an identity source is limited to the custom attributes mapped to external federation sources, such as LDAP. {project_name} cannot store certificates in its database due to length limitations, so in the case of LDAP, you must enable `Always Read Value From LDAP`. * Using `Full certificate in PEM format` as an identity source is limited to the custom attributes mapped to external federation sources, such as LDAP. {project_name} cannot store certificates in its database due to length limitations, so in the case of LDAP, you must enable `Always Read Value From LDAP`.
==== ====
====== Extended Certificate Validation ====== Extended certificate validation
* Revocation status checking using CRL. * Revocation status checking using CRL.
* Revocation status checking using CRL/Distribution Point. * Revocation status checking using CRL/Distribution Point.
* Revocation status checking using OCSP/Responder URI. * Revocation status checking using OCSP/Responder URI.
* Certificate KeyUsage validation. * Certificate KeyUsage validation.
* Certificate ExtendedKeyUsage validation. * Certificate ExtendedKeyUsage validation.
==== Enable X.509 Client Certificate User Authentication ==== Enable X.509 client certificate user authentication
The following sections describe how to configure {appserver_name}/Undertow and the {project_name} Server to enable X.509 client certificate authentication. The following sections describe how to configure {appserver_name}/Undertow and the {project_name} Server to enable X.509 client certificate authentication.
[[_enable-mtls-wildfly]] [[_enable-mtls-wildfly]]
===== Enable mutual SSL in {appserver_name} ===== Enable mutual SSL in {appserver_name}
See link:https://docs.wildfly.org/19/Admin_Guide.html#enable-ssl[Enable SSL] for the instructions to enable SSL in {appserver_name}. See link:https://docs.wildfly.org/24/Admin_Guide.html#enable-ssl[Enable SSL] for the instructions to enable SSL in {appserver_name}.
* Open {project_dirref}/standalone/configuration/standalone.xml and add a new realm: * Open {project_dirref}/standalone/configuration/standalone.xml and add a new realm:
```xml ```xml
@ -134,9 +134,9 @@ The password to open the truststore.
===== Enable HTTPS listener ===== Enable HTTPS listener
See link:https://docs.wildfly.org/19/Admin_Guide.html#https-listener[HTTPS Listener] for the instructions to enable HTTPS in WildFly. See link:https://docs.wildfly.org/24/Admin_Guide.html#https-listener[HTTPS Listener] for the instructions to enable HTTPS in WildFly.
Add the <https-listener> element as shown below: * Add the <https-listener> element.
[source,xml,subs="attributes+"] [source,xml,subs="attributes+"]
---- ----
@ -159,7 +159,7 @@ If set to *REQUESTED*, the server optionally asks for a client certificate.
If set to *REQUIRED*, the server refuses inbound connections if no client certificate has been provided. If set to *REQUIRED*, the server refuses inbound connections if no client certificate has been provided.
[[_browser_flow]] [[_browser_flow]]
==== Adding X.509 Client Certificate Authentication to browser flows ==== Adding X.509 client certificate authentication to browser flows
. Click *Authentication* in the menu. . Click *Authentication* in the menu.
. Click the "Browser" flow. . Click the "Browser" flow.
@ -171,13 +171,13 @@ If set to *REQUIRED*, the server refuses inbound connections if no client certif
. Click "X509/Validate Username Form". . Click "X509/Validate Username Form".
. Click *Save*. . Click *Save*.
+ +
.X509 Execution .X509 execution
image:images/x509-execution.png[X509 Execution] image:images/x509-execution.png[X509 Execution]
+ +
. Click the up/down arrow buttons to move the "X509/Validate Username Form" over the "Browser Forms" execution. . Click the up/down arrow buttons to move the "X509/Validate Username Form" over the "Browser Forms" execution.
. Set the requirement to "ALTERNATIVE". . Set the requirement to "ALTERNATIVE".
+ +
.X509 Browser Flow .X509 browser flow
image:images/x509-browser-flow.png[X509 Browser Flow] image:images/x509-browser-flow.png[X509 Browser Flow]
+ +
. Click the *Bindings* tab. . Click the *Bindings* tab.
@ -185,56 +185,53 @@ image:images/x509-browser-flow.png[X509 Browser Flow]
. Click the copy of the browser flow from the drop-down list. . Click the copy of the browser flow from the drop-down list.
. Click *Save*. . Click *Save*.
+ +
.X509 Browser Flow Bindings .X509 browser flow bindings
image:images/x509-browser-flow-bindings.png[X509 Browser Flow Bindings] image:images/x509-browser-flow-bindings.png[X509 Browser Flow Bindings]
==== Configuring X.509 Client Certificate Authentication ==== Configuring X.509 client certificate authentication
.X509 Configuration .X509 configuration
image:images/x509-configuration.png[X509 Configuration] image:images/x509-configuration.png[X509 Configuration]
*User Identity Source*:: *User Identity Source*::
Defines the method for extracting the user identity from a client certificate. Defines the method for extracting the user identity from a client certificate.
*Canonical DN representation enabled (optional)*:: *Canonical DN representation enabled*::
Defines whether to use canonical format to determine a distinguished name. The official link:https://docs.oracle.com/javase/8/docs/api/javax/security/auth/x500/X500Principal.html#getName-java.lang.String-[Java API documentation] describes the format. This option affects the two User Identity Sources _Match SubjectDN using regular expression_ and _Match IssuerDN using regular expression_ only. Enable this option when you set up a new {project_name} instance. Disable this option to retain backward compatibility with existing {project_name} instances. Defines whether to use canonical format to determine a distinguished name. The official link:https://docs.oracle.com/javase/8/docs/api/javax/security/auth/x500/X500Principal.html#getName-java.lang.String-[Java API documentation] describes the format. This option affects the two User Identity Sources _Match SubjectDN using regular expression_ and _Match IssuerDN using regular expression_ only. Enable this option when you set up a new {project_name} instance. Disable this option to retain backward compatibility with existing {project_name} instances.
*Enable Serial Number hexadecimal representation (optional)*:: *Enable Serial Number hexadecimal representation*::
Represent the link:https://tools.ietf.org/html/rfc5280#section-4.1.2.2[serial number] as hexadecimal. The serial number with the sign bit set to 1 must be left padded with 00 octet. For example, a serial number with decimal value _161_, or _a1_ in hexadecimal representation is encoded as _00a1_, according to RFC5280. See link:https://tools.ietf.org/html/rfc5280#appendix-B[RFC5280, appendix-B] for more details. Represent the link:https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.2[serial number] as hexadecimal. The serial number with the sign bit set to 1 must be left padded with 00 octet. For example, a serial number with decimal value _161_, or _a1_ in hexadecimal representation is encoded as _00a1_, according to RFC5280. See link:https://datatracker.ietf.org/doc/html/rfc5280#appendix-B[RFC5280, appendix-B] for more details.
*A regular expression (optional)*:: *A regular expression*::
A regular expression to use as a filter for extracting the certificate identity. The expression must contain a single group. A regular expression to use as a filter for extracting the certificate identity. The expression must contain a single group.
*User Mapping Method*:: *User Mapping Method*::
Defines the method to match the certificate identity with an existing user. _Username or email_ searches for existing users by username or email. _Custom Attribute Mapper_ searches for existing users with a custom attribute that matches the certificate identity. The name of the custom attribute is configurable. Defines the method to match the certificate identity with an existing user. _Username or email_ searches for existing users by username or email. _Custom Attribute Mapper_ searches for existing users with a custom attribute that matches the certificate identity. The name of the custom attribute is configurable.
*A name of user attribute (optional)*:: *A name of user attribute*::
A custom attribute whose value matches against the certificate identity. Use multiple custom attributes when attribute mapping is related to multiple values, For example, 'Certificate Serial Number and IssuerDN'. A custom attribute whose value matches against the certificate identity. Use multiple custom attributes when attribute mapping is related to multiple values, For example, 'Certificate Serial Number and IssuerDN'.
WARNING: It is highly recommended that attribute used here is read-only for the users. By default, only the `usercertificate` attribute is read-only by {project_name}. *CRL Checking Enabled*::
If you use a different attribute name, you may need to add it to the list of read-only attributes. See the details in the link:#_read_only_user_attributes[Threat model mitigation chapter].
*CRL Checking Enabled (optional)*::
Check the revocation status of the certificate by using the Certificate Revocation List. The location of the list is defined in the *CRL file path* attribute. Check the revocation status of the certificate by using the Certificate Revocation List. The location of the list is defined in the *CRL file path* attribute.
*Enable CRL Distribution Point to check certificate revocation status (optional)*:: *Enable CRL Distribution Point to check certificate revocation status*::
Use CDP to check the certificate revocation status. Most PKI authorities include CDP in their certificates. Use CDP to check the certificate revocation status. Most PKI authorities include CDP in their certificates.
*CRL file path (optional)*:: *CRL file path*::
The path to a file containing a CRL list. The value must be a path to a valid file if the *CRL Checking Enabled* option is enabled. The path to a file containing a CRL list. The value must be a path to a valid file if the *CRL Checking Enabled* option is enabled.
*OCSP Checking Enabled (optional)*:: *OCSP Checking Enabled*::
Checks the certificate revocation status by using Online Certificate Status Protocol. Checks the certificate revocation status by using Online Certificate Status Protocol.
*OCSP Responder URI (optional)*:: *OCSP Responder URI*::
Override the value of the OCSP responder URI in the certificate. Override the value of the OCSP responder URI in the certificate.
*Validate Key Usage (optional)*:: *Validate Key Usage*::
Verifies the certificate's KeyUsage extension bits are set. For example, "digitalSignature,KeyEncipherment" verifies if bits 0 and 2 in the KeyUsage extension are set. Verifies the certificate's KeyUsage extension bits are set. For example, "digitalSignature,KeyEncipherment" verifies if bits 0 and 2 in the KeyUsage extension are set.
Leave this parameter empty to disable the Key Usage validation. See link:https://tools.ietf.org/html/rfc5280#section-4.2.1.3[RFC5280, Section-4.2.1.3] for more information. {project_name} raises an error when a key usage mismatch occurs. Leave this parameter empty to disable the Key Usage validation. See link:https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3[RFC5280, Section-4.2.1.3] for more information. {project_name} raises an error when a key usage mismatch occurs.
*Validate Extended Key Usage (optional)*:: *Validate Extended Key Usage*::
Verifies one or more purposes defined in the Extended Key Usage extension. See link:https://tools.ietf.org/html/rfc5280#section-4.2.1.12[RFC5280, Section-4.2.1.12] for more information. Leave this parameter empty to disable the Extended Key Usage validation. {project_name} raises an error when flagged as critical by the issuing CA and a key usage extension mismatch occurs. Verifies one or more purposes defined in the Extended Key Usage extension. See link:https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.12[RFC5280, Section-4.2.1.12] for more information. Leave this parameter empty to disable the Extended Key Usage validation. {project_name} raises an error when flagged as critical by the issuing CA and a key usage extension mismatch occurs.
*Bypass identity confirmation*:: *Bypass identity confirmation*::
If enabled, X.509 client certificate authentication does not prompt the user to confirm the certificate identity. {project_name} signs in the user upon successful authentication. If enabled, X.509 client certificate authentication does not prompt the user to confirm the certificate identity. {project_name} signs in the user upon successful authentication.
@ -257,7 +254,7 @@ If set, the client certificate trust chain will be always verified at the applic
. Click "X509/Validate Username". . Click "X509/Validate Username".
. Click *Save*. . Click *Save*.
+ +
.X509 Direct Grant Execution .X509 direct grant execution
image:images/x509-directgrant-execution.png[X509 Direct Grant Execution] image:images/x509-directgrant-execution.png[X509 Direct Grant Execution]
+ +
. Set up the x509 authentication configuration by following the steps described in the <<_browser_flow, x509 Browser Flow>> section. . Set up the x509 authentication configuration by following the steps described in the <<_browser_flow, x509 Browser Flow>> section.
@ -266,7 +263,7 @@ image:images/x509-directgrant-execution.png[X509 Direct Grant Execution]
. Click the newly created "x509 Direct Grant" flow. . Click the newly created "x509 Direct Grant" flow.
. Click *Save*. . Click *Save*.
+ +
.X509 Direct Grant Flow Bindings .X509 direct grant flow bindings
image:images/x509-directgrant-flow-bindings.png[X509 Direct Grant Flow Bindings] image:images/x509-directgrant-flow-bindings.png[X509 Direct Grant Flow Bindings]
==== Client certificate lookup ==== Client certificate lookup

View file

@ -1,6 +1,6 @@
[id="assembly-oidc-clients_{context}"] [[_oidc_clients]]
= OIDC Clients = OIDC clients
[role="_abstract"] [role="_abstract"]
xref:con-oidc_{context}[OpenID Connect] is the recommended protocol to secure applications. It was designed from the ground up to be web friendly and it works best with HTML5/JavaScript applications. xref:con-oidc_{context}[OpenID Connect] is the recommended protocol to secure applications. It was designed from the ground up to be web friendly and it works best with HTML5/JavaScript applications.

View file

@ -1,5 +1,6 @@
[[_client_policies]] [[_client_policies]]
=== Client Policies = Client Policies
To make it easy to secure client applications, it is beneficial to realize the following points in a unified way. To make it easy to secure client applications, it is beneficial to realize the following points in a unified way.
@ -9,7 +10,7 @@ To make it easy to secure client applications, it is beneficial to realize the f
To realize these points in a unified way, _Client Policies_ concept is introduced. To realize these points in a unified way, _Client Policies_ concept is introduced.
==== Use-cases == Use-cases
Client Policies realize the following points mentioned as follows. Client Policies realize the following points mentioned as follows.
@ -34,15 +35,15 @@ Conformance to a required security standards and profiles such as FAPI::
be compliant with the FAPI. The administrator can configure client profiles and client policies, so that {project_name} clients can be easily made compliant with various other be compliant with the FAPI. The administrator can configure client profiles and client policies, so that {project_name} clients can be easily made compliant with various other
security profiles like SPA, Native App, Open Banking and so on. security profiles like SPA, Native App, Open Banking and so on.
==== Protocol == Protocol
The client policy concept is independent of any specific protocol. However, {project_name} currently supports it only just for the link:{adapterguide_link}#_oidc[OpenID Connect (OIDC) protocol]. The client policy concept is independent of any specific protocol. However, {project_name} currently supports it only just for the link:{adapterguide_link}#_oidc[OpenID Connect (OIDC) protocol].
==== Architecture == Architecture
Client Policies consists of the four building blocks: Condition, Executor, Profile and Policy. Client Policies consists of the four building blocks: Condition, Executor, Profile and Policy.
===== Condition === Condition
A condition determines to which client a policy is adopted and when it is adopted. Some conditions are checked at the time of client create/update when some other conditions are A condition determines to which client a policy is adopted and when it is adopted. Some conditions are checked at the time of client create/update when some other conditions are
checked during client requests (OIDC Authorization request, Token endpoint request and so on). The condition checks whether one specified criteria is satisfied. For example, checked during client requests (OIDC Authorization request, Token endpoint request and so on). The condition checks whether one specified criteria is satisfied. For example,
@ -83,7 +84,7 @@ Client Domain Name, Host or IP Address::
Any Client:: Any Client::
This condition always evaluates to true. It can be used for example to ensure that all clients in the particular realm are FAPI compliant. This condition always evaluates to true. It can be used for example to ensure that all clients in the particular realm are FAPI compliant.
===== Executor === Executor
An executor specifies what action is executed on a client to which a policy is adopted. The executor executes one or several specified actions. For example, An executor specifies what action is executed on a client to which a policy is adopted. The executor executes one or several specified actions. For example,
some executor checks whether the value of the parameter `redirect_uri` in the authorization request matches exactly with one of the pre-registered redirect URIs on some executor checks whether the value of the parameter `redirect_uri` in the authorization request matches exactly with one of the pre-registered redirect URIs on
@ -123,20 +124,20 @@ One of several purposes for this executor is to realize the security requirement
* Enforce `binding_message` parameter is used for CIBA requests * Enforce `binding_message` parameter is used for CIBA requests
[[_client_policy_profile]] [[_client_policy_profile]]
===== Profile === Profile
A profile consists of several executors, which can realize a security profile like FAPI. Profile can be configured by the Admin REST API (Admin Console) together with its executors. A profile consists of several executors, which can realize a security profile like FAPI. Profile can be configured by the Admin REST API (Admin Console) together with its executors.
Three _global profiles_ exist and they are configured in {project_name} by default with pre-configured executors compliant with the FAPI Baseline, FAPI Advanced and FAPI CIBA specifications. Three _global profiles_ exist and they are configured in {project_name} by default with pre-configured executors compliant with the FAPI Baseline, FAPI Advanced and FAPI CIBA specifications.
More details exist in the FAPI section of the link:{adapterguide_link}#_fapi-support[{adapterguide_name}]. More details exist in the FAPI section of the link:{adapterguide_link}#_fapi-support[{adapterguide_name}].
[[_client_policy_policy]] [[_client_policy_policy]]
===== Policy === Policy
A policy consists of several conditions and profiles. The policy can be adopted to clients satisfying all conditions of this policy. The policy refers several profiles and all A policy consists of several conditions and profiles. The policy can be adopted to clients satisfying all conditions of this policy. The policy refers several profiles and all
executors of these profiles execute their task against the client that this policy is adopted to. executors of these profiles execute their task against the client that this policy is adopted to.
==== Configuration == Configuration
Policies, profiles, conditions, executors can be configured by Admin REST API, which means also the Admin Console. To do so, there is a tab _Realm_ -> _Realm Settings_ -> _Client Policies_ Policies, profiles, conditions, executors can be configured by Admin REST API, which means also the Admin Console. To do so, there is a tab _Realm_ -> _Realm Settings_ -> _Client Policies_
, which means the administrator can have client policies per realm. , which means the administrator can have client policies per realm.
@ -146,7 +147,7 @@ configured by default. This means that the administrator is always required to c
profiles cannot be updated, but the administrator can easily use them as a template and create their own profile if they want to do some slight changes in the global profile configurations. profiles cannot be updated, but the administrator can easily use them as a template and create their own profile if they want to do some slight changes in the global profile configurations.
There is JSON Editor available in the Admin Console, which simplifies the creation of new profile based on some global profile. There is JSON Editor available in the Admin Console, which simplifies the creation of new profile based on some global profile.
==== Backward Compatibility == Backward Compatibility
Client Policies can replace Client Registration Policies described in the link:{adapterguide_link}#_client_registration_policies[{adapterguide_name}]. Client Policies can replace Client Registration Policies described in the link:{adapterguide_link}#_client_registration_policies[{adapterguide_name}].
However, Client Registration Policies also still co-exist. This means that for example during a Dynamic Client Registration request to create/update a client, both client policies and However, Client Registration Policies also still co-exist. This means that for example during a Dynamic Client Registration request to create/update a client, both client policies and

View file

@ -1,6 +1,6 @@
[id="con-client-links_{context}"] [id="con-client-links_{context}"]
= Client Links = Client links
[role="_abstract"] [role="_abstract"]
To link from one client to another, {project_name} provides a redirect endpoint: `/realms/realm_name/clients/\{client-id}/redirect`. To link from one client to another, {project_name} provides a redirect endpoint: `/realms/realm_name/clients/\{client-id}/redirect`.

View file

@ -1,7 +1,7 @@
[id="con-client-scopes_{context}"] //[id="con-client-scopes_{context}"]//
[[_client_scopes]] [[_client_scopes]]
= Client Scopes = Client scopes
[role="_abstract"] [role="_abstract"]
Use {project_name} to define a shared client configuration in an entity called a _client scope_. A _client scope_ configures <<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>> for multiple clients. Use {project_name} to define a shared client configuration in an entity called a _client scope_. A _client scope_ configures <<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>> for multiple clients.
@ -10,6 +10,7 @@ Client scopes also support the OAuth 2 *scope* parameter. Client applications us
include::proc-creating-client-scopes.adoc[] include::proc-creating-client-scopes.adoc[]
== Protocol == Protocol
When you create a client scope, choose the *Protocol*. Clients linked in the same scope must have the same protocol. When you create a client scope, choose the *Protocol*. Clients linked in the same scope must have the same protocol.
@ -43,7 +44,7 @@ The client scopes *profile*, *email*, *address* and *phone* are defined in the h
For example, when you open the *phone* client scope and open the *Mappers* tab, you will see the protocol mappers which correspond to the claims defined in the specification for the scope *phone*. For example, when you open the *phone* client scope and open the *Mappers* tab, you will see the protocol mappers which correspond to the claims defined in the specification for the scope *phone*.
.Client Scope Mappers .Client scope mappers
image:{project_images}/client-scopes-phone.png[] image:{project_images}/client-scopes-phone.png[]
When the *phone* client scope is linked to a client, the client automatically inherits all the protocol mappers defined in the *phone* client scope. Access tokens issued for this client contain the phone number information about the user, assuming that the user has a defined phone number. When the *phone* client scope is linked to a client, the client automatically inherits all the protocol mappers defined in the *phone* client scope. Access tokens issued for this client contain the phone number information about the user, assuming that the user has a defined phone number.
@ -60,7 +61,7 @@ Consent Screen Text::
The text displayed on the consent screen when this client scope is added to a client when consent required defaults to the name of client scope. The value for this text can be customised by specifying a substitution variable with *${var-name}* strings. The customised value is configured within the property files in your theme. See the link:{developerguide_link}[{developerguide_name}] for more information on customisation. The text displayed on the consent screen when this client scope is added to a client when consent required defaults to the name of client scope. The value for this text can be customised by specifying a substitution variable with *${var-name}* strings. The customised value is configured within the property files in your theme. See the link:{developerguide_link}[{developerguide_name}] for more information on customisation.
[[_client_scopes_linking]] [[_client_scopes_linking]]
== Link Client Scope with the Client == Link client scope with the client
Linking between a client scope and a client is configured in the *Client Scopes* tab of the client. Two ways of linking between client scope and client are available. Linking between a client scope and a client is configured in the *Client Scopes* tab of the client. Two ways of linking between client scope and client are available.
Default Client Scopes:: Default Client Scopes::
@ -83,7 +84,7 @@ The scope parameter contains the string, with the scope values divided by spaces
== Evaluating Client Scopes == Evaluating Client Scopes
include::proc-evaluating-client-scopes.adoc[] include::proc-evaluating-client-scopes.adoc[]
== Client Scopes Permissions == Client scopes permissions
When issuing tokens to a user, the client scope applies only if the user is permitted to use it. When issuing tokens to a user, the client scope applies only if the user is permitted to use it.
@ -91,7 +92,7 @@ When a client scope does not have any role scope mappings defined, each user is
If a user is not permitted to use the client scope, no protocol mappers or role scope mappings will be used when generating tokens. The client scope will not appear in the _scope_ value in the token. If a user is not permitted to use the client scope, no protocol mappers or role scope mappings will be used when generating tokens. The client scope will not appear in the _scope_ value in the token.
== Realm Default Client Scopes == Realm default client scopes
include::proc-updating-default-scopes.adoc[] include::proc-updating-default-scopes.adoc[]
== Scopes explained == Scopes explained
@ -104,6 +105,7 @@ This is available under the *Scope* tab of a client or client scope. Use *Role s
ifeval::[{project_community}==true] ifeval::[{project_community}==true]
Authorization scopes:: Authorization scopes::
The *Authorization Scope* covers the actions that can be perfoemdd in the application. See the link:{authorizationguide_link}[Authorization Services Guide] for more details. The *Authorization Scope* covers the actions that can be performed in the application. See the link:{authorizationguide_link}[Authorization Services Guide] for more details.
endif::[] endif::[]

View file

@ -1,7 +1,7 @@
[id="con-protocol-mappers_{context}"] [id="con-protocol-mappers_{context}"]
[[_protocol-mappers]] [[_protocol-mappers]]
= OIDC Token and SAML Assertion Mappings = OIDC token and SAML assertion mappings
[role="_abstract"] [role="_abstract"]
Applications receiving ID tokens, access tokens, or SAML assertions may require different roles and user metadata. Applications receiving ID tokens, access tokens, or SAML assertions may require different roles and user metadata.
@ -14,7 +14,7 @@ You can use {project_name} to:
You perform these actions in the *Mappers* tab in the Admin Console. You perform these actions in the *Mappers* tab in the Admin Console.
.Mappers Tab .Mappers tab
image:{project_images}/mappers-oidc.png[] image:{project_images}/mappers-oidc.png[]
New clients do not have built-in mappers but they can inherit some mappers from client scopes. See the <<_client_scopes, client scopes section>> for more details. New clients do not have built-in mappers but they can inherit some mappers from client scopes. See the <<_client_scopes, client scopes section>> for more details.
@ -24,7 +24,7 @@ a specific claim in the identity and access token. The function of a mapper shou
Each mapper has a set of common settings. Additional settings are available, depending on the mapper type. Click *Edit* next to a mapper to access the configuration screen to adjust these settings. Each mapper has a set of common settings. Additional settings are available, depending on the mapper type. Click *Edit* next to a mapper to access the configuration screen to adjust these settings.
.Mapper Config .Mapper config
image:{project_images}/mapper-config.png[] image:{project_images}/mapper-config.png[]
Details on each option can be viewed by hovering over its tooltip. Details on each option can be viewed by hovering over its tooltip.
@ -45,7 +45,7 @@ For example, to compute the roles which will be included with a token:
. Process a JavaScript script that uses the roles and audiences already available in the token. . Process a JavaScript script that uses the roles and audiences already available in the token.
[[_protocol-mappers_oidc-user-session-note-mappers]] [[_protocol-mappers_oidc-user-session-note-mappers]]
== OIDC User Session Note Mappers == OIDC user session note mappers
User session details are defined using mappers and are automatically included when you use or enable a feature on a client. Click *Add builtin* to include session details. User session details are defined using mappers and are automatically included when you use or enable a feature on a client. Click *Add builtin* to include session details.
@ -60,7 +60,7 @@ Service account sessions provide the following details:
* *clientAddress*: The remote host IP of the service account's authenticated device. * *clientAddress*: The remote host IP of the service account's authenticated device.
* *clientHost*: The remote host name of the service account's authenticated device. * *clientHost*: The remote host name of the service account's authenticated device.
== Script Mapper == Script mapper
Use the *Script Mapper* to map claims to tokens by running user-defined JavaScript code. For more details about deploying scripts to the server, see link:{developerguide_jsproviders_link}[{developerguide_jsproviders_name}]. Use the *Script Mapper* to map claims to tokens by running user-defined JavaScript code. For more details about deploying scripts to the server, see link:{developerguide_jsproviders_link}[{developerguide_jsproviders_name}].

View file

@ -1,5 +1,5 @@
[id="con-advanced-settings_{context}"] [id="con-advanced-settings_{context}"]
= Advanced Settings = Advanced settings
[role="_abstract"] [role="_abstract"]
When you click _Advanced Settings_, additional fields are displayed. When you click _Advanced Settings_, additional fields are displayed.
@ -30,7 +30,7 @@ In the following cases, {project_name} will verify the client sending the access
* A UserInfo request is sent to UserInfo endpoint with a holder-of-key access token. * A UserInfo request is sent to UserInfo endpoint with a holder-of-key access token.
* A logout request is sent to Logout endpoint with a holder-of-key refresh token. * A logout request is sent to Logout endpoint with a holder-of-key refresh token.
See https://tools.ietf.org/html/draft-ietf-oauth-mtls-08#section-3[Mutual TLS Client Certificate Bound Access Tokens] in the OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens for more details. See https://datatracker.ietf.org/doc/html/draft-ietf-oauth-mtls-08#section-3[Mutual TLS Client Certificate Bound Access Tokens] in the OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens for more details.
[NOTE] [NOTE]
==== ====
@ -48,12 +48,12 @@ An administrator can select one of these options:
*S256*:: {project_name} applies to the client PKCE whose code challenge method is S256. *S256*:: {project_name} applies to the client PKCE whose code challenge method is S256.
*plain*:: {project_name} applies to the client PKCE whose code challenge method is plain. *plain*:: {project_name} applies to the client PKCE whose code challenge method is plain.
See https://tools.ietf.org/html/rfc7636[RFC 7636 Proof Key for Code Exchange by OAuth Public Clients] for more details. See https://datatracker.ietf.org/doc/html/rfc7636[RFC 7636 Proof Key for Code Exchange by OAuth Public Clients] for more details.
[[_jwe-id-token-encryption]] [[_jwe-id-token-encryption]]
*Signed and Encrypted ID Token Support* *Signed and Encrypted ID Token Support*
{project_name} can encrypt ID tokens according to the https://tools.ietf.org/html/rfc7516[Json Web Encryption (JWE)] specification. The administrator determines if ID tokens are encrypted for each client. {project_name} can encrypt ID tokens according to the https://datatracker.ietf.org/doc/html/rfc7516[Json Web Encryption (JWE)] specification. The administrator determines if ID tokens are encrypted for each client.
The key used for encrypting the ID token is the Content Encryption Key (CEK). {project_name} and a client must negotiate which CEK is used and how it is delivered. The method used to determine the CEK is the Key Management Mode. The Key Management Mode that {project_name} supports is Key Encryption. The key used for encrypting the ID token is the Content Encryption Key (CEK). {project_name} and a client must negotiate which CEK is used and how it is delivered. The method used to determine the CEK is the Key Management Mode. The Key Management Mode that {project_name} supports is Key Encryption.
@ -69,7 +69,7 @@ In Key Encryption:
No party, other than the client, can decrypt the ID token. No party, other than the client, can decrypt the ID token.
The client must pass its public key for encrypting CEK to {project_name}. {project_name} supports downloading public keys from a URL provided by the client. The client must provide public keys according to the https://tools.ietf.org/html/rfc7517[Json Web Keys (JWK)] specification. The client must pass its public key for encrypting CEK to {project_name}. {project_name} supports downloading public keys from a URL provided by the client. The client must provide public keys according to the https://datatracker.ietf.org/doc/html/rfc7517[Json Web Keys (JWK)] specification.
The procedure is: The procedure is:
@ -77,7 +77,7 @@ The procedure is:
. Toggle *JWKS URL* to ON. . Toggle *JWKS URL* to ON.
. Input the client's public key URL in the *JWKS URL* textbox. . Input the client's public key URL in the *JWKS URL* textbox.
Key Encryption's algorithms are defined in the https://tools.ietf.org/html/rfc7518#section-4.1[Json Web Algorithm (JWA)] specification. {project_name} supports: Key Encryption's algorithms are defined in the https://datatracker.ietf.org/doc/html/rfc7518#section-4.1[Json Web Algorithm (JWA)] specification. {project_name} supports:
* RSAES-PKCS1-v1_5(RSA1_5) * RSAES-PKCS1-v1_5(RSA1_5)
* RSAES OAEP using default parameters (RSA-OAEP) * RSAES OAEP using default parameters (RSA-OAEP)

View file

@ -1,10 +1,9 @@
[[audience-support]]
[id="con-audience_{context}"] = Audience support
= Audience Support
[role="_abstract"] [role="_abstract"]
Typically, the environment where {project_name} is deployed consists of a set of _confidential_ or _public_ client applications that use {project_name} for authentication. Typically, the environment where {project_name} is deployed consists of a set of _confidential_ or _public_ client applications that use {project_name} for authentication.
_Services_ (_Resource Servers_ in the https://tools.ietf.org/html/draft-ietf-oauth-mtls-08#section-4.2[OAuth 2 specification]) are also available that serve requests from client applications and provide resources to these applications. These services require an _Access token_ (Bearer token) to be sent to them to authenticate a request. This token is obtained by the frontend application upon login to {project_name}. _Services_ (_Resource Servers_ in the https://datatracker.ietf.org/doc/html/draft-ietf-oauth-mtls-08#section-4.2[OAuth 2 specification]) are also available that serve requests from client applications and provide resources to these applications. These services require an _Access token_ (Bearer token) to be sent to them to authenticate a request. This token is obtained by the frontend application upon login to {project_name}.
In the environment where trust among services is low, you may encounter this scenario: In the environment where trust among services is low, you may encounter this scenario:
@ -50,9 +49,9 @@ Use this value to invoke the *<trusted service>*.
When setting up audience checking: When setting up audience checking:
* Ensure that services are configured to check audience on the access token sent to them by adding the flag *_verify-token-audience_* in the adapter configuration. See link:{adapterguide_link}#_java_adapter_config[Adapter configuration] for details. * Ensure that services are configured to check audience on the access token sent to them by adding the flag *_verify-token-audience_* in the adapter configuration. See link:{adapterguide_link_latest}#_java_adapter_config[Adapter configuration] for details.
* Ensure that access tokens issued by {project_name} contain all necessary audiences. Audiences can be added using the client roles as described in the <<_audience_resolve, next section>> or hardcoded as described in <<_audience_hardcoded, below>>. * Ensure that access tokens issued by {project_name} contain all necessary audiences. Audiences can be added using the client roles as described in the <<_audience_resolve, next section>> or hardcoded. See <<_audience_hardcoded, Hardcoded audience>>.
[[_audience_resolve]] [[_audience_resolve]]
== Automatically add audience == Automatically add audience
@ -93,14 +92,14 @@ You can add the protocol mapper directly to the frontend client. If the protocol
For more control over the protocol mapper, you can create the protocol mapper on the dedicated client scope, which will be called for example *good-service*. For more control over the protocol mapper, you can create the protocol mapper on the dedicated client scope, which will be called for example *good-service*.
.Audience Protocol Mapper .Audience protocol mapper
image:{project_images}/audience_mapper.png[] image:{project_images}/audience_mapper.png[]
* From the <<_client_installation, Installation tab>> of the *good-service* client, you can generate the adapter configuration and you can confirm that _verify-token-audience_ option will be set to *true*. This forces the adapter to verify the audience if you use this configuration. * From the <<_client_installation, Installation tab>> of the *good-service* client, you can generate the adapter configuration and you can confirm that _verify-token-audience_ option will be set to *true*. This forces the adapter to verify the audience if you use this configuration.
* You need to ensure that the *my-app* frontend client is able to request *good-service* as an audience in its tokens. * You need to ensure that the confidential client is able to request *good-service* as an audience in its tokens.
+ +
On the *my-app* client: On the confidential client:
+ +
. Click the _Client Scopes_ tab. . Click the _Client Scopes_ tab.
. Assign *good-service* as an optional (or default) client scope. . Assign *good-service* as an optional (or default) client scope.
@ -109,7 +108,7 @@ See <<_client_scopes_linking, Client Scopes Linking section>> for more details.
* You can optionally <<_client_scopes_evaluate, Evaluate Client Scopes>> and generate an example access token. *good-service* will be added to the audience of the generated access token if *good-service* is included in the _scope_ parameter, when you assigned it as an optional client scope. * You can optionally <<_client_scopes_evaluate, Evaluate Client Scopes>> and generate an example access token. *good-service* will be added to the audience of the generated access token if *good-service* is included in the _scope_ parameter, when you assigned it as an optional client scope.
* In your *my-app* application, ensure that the _scope_ parameter is used. The value *good-service* must be included when you want to issue the token for accessing *good-service*. * In your confidential client application, ensure that the _scope_ parameter is used. The value *good-service* must be included when you want to issue the token for accessing *good-service*.
+ +
See: See:
+ +

View file

@ -1,5 +1,5 @@
[id="con-basic-settings_{context}"] [id="con-basic-settings_{context}"]
= Basic Settings = Basic settings
[role="_abstract"] [role="_abstract"]
When you create an OIDC client, you see the following fields on the *Settings* tab. When you create an OIDC client, you see the following fields on the *Settings* tab.
@ -33,11 +33,12 @@ _Bearer-only_::
*Direct Access Grants Enabled*:: When enabled, clients can use the OIDC xref:_oidc-auth-flows-direct[Direct Access Grants]. *Direct Access Grants Enabled*:: When enabled, clients can use the OIDC xref:_oidc-auth-flows-direct[Direct Access Grants].
*OAuth 2.0 Device Authorization Grant Enabled* *OAuth 2.0 Device Authorization Grant Enabled*:: If this is on, clients are allowed to use the OIDC xref:con-oidc-auth-flows_server_administration_guide[Device Authorization Grant].
If this is on, clients are allowed to use the OIDC xref:con-oidc-auth-flows_server_administration_guide[Device Authorization Grant]. *OpenID Connect Client Initiated Backchannel Authentication Grant Enabled*::
If this is on, clients are allowed to use the OIDC xref:con-oidc-auth-flows_{context}[Client Initiated Backchannel Authentication Grant].
*Root URL*:: This value adds a prefix to any configured URLS that {project_name} uses. *Root URL*:: If {project_name} uses any configured relative URLs, this value is prepended to them.
*Valid Redirect URIs*:: Required field. Enter a URL pattern and click *+* to add and *-* to remove existing URLs and click *Save*. You can use wildcards at the end of the URL pattern. For example $$http://host.com/*$$ *Valid Redirect URIs*:: Required field. Enter a URL pattern and click *+* to add and *-* to remove existing URLs and click *Save*. You can use wildcards at the end of the URL pattern. For example $$http://host.com/*$$
+ +

View file

@ -1,11 +1,11 @@
[id="con-confidential-client-credentials_{context}"] [id="con-confidential-client-credentials_{context}"]
[[_client-credentials]] [[_client-credentials]]
= Confidential Client Credentials = Confidential client credentials
[role="_abstract"] [role="_abstract"]
If the <<_access-type, access type>> of the client is set to *confidential*, the credentials of the client must be configured under the *Credentials* tab. If the <<_access-type, access type>> of the client is set to *confidential*, the credentials of the client must be configured under the *Credentials* tab.
.Credentials Tab .Credentials tab
image:{project_images}/client-credentials.png[Credentials Tab] image:{project_images}/client-credentials.png[Credentials Tab]
The *Client Authenticator* drop-down list specifies the type of credential to use for your client. The *Client Authenticator* drop-down list specifies the type of credential to use for your client.
@ -19,10 +19,14 @@ image:{project_images}/client-credentials-jwt.png[]
*Signed JWT* is "Signed Json Web Token". *Signed JWT* is "Signed Json Web Token".
When choosing this credential type you will have to also generate a private key and certificate for the client in the *Keys* tab. The private key will be used to sign the JWT, while the certificate is used by the server to verify the signature. When choosing this credential type you will have to also generate a private key and certificate for the client in the tab `Keys`. The private key will be used to sign the JWT, while the certificate is used by the server to verify the signature.
Click *Generate new keys and certificate* to start this process.
.Generate Keys .Keys tab
image:images/client-oidc-keys.png[]
Click on the `Generate new keys and certificate` button to start this process.
.Generate keys
image:{project_images}/generate-client-keys.png[] image:{project_images}/generate-client-keys.png[]
. Select the archive format you want to use. . Select the archive format you want to use.
@ -34,7 +38,7 @@ When you generate the keys, {project_name} will store the certificate and you do
You can also generate keys using an external tool and then import the client's certificate by clicking *Import Certificate*. You can also generate keys using an external tool and then import the client's certificate by clicking *Import Certificate*.
.Import Certificate .Import certificate
image:{project_images}/import-client-cert.png[Import Certificate] image:{project_images}/import-client-cert.png[Import Certificate]
. Select the archive format of the certificate. . Select the archive format of the certificate.
@ -67,7 +71,7 @@ The client secret will be used to sign the JWT by the client.
NOTE: This option requires mutual TLS in {project_name}. See <<_enable-mtls-wildfly, Enable mutual SSL in WildFly>>. NOTE: This option requires mutual TLS in {project_name}. See <<_enable-mtls-wildfly, Enable mutual SSL in WildFly>>.
.X509 Certificate .X509 certificate
image:{project_images}/x509-client-auth.png[] image:{project_images}/x509-client-auth.png[]
The validator also checks the Subject DN field of the certificate with a configured regexp validation expression. For some The validator also checks the Subject DN field of the certificate with a configured regexp validation expression. For some
@ -75,5 +79,5 @@ use cases, it is sufficient to accept all certificates. In that case, you can us
Two ways exist for {project_name} to obtain the Client ID from the request: Two ways exist for {project_name} to obtain the Client ID from the request:
* The `client_id` parameter in the query (described in Section 2.2 of the https://tools.ietf.org/html/rfc6749[OAuth 2.0 Specification]). * The `client_id` parameter in the query (described in Section 2.2 of the https://datatracker.ietf.org/doc/html/rfc6749[OAuth 2.0 Specification]).
* Supply `client_id` as a form parameter. * Supply `client_id` as a form parameter.

View file

@ -8,7 +8,7 @@ To protect an application that uses the OpenID connect protocol, you create a cl
. Click *Create* to go to the *Add Client* page. . Click *Create* to go to the *Add Client* page.
+ +
.Add Client .Add client
image:{project_images}/add-client-oidc.png[Add Client] image:{project_images}/add-client-oidc.png[Add Client]
. Enter any name for *Client ID.* . Enter any name for *Client ID.*
@ -39,11 +39,10 @@ ifdef::standalone[]
This action creates the client and bring you to the *Settings* This action creates the client and bring you to the *Settings*
tab. tab.
.Client Settings .Client settings
image:{project_images}/client-settings-oidc.png[Client Settings] image:{project_images}/client-settings-oidc.png[Client Settings]
[role="_additional-resources"] [role="_additional-resources"]
.Additional resources .Additional resources
* For more information about fields on the *Settings* tab, see xref:con-basic-settings_{context}[Basic Settings].
* For more information about the OIDC protocol, see xref:con-oidc_{context}[OpenID Connect]. * For more information about the OIDC protocol, see xref:con-oidc_{context}[OpenID Connect].
endif::[] endif::[]

View file

@ -1,7 +1,7 @@
[id="proc-using-service-account_{context}"] [id="proc-using-service-account_{context}"]
[[_service_accounts]] [[_service_accounts]]
= Using a Service Account = Using a service account
[role="_abstract"] [role="_abstract"]
Each OIDC client has a built-in _service account_. Use this _service account_ to obtain an access token. Each OIDC client has a built-in _service account_. Use this _service account_ to obtain an access token.
@ -43,7 +43,7 @@ For example, the POST invocation to retrieve a service account can look like thi
grant_type=client_credentials grant_type=client_credentials
---- ----
The response would be similar to this https://tools.ietf.org/html/rfc6749#section-4.4.3[Access Token Response] from the OAuth 2.0 specification. The response would be similar to this https://datatracker.ietf.org/doc/html/rfc6749#section-4.4.3[Access Token Response] from the OAuth 2.0 specification.
[source] [source]
---- ----

View file

@ -5,7 +5,7 @@ To create a client scope, follow these steps:
. Click *Client Scopes* in the menu. . Click *Client Scopes* in the menu.
+ +
.Client Scopes List .Client scopes list
image:{project_images}/client-scopes-list.png[] image:{project_images}/client-scopes-list.png[]
+ +
. Click *Create*. . Click *Create*.
@ -14,3 +14,4 @@ image:{project_images}/client-scopes-list.png[]
A _client scope_ has similar tabs to regular clients. You can A _client scope_ has similar tabs to regular clients. You can
define <<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>>. These mappings can be inherited by other clients and are configured to inherit from this client scope. define <<_protocol-mappers, protocol mappers>> and <<_role_scope_mappings, role scope mappings>>. These mappings can be inherited by other clients and are configured to inherit from this client scope.

View file

@ -7,7 +7,7 @@ You can add mapper types as follows:
. Go to the *Mappers* tab. . Go to the *Mappers* tab.
. Click *Create*. . Click *Create*.
+ +
.Add Mapper .Add mapper
image:{project_images}/add-mapper.png[] image:{project_images}/add-mapper.png[]
+ +
. Select a *Mapper Type* from the list box. . Select a *Mapper Type* from the list box.

View file

@ -10,12 +10,12 @@ The *Mappers* tab contains the protocol mappers and the *Scope* tab contains the
This will also show you the value of the *scope* parameter. This parameter needs to be sent from the application to the {project_name} OpenID Connect authorization endpoint. This will also show you the value of the *scope* parameter. This parameter needs to be sent from the application to the {project_name} OpenID Connect authorization endpoint.
.Evaluating Client Scopes .Evaluating client scopes
image:{project_images}/client-scopes-evaluate.png[] image:{project_images}/client-scopes-evaluate.png[]
[NOTE] [NOTE]
==== ====
To send a custom value for a *scope* parameter from your application, see the link:{adapterguide_link}#_params_forwarding[parameters forwarding section], for servlet adapters or the link:{adapterguide_link}#_javascript_adapter[javascript adapter section], for javascript adapters. To send a custom value for a *scope* parameter from your application, see the link:{adapterguide_link_latest}#_params_forwarding[parameters forwarding section], for servlet adapters or the link:{adapterguide_link_latest}#_javascript_adapter[javascript adapter section], for javascript adapters.
==== ====
An example of a generated access token, specific to the user, client and *scope* parameter, is automatically generated under the *Generated Access Token* tab. All examples are generated for the particular user and issued for the particular client, with the specified value of the *scope* parameter. The examples include all of the claims and role mappings used.

View file

@ -2,7 +2,7 @@
[[_client_installation]] [[_client_installation]]
= Generating Client Adapter Config = Generating client adapter config
[role="_abstract"] [role="_abstract"]
{project_name} can generate configuration files that you can use to install a client adapter in your application's deployment environment. A number of adapter types are supported for OIDC and SAML. {project_name} can generate configuration files that you can use to install a client adapter in your application's deployment environment. A number of adapter types are supported for OIDC and SAML.

View file

@ -9,7 +9,7 @@ Use *Realm Default Client Scopes* to define sets of client scopes that are autom
From here, select the client scopes that you want to add as *Default Client Scopes* to newly created clients and *Optional Client Scopes*. From here, select the client scopes that you want to add as *Default Client Scopes* to newly created clients and *Optional Client Scopes*.
.Default Client Scopes .Default client scopes
image:{project_images}/client-scopes-default.png[] image:{project_images}/client-scopes-default.png[]
When a client is created, you can unlink the default client scopes, if needed. This is similar to removing <<_default_roles, Default Roles>>. When a client is created, you can unlink the default client scopes, if needed. This is similar to removing <<_default_roles, Default Roles>>.

View file

@ -1,5 +1,5 @@
= IDP Initiated Login = IDP Initiated login
[role="_abstract"] [role="_abstract"]
IDP Initiated Login is a feature that allows you to set up an endpoint on the {project_name} server that will log you into a specific application/client. IDP Initiated Login is a feature that allows you to set up an endpoint on the {project_name} server that will log you into a specific application/client.
In the *Settings* tab for your client, you need to specify the *IDP Initiated SSO URL Name*. In the *Settings* tab for your client, you need to specify the *IDP Initiated SSO URL Name*.

View file

@ -1,6 +1,6 @@
[id="proc-creating-saml-client_{context}"]
= Creating a SAML Client [[_client-saml-configuration]]
= Creating a SAML client
[role="_abstract"] [role="_abstract"]
{project_name} supports <<_saml,SAML 2.0>> for registered applications. {project_name} supports <<_saml,SAML 2.0>> for registered applications.
POST and Redirect bindings are supported. You can choose to require client signature validation. You can have the server sign and/or encrypt responses as well. POST and Redirect bindings are supported. You can choose to require client signature validation. You can have the server sign and/or encrypt responses as well.
@ -10,7 +10,7 @@ POST and Redirect bindings are supported. You can choose to require client signa
. Click *Create* to go to the *Add Client* page. . Click *Create* to go to the *Add Client* page.
+ +
.Add Client .Add client
image:{project_images}/add-client-saml.png[] image:{project_images}/add-client-saml.png[]
. Enter the *Client ID* of the client. This is often a URL and is the expected *issuer* value in SAML requests sent by the application. . Enter the *Client ID* of the client. This is often a URL and is the expected *issuer* value in SAML requests sent by the application.
@ -21,7 +21,7 @@ image:{project_images}/add-client-saml.png[]
. Click *Save*. This action creates the client and brings you to the *Settings* tab. . Click *Save*. This action creates the client and brings you to the *Settings* tab.
+ +
.Client Settings .Client settings
image:{project_images}/client-settings-saml.png[] image:{project_images}/client-settings-saml.png[]
+ +
The following list describes each setting: The following list describes each setting:
@ -55,9 +55,9 @@ This option is used when {project_name} server and adapter provide the IDP and S
*SAML Signature Key Name*:: Signed SAML documents sent using POST binding contain the identification of the signing key in the *KeyName* element. This action can be controlled by the *SAML Signature Key Name* option. This option controls the contents of the *Keyname*. *SAML Signature Key Name*:: Signed SAML documents sent using POST binding contain the identification of the signing key in the *KeyName* element. This action can be controlled by the *SAML Signature Key Name* option. This option controls the contents of the *Keyname*.
+ +
-- --
* _KEY_ID_:: The *KeyName* contains the key ID. This option is the default option. * *KEY_ID* The *KeyName* contains the key ID. This option is the default option.
* _CERT_SUBJECT_:: The *KeyName* contains the subject from the certificate corresponding to the realm key. This option is expected by Microsoft Active Directory Federation Services. * *CERT_SUBJECT* The *KeyName* contains the subject from the certificate corresponding to the realm key. This option is expected by Microsoft Active Directory Federation Services.
* _NONE_:: The *KeyName* hint is completely omitted from the SAML message. * *NONE* The *KeyName* hint is completely omitted from the SAML message.
-- --
+ +
*Canonicalization Method*:: The canonicalization method for XML signatures. *Canonicalization Method*:: The canonicalization method for XML signatures.
@ -93,3 +93,9 @@ If login requests contain the Assertion Consumer Service URL then those login re
*Logout Service POST Binding URL*:: POST Binding URL for the Logout Service. *Logout Service POST Binding URL*:: POST Binding URL for the Logout Service.
*Logout Service Redirect Binding URL*:: Redirect Binding URL for the Logout Service. *Logout Service Redirect Binding URL*:: Redirect Binding URL for the Logout Service.
*Logout Service Artifact Binding URL*:: _Artifact_ Binding URL for the Logout Service. When set together with the `Force Artifact Binding` option, _Artifact_ binding is forced for both login and logout flows. _Artifact_ binding is not used for logout unless this property is set.
*Artifact Binding URL*:: URL to send the HTTP artifact messages to.
*Artifact Resolution Service*:: URL of the client SOAP endpoint where to send the `ArtifactResolve` messages to.

View file

@ -6,7 +6,7 @@ Instead of registering a SAML 2.0 client manually, you can import the client usi
The Add Client page includes an *Import* option. The Add Client page includes an *Import* option.
.Add Client .Add client
image:{project_images}/add-client-saml.png[] image:{project_images}/add-client-saml.png[]
.Procedure .Procedure

View file

@ -1,5 +1,5 @@
=== Admin Events === Admin events
You can record all actions that are performed by an administrator in the Admin Console. The Admin Console performs administrative actions by invoking the {project_name} REST interface and {project_name} audits these REST invocations. You can view the resulting events in the Admin Console. You can record all actions that are performed by an administrator in the Admin Console. The Admin Console performs administrative actions by invoking the {project_name} REST interface and {project_name} audits these REST invocations. You can view the resulting events in the Admin Console.
@ -9,12 +9,12 @@ To enable auditing of Admin actions:
. Click *Events* in the menu. . Click *Events* in the menu.
. Click the *Config* tab. . Click the *Config* tab.
+ +
.Event Configuration .Event configuration
image:{project_images}/login-events-config.png[Event Configuration] image:{project_images}/login-events-config.png[Event Configuration]
+ +
. Toggle *Save Events* to *ON* in the *Admin Events Settings* section. {project_name} displays the *Include Representation* switch. . Toggle *Save Events* to *ON* in the *Admin Events Settings* section. {project_name} displays the *Include Representation* switch.
+ +
.Admin Event Configuration .Admin event configuration
image:{project_images}/admin-events-settings.png[Admin Event Configuration] image:{project_images}/admin-events-settings.png[Admin Event Configuration]
+ +
. Toggle *Include Representation* to *ON*. . Toggle *Include Representation* to *ON*.
@ -23,15 +23,15 @@ The `Include Representation` switch includes JSON documents sent through the adm
To view the admin events, click the *Admin Events* tab. To view the admin events, click the *Admin Events* tab.
.Admin Events .Admin events
image:{project_images}/admin-events.png[Admin Events] image:{project_images}/admin-events.png[Admin Events]
If the `Details` column has a *Representation* button, click the *Representation* button to view the JSON {project_name} sent with the operation. If the `Details` column has a *Representation* button, click the *Representation* button to view the JSON {project_name} sent with the operation.
.Admin Representation .Admin representation
image:{project_images}/admin-events-representation.png[Admin Representation] image:{project_images}/admin-events-representation.png[Admin Representation]
Click `Filter` to view specific events. Click `Filter` to view specific events.
.Admin Event Filter .Admin event filter
image:{project_images}/admin-events-filter.png[Admin Event Filter] image:{project_images}/admin-events-filter.png[Admin Event Filter]

View file

@ -1,5 +1,5 @@
=== Login Events === Login events
You can record and view every event that affects users. {project_name} triggers login events for actions such as successful user login, a user entering an incorrect password, or a user account updating. By default, {project_name} does not store or display events in the Admin Console. Only the error events are logged to the Admin Console and the servers log file. You can record and view every event that affects users. {project_name} triggers login events for actions such as successful user login, a user entering an incorrect password, or a user account updating. By default, {project_name} does not store or display events in the Admin Console. Only the error events are logged to the Admin Console and the servers log file.
@ -30,12 +30,12 @@ image:{project_images}/login-events.png[Login Events]
You can filter events using the *Filter* button. You can filter events using the *Filter* button.
.Login Event Filter .Login Events Filter
image:{project_images}/login-events-filter.png[Login Event Filter] image:{project_images}/login-events-filter.png[Login Events Filter]
In this example, we filter only `Login` events. Click *Update* to run the filter. In this example, we filter only `Login` events. Click *Update* to run the filter.
==== Event Types ==== Event types
*Login events:* *Login events:*
@ -98,11 +98,11 @@ In this example, we filter only `Login` events. Click *Update* to run the filter
Each event has a corresponding error event. Each event has a corresponding error event.
==== Event Listener ==== Event listener
Event listeners listen for events and perform actions based on that event. {project_name} includes two built-in listeners, the Logging Event Listener and Email Event Listener. Event listeners listen for events and perform actions based on that event. {project_name} includes two built-in listeners, the Logging Event Listener and Email Event Listener.
===== The Logging Event Listener ===== The logging event listener
When the Logging Event Listener is enabled, this listener writes to a log file when an error event occurs. When the Logging Event Listener is enabled, this listener writes to a log file when an error event occurs.
An example log message from a Logging Event Listener: An example log message from a Logging Event Listener:

View file

@ -4,7 +4,7 @@
[role="_abstract"] [role="_abstract"]
{project_name} includes the ability to export and import its entire database. {project_name} includes the ability to export and import its entire database.
You can migrate the whole {project_name} database from one environment to another or migrate to another database (for example from MySQL to Oracle). The export/import triggers at server boot time, and its parameters pass through Java properties. You can migrate the whole {project_name} database from one environment to another or migrate to another database. The export/import triggers at server boot time, and its parameters pass through Java properties.
[NOTE] [NOTE]
==== ====

View file

@ -1,7 +1,7 @@
[[_general-idp-config]] [[_general-idp-config]]
=== General Configuration === General configuration
The foundations of the identity broker configuration are identity providers (IDPs). {project_name} creates identity providers for each realm and enables them for every application by default. Users from a realm can use any of the registered identity providers when signing in to an application. The foundations of the identity broker configuration are identity providers (IDPs). {project_name} creates identity providers for each realm and enables them for every application by default. Users from a realm can use any of the registered identity providers when signing in to an application.
@ -13,7 +13,7 @@ image:{project_images}/identity-providers.png[Identity Providers]
+ +
. From the `Add provider` list, select the identity provider you want to add. {project_name} displays the configuration page for the identity provider you selected. . From the `Add provider` list, select the identity provider you want to add. {project_name} displays the configuration page for the identity provider you selected.
+ +
.Add Facebook Identity Provider .Add facebook identity Provider
image:{project_images}/add-identity-provider.png[Add Facebook Identity Provider] image:{project_images}/add-identity-provider.png[Add Facebook Identity Provider]
+ +
When you configure an identity provider, the identity provider appears on the {project_name} login page as an option. You can place custom icons on the login screen for each identity provider. See link:{developerguide_link}#custom-identity-providers-icons[custom icons] for more information. When you configure an identity provider, the identity provider appears on the {project_name} login page as an option. You can place custom icons on the login screen for each identity provider. See link:{developerguide_link}#custom-identity-providers-icons[custom icons] for more information.

View file

@ -1,7 +1,7 @@
[[_identity_broker_first_login]] [[_identity_broker_first_login]]
=== First Login Flow === First login flow
When users log in through identity brokering, {project_name} imports and links aspects of the user within the realm's local database. When {project_name} successfully authenticates users through an external identity provider, two situations can exist: When users log in through identity brokering, {project_name} imports and links aspects of the user within the realm's local database. When {project_name} successfully authenticates users through an external identity provider, two situations can exist:
@ -16,7 +16,7 @@ ifeval::[{project_community}==true]
You can also create a new authentication flow, write your own Authenticator implementations, and use it in your flow. See link:{developerguide_link}[{developerguide_name}] for more information. You can also create a new authentication flow, write your own Authenticator implementations, and use it in your flow. See link:{developerguide_link}[{developerguide_name}] for more information.
endif::[] endif::[]
==== Default First Login Flow Authenticators ==== Default first login flow authenticators
Review Profile:: Review Profile::
* This authenticator displays the profile information page, so the users can review their profile that {project_name} retrieves from an identity provider. * This authenticator displays the profile information page, so the users can review their profile that {project_name} retrieves from an identity provider.
@ -26,12 +26,16 @@ Review Profile::
* When *OFF*, the profile page does not display unless the user clicks in a later phase on the `Review profile info` link in the page displayed by the `Confirm Link Existing Account` authenticator. * When *OFF*, the profile page does not display unless the user clicks in a later phase on the `Review profile info` link in the page displayed by the `Confirm Link Existing Account` authenticator.
Create User If Unique:: Create User If Unique::
This authenticator checks if there is already an existing {project_name} account with the same email or username like the account from the identity provider.
If it's not, then the authenticator just creates a new local {project_name} account and links it with the identity provider and the whole flow is finished.
Otherwise it goes to the next `Handle Existing Account` subflow.
If you always want to ensure that there is no duplicated account, you can mark this authenticator as `REQUIRED`. In this case, the user
will see the error page if there is an existing {project_name} account and the user will need to link the identity provider account through Account management.
* This authenticator verifies that there is already a {project_name} account with the same email or username as the identity provider's account. * This authenticator verifies that there is already a {project_name} account with the same email or username as the identity provider's account.
* If an account does not exist, the authenticator creates a local {project_name} account, links this account with the identity provider, and terminates the flow. * If an account does not exist, the authenticator creates a local {project_name} account, links this account with the identity provider, and terminates the flow.
* If an account exists, the authenticator implements the next `Handle Existing Account` sub-flow. * If an account exists, the authenticator implements the next `Handle Existing Account` sub-flow.
* To ensure there is no duplicated account, you can mark this authenticator as `REQUIRED`. The user sees the error page if a {project_name} account exists, and users must link their identity provider account through Account management. * To ensure there is no duplicated account, you can mark this authenticator as `REQUIRED`. The user sees the error page if a {project_name} account exists, and users must link their identity provider account through Account management.
NOTE: If you want to skip the ability to create new users, but you want that users authenticated from identity provider must already exists in {project_name} with same username or email like the user from identity provider, you can create new flow and replace `Create User If Exists` authenticator with `Detect Existing Broker User` . More details in the <<Detect Existing User First Login Flow,examples below>>.
Confirm Link Existing Account:: Confirm Link Existing Account::
* On the information page, users see a {project_name} account with the same email. Users can review their profile again and use a different email or username. The flow restarts and goes back to the `Review Profile` authenticator. * On the information page, users see a {project_name} account with the same email. Users can review their profile again and use a different email or username. The flow restarts and goes back to the `Review Profile` authenticator.
@ -48,7 +52,8 @@ Verify Existing Account By Re-authentication::
* Users can also re-authenticate with another identity provider already linked to their {project_name} account. * Users can also re-authenticate with another identity provider already linked to their {project_name} account.
* You can force users to use OTP. Otherwise, it is optional and used if you have set OTP for the user account. * You can force users to use OTP. Otherwise, it is optional and used if you have set OTP for the user account.
==== Automatically Link Existing First Login Flow ==== Automatically link existing first login flow
[WARNING] [WARNING]
==== ====
The AutoLink authenticator is dangerous in a generic environment where users can register themselves using arbitrary usernames or email addresses. Do not use this authenticator unless you are carefully curating user registration and assigning usernames and email addresses. The AutoLink authenticator is dangerous in a generic environment where users can register themselves using arbitrary usernames or email addresses. Do not use this authenticator unless you are carefully curating user registration and assigning usernames and email addresses.
@ -70,7 +75,7 @@ This setup is the simplest setup available, but it is possible to use other auth
==== ====
[[_disabling_automatic_user_creation]] [[_disabling_automatic_user_creation]]
==== Disabling Automatic User Creation ==== Disabling automatic user creation
The Default first login flow looks up the {project_name} account matching the external identity and offers to link them. If no matching {project_name} account exists, the flow automatically creates one. The Default first login flow looks up the {project_name} account matching the external identity and offers to link them. If no matching {project_name} account exists, the flow automatically creates one.
This default behavior may be unsuitable for some setups. One example is when you use a read-only LDAP user store, where all users are pre-created. In this case, you must switch off automatic user creation. This default behavior may be unsuitable for some setups. One example is when you use a read-only LDAP user store, where all users are pre-created. In this case, you must switch off automatic user creation.
@ -87,7 +92,7 @@ This configuration also implies that Keycloak itself won't be able to determine
Therefore, the `Verify Existing Account By Re-authentication` authenticator will ask the user to provide both username and password. Therefore, the `Verify Existing Account By Re-authentication` authenticator will ask the user to provide both username and password.
[[_detect_existing_user_first_loging_flow]] [[_detect_existing_user_first_loging_flow]]
==== Detect Existing User First Login Flow ==== Detect existing user first login flow
In order to configure a first login flow in which: In order to configure a first login flow in which:
- only users already registered in this realm can log in, - only users already registered in this realm can log in,
@ -102,12 +107,8 @@ Automatically Set Existing User::
Automatically sets an existing user to the authentication context without any verification. Set the authenticator requirement to `Mandatory`. Automatically sets an existing user to the authentication context without any verification. Set the authenticator requirement to `Mandatory`.
You have to set the `First Login Flow` of the identity provider configuration to that flow. You have to set the `First Login Flow` of the identity provider configuration to that flow.
You could set the also set `Sync Mode` to `force` if you want to update the user profile (Last Name, First Name, and so on) with the identity provider attributes. You could set the also set `Sync Mode` to `force` if you want to update the user profile (Last Name, First Name...) with the identity provider attributes.
======= NOTE: This flow can be used if you want to delegate the identity to other identity providers (such as github, facebook ...) but you want to manage which users that can log in.
NOTE: This flow can be used if you want to delegate the identity to other identity providers (such as github, facebook, and so on) but you want to manage which users that can log in.
=======
With this configuration, {project_name} is unable to determine which internal account corresponds to the external identity. The *Verify Existing Account By Re-authentication* authenticator asks the provider for the username and password. With this configuration, {project_name} is unable to determine which internal account corresponds to the external identity. The *Verify Existing Account By Re-authentication* authenticator asks the provider for the username and password.

View file

@ -1,6 +1,6 @@
[[_mappers]] [[_mappers]]
=== Mapping Claims and Assertions === Mapping claims and assertions
You can import the SAML and OpenID Connect metadata, provided by the external IDP you are authenticating with, into the realm. After importing, you can extract user profile metadata and other information, so you can make it available to your applications. You can import the SAML and OpenID Connect metadata, provided by the external IDP you are authenticating with, into the realm. After importing, you can extract user profile metadata and other information, so you can make it available to your applications.
@ -11,12 +11,12 @@ Each user logging into your realm using an external identity provider has an ent
. Select one of the identity providers in the list. . Select one of the identity providers in the list.
. Click the *Mappers* tab. . Click the *Mappers* tab.
+ +
.identity provider mappers .Identity provider mappers
image:{project_images}/identity-provider-mappers.png[identity provider mappers] image:{project_images}/identity-provider-mappers.png[identity provider mappers]
+ +
. Click *Create*. . Click *Create*.
+ +
.identity provider mapper .Identity provider mapper
image:{project_images}/identity-provider-mapper.png[identity provider mapper] image:{project_images}/identity-provider-mapper.png[identity provider mapper]
+ +
. Select a value for *Sync Mode Override*. The mapper updates user information when users log in repeatedly according to this setting. . Select a value for *Sync Mode Override*. The mapper updates user information when users log in repeatedly according to this setting.

View file

@ -1,6 +1,6 @@
[[_identity_broker_oidc]] [[_identity_broker_oidc]]
=== OpenID Connect v1.0 Identity Providers === OpenID Connect v1.0 identity providers
{project_name} brokers identity providers based on the OpenID Connect protocol. These identity providers (IDPs) must support the xref:proc-creating-oidc-client_{context}[Authorization Code Flow] defined in the specification to authenticate users and authorize access. {project_name} brokers identity providers based on the OpenID Connect protocol. These identity providers (IDPs) must support the xref:proc-creating-oidc-client_{context}[Authorization Code Flow] defined in the specification to authenticate users and authorize access.
@ -9,12 +9,12 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `OpenID Connect v1.0`. . From the `Add provider` list, select `OpenID Connect v1.0`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/oidc-add-identity-provider.png[Add Identity Provider] image:{project_images}/oidc-add-identity-provider.png[Add Identity Provider]
+ +
. Enter your initial configuration options. See <<_general-idp-config, General IDP Configuration>> for more information about configuration options. . Enter your initial configuration options. See <<_general-idp-config, General IDP Configuration>> for more information about configuration options.
+ +
.OpenID Connect Config .OpenID connect config
|=== |===
|Configuration|Description |Configuration|Description

View file

@ -1,7 +1,7 @@
[[_identity_broker_overview]] [[_identity_broker_overview]]
=== Brokering Overview === Brokering overview
When using {project_name} as an identity broker, {project_name} does not force users to provide their credentials to authenticate in a specific realm. {project_name} displays a list of identity providers from which they can authenticate. When using {project_name} as an identity broker, {project_name} does not force users to provide their credentials to authenticate in a specific realm. {project_name} displays a list of identity providers from which they can authenticate.
@ -12,8 +12,8 @@ If you configure a default identity provider, {project_name} redirects users to
Different protocols may require different authentication flows. All the identity providers supported by {project_name} use the following flow. Different protocols may require different authentication flows. All the identity providers supported by {project_name} use the following flow.
==== ====
.Identity Broker Flow .Identity broker flow
image:images/identity_broker_flow.png[Identity Broker Flow] image:images/identity_broker_flow.png[Identity broker flow]
. The unauthenticated user requests a protected resource in a client application. . The unauthenticated user requests a protected resource in a client application.
. The client application redirects the user to {project_name} to authenticate. . The client application redirects the user to {project_name} to authenticate.

View file

@ -7,7 +7,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `SAML v2.0`. . From the `Add provider` list, select `SAML v2.0`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/saml-add-identity-provider.png[Add Identity Provider] image:{project_images}/saml-add-identity-provider.png[Add Identity Provider]
+ +
. Enter your initial configuration options. See <<_general-idp-config, General IDP Configuration>> for more information about configuration options. . Enter your initial configuration options. See <<_general-idp-config, General IDP Configuration>> for more information about configuration options.
@ -32,6 +32,8 @@ image:{project_images}/saml-add-identity-provider.png[Add Identity Provider]
|Principal Type |Principal Type
|Specifies which part of the SAML assertion will be used to identify and track external user identities. Can be either Subject NameID or SAML attribute (either by name or by friendly name). Subject NameID value can not be set together with 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' NameID Policy Format value. |Specifies which part of the SAML assertion will be used to identify and track external user identities. Can be either Subject NameID or SAML attribute (either by name or by friendly name). Subject NameID value can not be set together with 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' NameID Policy Format value.
=======
|Specifies the part of the SAML assertion {project_name} uses to identify and track external user identities. The Principal Type can be Subject NameID or SAML attribute (by name or by friendly name).
|Principal Attribute |Principal Attribute
|If a Principal type is non-blank, this field specifies the name ("Attribute [Name]") or the friendly name ("Attribute [Friendly Name]") of the identifying attribute. |If a Principal type is non-blank, this field specifies the name ("Attribute [Name]") or the friendly name ("Attribute [Friendly Name]") of the identifying attribute.
@ -110,7 +112,7 @@ http[s]://{host:port}/auth/realms/{realm-name}/broker/{broker-alias}/endpoint/de
Ensure you save any configuration changes before accessing the descriptor. Ensure you save any configuration changes before accessing the descriptor.
[[_identity_broker_saml_login_hint]] [[_identity_broker_saml_login_hint]]
==== Send Subject in SAML requests ==== Send subject in SAML requests
By default, a social button pointing to a SAML Identity Provider redirects the user to the following login URL: By default, a social button pointing to a SAML Identity Provider redirects the user to the following login URL:

View file

@ -1,5 +1,5 @@
=== Available User Session Data === Available user session data
After a user login from an external IDP, {project_name} stores user session note data that you can access. This data can be propagated to the client requesting log in using the token or SAML assertion passed back to the client using an appropriate client mapper. After a user login from an external IDP, {project_name} stores user session note data that you can access. This data can be propagated to the client requesting log in using the token or SAML assertion passed back to the client using an appropriate client mapper.

View file

@ -7,7 +7,7 @@ To log in with Bitbucket, perform the following procedure.
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Bitbucket`. . From the `Add provider` list, select `Bitbucket`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/bitbucket-add-identity-provider.png[Add Identity Provider] image:{project_images}/bitbucket-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -6,7 +6,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Facebook`. {project_name} displays the configuration page for the Facebook identity provider. . From the `Add provider` list, select `Facebook`. {project_name} displays the configuration page for the Facebook identity provider.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/facebook-add-identity-provider.png[Add Identity Provider] image:{project_images}/facebook-add-identity-provider.png[Add Identity Provider]
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.
. In a separate browser tab, follow the https://developers.facebook.com/docs/development/[Facebook Developer Guide's] instructions to create a project and client in Facebook. . In a separate browser tab, follow the https://developers.facebook.com/docs/development/[Facebook Developer Guide's] instructions to create a project and client in Facebook.

View file

@ -9,11 +9,11 @@ To log in with Github, perform the following procedure.
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Github`. . From the `Add provider` list, select `Github`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/github-add-identity-provider.png[Add Identity Provider] image:{project_images}/github-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.
. In a separate browser tab, https://docs.github.com/en/developers/apps/creating-an-oauth-app[create an OAUTH app]. . In a separate browser tab, https://docs.github.com/en/developers/apps/building-oauth-apps/creating-an-oauth-app[create an OAUTH app].
.. Enter the value of *Redirect URI* into the `Authorization callback URL` field when creating the app. .. Enter the value of *Redirect URI* into the `Authorization callback URL` field when creating the app.
.. Note the Client ID and Client secret on the management page of your OAUTH app. .. Note the Client ID and Client secret on the management page of your OAUTH app.
. In {project_name}, paste the value of the `Client ID` into the *Client ID* field. . In {project_name}, paste the value of the `Client ID` into the *Client ID* field.

View file

@ -5,8 +5,8 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `GitLab`. . From the `Add provider` list, select `GitLab`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/github-add-identity-provider.png[Add Identity Provider] image:{project_images}/github-add-identity-provider.png[Add identity provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.
. In a separate browser tab, https://docs.gitlab.com/ee/integration/oauth_provider.html[add a new GitLab application]. . In a separate browser tab, https://docs.gitlab.com/ee/integration/oauth_provider.html[add a new GitLab application].

View file

@ -6,7 +6,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Google`. . From the `Add provider` list, select `Google`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/google-add-identity-provider.png[Add Identity Provider] image:{project_images}/google-add-identity-provider.png[Add Identity Provider]
+ +
. In a separate browser tab, https://support.google.com/googleapi/answer/6251787[create a google project]. . In a separate browser tab, https://support.google.com/googleapi/answer/6251787[create a google project].

View file

@ -5,33 +5,33 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Instagram`. {project_name} displays the configuration page for the Instagram identity provider. . From the `Add provider` list, select `Instagram`. {project_name} displays the configuration page for the Instagram identity provider.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/instagram-add-identity-provider.png[Add Identity Provider] image:{project_images}/instagram-add-identity-provider.png[Add Identity Provider]
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.
. In a separate browser tab, open the https://developers.facebook.com/[Facebook Developer Console]. . In a separate browser tab, open the https://developers.facebook.com/[Facebook Developer Console].
.. Click *My Apps*. .. Click *My Apps*.
.. Select *Add a New App*. .. Select *Add a New App*.
+ +
.Add a New App .Add a new app
image:images/instagram-add-new-app.png[Add a New App] image:images/instagram-add-new-app.png[Add a New App]
+ +
.. Select `For Everything Else`. .. Select `For Everything Else`.
+ +
.Create a New App ID .Create a new app ID
image:images/instagram-create-app-id.png[] image:images/instagram-create-app-id.png[]
+ +
.. Fill in all required fields. .. Fill in all required fields.
.. Click *Create App*. Facebook then brings you to the dashboard. .. Click *Create App*. Facebook then brings you to the dashboard.
.. In the navigation panel, select *Settings* - *Basic*. .. In the navigation panel, select *Settings* - *Basic*.
+ +
.Add Platform .Add platform
image:images/instagram-add-platform.png[Add Platform] image:images/instagram-add-platform.png[Add Platform]
+ +
.. Select *+ Add Platform*. .. Select *+ Add Platform*.
.. Click *[Website]*. .. Click *[Website]*.
.. Enter a URL for your site. .. Enter a URL for your site.
+ +
.Add a Product .Add a product
image:images/instagram-add-product.png[] image:images/instagram-add-product.png[]
+ +
.. Select `Dashboard` from the menu. .. Select `Dashboard` from the menu.
@ -39,12 +39,12 @@ image:images/instagram-add-product.png[]
.. Select *Instagram* - *Basic Display* from the menu. .. Select *Instagram* - *Basic Display* from the menu.
.. Click *Create New App*. .. Click *Create New App*.
+ +
.Create a New Instagram App ID .Create a new Instagram app ID
image:images/instagram-create-instagram-app-id.png[Create a New Instagram App ID] image:images/instagram-create-instagram-app-id.png[Create a New Instagram App ID]
+ +
.. Enter a value into *Display Name*. .. Enter a value into *Display Name*.
+ +
.Setup the App .Setup the app
image:images/instagram-app-settings.png[Setup the App] image:images/instagram-app-settings.png[Setup the App]
+ +
.. Paste the *Redirect URL* from {project_name} into the *Valid OAuth Redirect URIs* field. .. Paste the *Redirect URL* from {project_name} into the *Valid OAuth Redirect URIs* field.

View file

@ -7,7 +7,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `LinkedIn`. . From the `Add provider` list, select `LinkedIn`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/google-add-identity-provider.png[Add Identity Provider] image:{project_images}/google-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -7,7 +7,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Microsoft`. . From the `Add provider` list, select `Microsoft`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/google-add-identity-provider.png[Add Identity Provider] image:{project_images}/google-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -5,7 +5,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Openshift`. . From the `Add provider` list, select `Openshift`.
+ +
.Add Identity Provider .Add identity provider
image:images/openshift-add-identity-provider.png[Add Identity Provider] image:images/openshift-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.
@ -51,7 +51,7 @@ curl -s -k -H "Authorization: Bearer $(oc whoami -t)" \https://<openshift-user-f
. Click *Identity Providers* in the {project_name} menu. . Click *Identity Providers* in the {project_name} menu.
. From the `Add provider` list, select `Openshift`. . From the `Add provider` list, select `Openshift`.
+ +
.Add Identity Provider .Add identity provider
image:images/openshift-4-add-identity-provider.png[Add Identity Provider] image:images/openshift-4-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -5,7 +5,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `PayPal`. . From the `Add provider` list, select `PayPal`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/google-add-identity-provider.png[Add Identity Provider] image:{project_images}/google-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -1,18 +1,18 @@
[[_stackoverflow]] [[_stackoverflow]]
==== Stack Overflow ==== Stack overflow
.Procedure .Procedure
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Stack Overflow`. . From the `Add provider` list, select `Stack Overflow`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/google-add-identity-provider.png[Add Identity Provider] image:{project_images}/google-add-identity-provider.png[Add Identity Provider]
+ +
. In a separate browser tab, log into https://stackapps.com/apps/oauth/register[registering your application on Stack Apps]. . In a separate browser tab, log into https://stackapps.com/apps/oauth/register[registering your application on Stack Apps].
+ +
.Register Application .Register application
image:images/stack-overflow-app-register.png[Register Application] image:images/stack-overflow-app-register.png[Register Application]
+ +
.. Enter your application name into the *Application Name* field. .. Enter your application name into the *Application Name* field.

View file

@ -10,7 +10,7 @@
. Click *Identity Providers* in the menu. . Click *Identity Providers* in the menu.
. From the `Add provider` list, select `Twitter`. . From the `Add provider` list, select `Twitter`.
+ +
.Add Identity Provider .Add identity provider
image:{project_images}/twitter-add-identity-provider.png[Add Identity Provider] image:{project_images}/twitter-add-identity-provider.png[Add Identity Provider]
+ +
. Copy the value of *Redirect URI* to your clipboard. . Copy the value of *Redirect URI* to your clipboard.

View file

@ -1,5 +1,5 @@
=== Retrieving External IDP Tokens === Retrieving external IDP tokens
With {project_name}, you can store tokens and responses from the authentication process with the external IDP using the `Store Token` configuration option on the IDP's settings page. With {project_name}, you can store tokens and responses from the authentication process with the external IDP using the `Store Token` configuration option on the IDP's settings page.

View file

@ -18,14 +18,14 @@ If your server is accessible from `localhost`, perform these steps.
. Supply a username and password that you can recall. . Supply a username and password that you can recall.
+ +
.Welcome Page .Welcome page
image:{project_images}/initial-welcome-page.png[Welcome Page] image:{project_images}/initial-welcome-page.png[Welcome Page]
=== Creating the account remotely === Creating the account remotely
If you cannot access the server from a `localhost` address, or just want to start {project_name} from the command line, use the `.../bin/add-user-keycloak` script. If you cannot access the server from a `localhost` address, or just want to start {project_name} from the command line, use the `.../bin/add-user-keycloak` script.
.add-user-keycloak script .Add-user-keycloak script
image:{project_images}/add-user-script.png[] image:{project_images}/add-user-script.png[]
The parameters are a little different depending if you are using the standalone operation mode or domain operation mode. For standalone mode, here is how you use the script. The parameters are a little different depending if you are using the standalone operation mode or domain operation mode. For standalone mode, here is how you use the script.

View file

@ -1,5 +1,5 @@
== Enabling Forgot Password == Enabling forgot password
If you enable `Forgot Password`, users can reset their login credentials if they forget their passwords or lose their OTP generator. If you enable `Forgot Password`, users can reset their login credentials if they forget their passwords or lose their OTP generator.
@ -7,19 +7,19 @@ If you enable `Forgot Password`, users can reset their login credentials if they
. Click *Realm Settings* in the menu. . Click *Realm Settings* in the menu.
. Click the *Login* tab. . Click the *Login* tab.
+ +
.Login Tab .Login tab
image:{project_images}/login-tab.png[Login Tab] image:{project_images}/login-tab.png[Login Tab]
+ +
. Toggle *Forgot Password* to *ON*. . Toggle *Forgot Password* to *ON*.
+ +
A `forgot password` link displays in your login pages. A `forgot password` link displays in your login pages.
+ +
.Forgot Password Link .Forgot password link
image:{project_images}/forgot-password-link.png[Forgot Password Link] image:{project_images}/forgot-password-link.png[Forgot Password Link]
. Click this link to bring users where they can enter their username or email address and receive an email with a link to reset their credentials. . Click this link to bring users where they can enter their username or email address and receive an email with a link to reset their credentials.
+ +
.Forgot Password Page .Forgot password page
image:{project_images}/forgot-password-page.png[Forgot Password Page] image:{project_images}/forgot-password-page.png[Forgot Password Page]
The text sent in the email is configurable. See link:{developerguide_link}[{developerguide_name}] for more information. The text sent in the email is configurable. See link:{developerguide_link}[{developerguide_name}] for more information.
@ -33,7 +33,7 @@ To change this behavior, perform these steps:
. Click the *Flows* tab. . Click the *Flows* tab.
. Select the *Reset Credentials* flow. . Select the *Reset Credentials* flow.
+ +
.Reset Credentials Flow .Reset credentials flow
image:{project_images}/reset-credentials-flow.png[Reset Credentials Flow] image:{project_images}/reset-credentials-flow.png[Reset Credentials Flow]
+ +
If you do not want to reset the OTP, set the `Reset OTP` requirement to *Disabled*. If you do not want to reset the OTP, set the `Reset OTP` requirement to *Disabled*.

View file

@ -8,7 +8,7 @@ A logged-in user closing their browser destroys their session, and that user mus
. Click the *Login* tab. . Click the *Login* tab.
. Toggle the *Remember Me* switch to *ON*. . Toggle the *Remember Me* switch to *ON*.
+ +
.Login Tab .Login tab
image:{project_images}/login-tab.png[] image:{project_images}/login-tab.png[]
When you save this setting, a `remember me` checkbox displays on the realm's login page. When you save this setting, a `remember me` checkbox displays on the realm's login page.

View file

@ -1,5 +1,5 @@
== Configuring Realms == Configuring realms
A realm manages a set of users, credentials, roles, and groups. A user belongs to and logs into a realm. Realms are isolated from one another A realm manages a set of users, credentials, roles, and groups. A user belongs to and logs into a realm. Realms are isolated from one another
and can only manage and authenticate the users that they control. One {project_name} deployment can define, store, and manage as many realms and can only manage and authenticate the users that they control. One {project_name} deployment can define, store, and manage as many realms

View file

@ -10,7 +10,7 @@
. Click the *Email* tab. . Click the *Email* tab.
+ +
.Email Tab .Email tab
image:{project_images}/email-tab.png[Email Tab] image:{project_images}/email-tab.png[Email Tab]
. Fill in the fields and toggle the switches as needed. . Fill in the fields and toggle the switches as needed.

View file

@ -93,7 +93,7 @@ from the dropdown. You can change the priority to make sure the new keypair beco
.Procedure .Procedure
. Select the realm in the Admin Console. . Select the realm in the Admin Console.
. Click *Realm settings*. . Click Realm settings.
. Click the *Keys* tab. . Click the *Keys* tab.
. Click the *Active* tab. . Click the *Active* tab.
. Click the provider of the key you want to make passive. . Click the provider of the key you want to make passive.

View file

@ -15,15 +15,15 @@ realm and only be able to interact with customer-facing apps.
. Click *Add Realm*. . Click *Add Realm*.
+ +
.Add Realm Menu .Add realm menu
image:{project_images}/add-realm-menu.png[Add Realm Menu] image:{project_images}/add-realm-menu.png[Add realm menu]
. Enter a name for the realm. . Enter a name for the realm.
. Click *Create*. . Click *Create*.
+ +
.Create Realm .Create realm
image:{project_images}/create-realm.png[Create Realm] image:{project_images}/create-realm.png[Create realm]
The current realm is now set to the realm you just created. You can switch between managing different realms by pointing to the top left corner to click *Select Realm*. The current realm is now set to the realm you just created. You can switch between managing different realms by pointing to the top left corner to click *Select Realm*.

View file

@ -12,8 +12,8 @@ You configure realms and perform most administrative tasks in the {project_name}
+ +
For example, for localhost, use this URL: http://localhost:8080/auth/admin/ For example, for localhost, use this URL: http://localhost:8080/auth/admin/
+ +
.Login Page .Login page
image:{project_images}/login-page.png[Login Page] image:{project_images}/login-page.png[Login page]
. Enter the username and password you created on the Welcome Page or the `add-user-keycloak` script in the bin directory. . Enter the username and password you created on the Welcome Page or the `add-user-keycloak` script in the bin directory.
This action displays the Admin Console. This action displays the Admin Console.

View file

@ -12,8 +12,8 @@ WARNING: {project_name} generates a self-signed certificate the first time it r
. Click the *Login* tab. . Click the *Login* tab.
+ +
.Login Tab .Login tab
image:{project_images}/login-tab.png[Login Tab] image:{project_images}/login-tab.png[Login tab]
. Set *Require SSL* to one of the following SSL modes: . Set *Require SSL* to one of the following SSL modes:

View file

@ -9,8 +9,8 @@ For a given realm, you can change the appearance of any UI, including the langua
. Click the *Themes* tab. . Click the *Themes* tab.
+ +
.Themes Tab .Themes tab
image:{project_images}/themes-tab.png[Themes Tab] image:{project_images}/themes-tab.png[Themes tab]
. Pick the theme you want for each UI category and click *Save*. . Pick the theme you want for each UI category and click *Save*.
+ +
@ -50,7 +50,7 @@ The next time a user logs in, that user can choose a language on the login page
how you can offer additional languages. All internationalized texts which are provided by the theme can be overwritten by realm-specific texts on the *Localization* tab. how you can offer additional languages. All internationalized texts which are provided by the theme can be overwritten by realm-specific texts on the *Localization* tab.
[[_user_locale_selection]] [[_user_locale_selection]]
== User Locale selection == User locale selection
A locale selector provider suggests the best locale on the information available. However, it is often unknown who the user is. For this reason, the previously authenticated user's locale is remembered in a persisted cookie. A locale selector provider suggests the best locale on the information available. However, it is often unknown who the user is. For this reason, the previously authenticated user's locale is remembered in a persisted cookie.

View file

@ -1,5 +1,5 @@
[id="con-client-roles_{context}"] [id="con-client-roles_{context}"]
= Client Roles = Client roles
[role="_abstract"] [role="_abstract"]
Client roles are namespaces dedicated to clients. Each client gets its own namespace. Client roles are managed under the *Roles* tab for each client. You interact with this UI the same way you do for realm-level roles. Client roles are namespaces dedicated to clients. Each client gets its own namespace. Client roles are managed under the *Roles* tab for each client. You interact with this UI the same way you do for realm-level roles.

View file

@ -1,6 +1,6 @@
[id="con-comparing-groups-roles_{context}"] [id="con-comparing-groups-roles_{context}"]
= Groups Compared to Roles = Groups compared to roles
[role="_abstract"] [role="_abstract"]
Groups and roles have some similarities and differences. In {project_name}, groups are a collection of users to which you apply roles and attributes. Roles define types of users and applications assign permissions and access control to roles. Groups and roles have some similarities and differences. In {project_name}, groups are a collection of users to which you apply roles and attributes. Roles define types of users and applications assign permissions and access control to roles.

View file

@ -1,13 +1,13 @@
[id="con-default-roles_{context}"] [id="con-default-roles_{context}"]
[[_default_roles]] [[_default_roles]]
==== Default Roles ==== Default roles
[role="_abstract"] [role="_abstract"]
Default roles allow you to automatically assign user role mappings when any user is newly created or imported through Default roles allow you to automatically assign user role mappings when any user is newly created or imported through
<<_identity_broker, Identity Brokering>>. <<_identity_broker, Identity Brokering>>.
To specify default roles go to the *Roles* left menu item, and click the *Default Roles* tab. To specify default roles go to the *Roles* left menu item, and click the *Default Roles* tab.
.Default Roles .Default roles
image:{project_images}/default-roles.png[] image:{project_images}/default-roles.png[]
This screenshot shows that some _default roles_ already exist. This screenshot shows that some _default roles_ already exist.

View file

@ -2,7 +2,7 @@
[[_role_scope_mappings]] [[_role_scope_mappings]]
= Role Scope Mappings = Role scope mappings
[role="_abstract"] [role="_abstract"]
On creation of an OIDC access token or SAML assertion, the user role mappings become claims within the token or assertion. Applications use these claims to make access decisions on the resources controlled by the application. {project_name} digitally signs access tokens and applications re-use them to invoke remotely secured REST services. However, these tokens have an associated risk. An attacker can obtain these tokens and use their permissions to compromise your networks. To prevent this situation, use _Role Scope Mappings_. On creation of an OIDC access token or SAML assertion, the user role mappings become claims within the token or assertion. Applications use these claims to make access decisions on the resources controlled by the application. {project_name} digitally signs access tokens and applications re-use them to invoke remotely secured REST services. However, these tokens have an associated risk. An attacker can obtain these tokens and use their permissions to compromise your networks. To prevent this situation, use _Role Scope Mappings_.
@ -10,10 +10,10 @@ _Role Scope Mappings_ limit the roles declared inside an access token. When a c
By default, each client gets all the role mappings of the user. You can view the role mappings in the *Scope* tab of each client. By default, each client gets all the role mappings of the user. You can view the role mappings in the *Scope* tab of each client.
.Full Scope .Full scope
image:{project_images}/full-client-scope.png[] image:{project_images}/full-client-scope.png[Full scope]
By default, the effective roles of scopes are every declared role in the realm. To change this default behavior, toggle *Full Scope Allowed* to ON and declare the specific roles you want in each client. You can also use <<_client_scopes, client scopes>> to define the same role scope mappings for a set of clients. By default, the effective roles of scopes are every declared role in the realm. To change this default behavior, toggle *Full Scope Allowed* to *ON* and declare the specific roles you want in each client. You can also use <<_client_scopes, client scopes>> to define the same role scope mappings for a set of clients.
.Partial Scope .Partial scope
image:{project_images}/client-scope.png[] image:{project_images}/client-scope.png[Partial scope]

View file

@ -1,6 +1,6 @@
[id="proc-assigning-role-mappings_{context}"] [id="proc-assigning-role-mappings_{context}"]
= Asssiging Role Mappings = Asssiging role mappings
[role="_abstract"] [role="_abstract"]
You can assign role mappings to a user through the *Role Mappings* tab for that user. You can assign role mappings to a user through the *Role Mappings* tab for that user.
@ -11,12 +11,12 @@ You can assign role mappings to a user through the *Role Mappings* tab for that
. Click the role you want to assign to the user in the *Available Roles* box. . Click the role you want to assign to the user in the *Available Roles* box.
. Click *Add selected*. . Click *Add selected*.
.Role Mappings .Role mappings
image:{project_images}/user-role-mappings.png[] image:{project_images}/user-role-mappings.png[Role mappings]
In the preceding example, we are assigning the composite role *developer* to a user. That role was created in the <<_composite-roles, Composite Roles>> topic. In the preceding example, we are assigning the composite role *developer* to a user. That role was created in the <<_composite-roles, Composite Roles>> topic.
.Effective Role Mappings .Effective role mappings
image:{project_images}/effective-role-mappings.png[] image:{project_images}/effective-role-mappings.png[Effective role mappings]
When the *developer* role is assigned, the *employee* role associated with the *developer* composite is displayed in the *Effective Roles* box. *Effective Roles* are the roles explicitly assigned to users and roles that are inherited from composites. When the *developer* role is assigned, the *employee* role associated with the *developer* composite is displayed in the *Effective Roles* box. *Effective Roles* are the roles explicitly assigned to users and roles that are inherited from composites.

View file

@ -12,8 +12,8 @@ Any realm or client level role can become a _composite role_. A _composite role_
. Click the role that you want to convert. . Click the role that you want to convert.
. Toggle *Composite Roles* to *ON*. . Toggle *Composite Roles* to *ON*.
.Composite Role .Composite role
image:{project_images}/composite-role.png[] image:{project_images}/composite-role.png[Composite role]
The role selection UI is displayed on the page and you can associate realm level and client level roles to the composite role you are creating. The role selection UI is displayed on the page and you can associate realm level and client level roles to the composite role you are creating.

View file

@ -1,6 +1,6 @@
[id="proc-creating-realm-roles_{context}"] [id="proc-creating-realm-roles_{context}"]
= Creating a Realm Role = Creating a realm role
[role="_abstract"] [role="_abstract"]
Realm-level roles are a namespace for defining your roles. To see the list of roles, click *Roles* in the menu. Realm-level roles are a namespace for defining your roles. To see the list of roles, click *Roles* in the menu.
@ -12,7 +12,7 @@ image:{project_images}/roles.png[]
. Enter a *Description*. . Enter a *Description*.
. Click *Save*. . Click *Save*.
.Add Role .Add role
image:{project_images}/role.png[] image:{project_images}/role.png[Add role]
The *description* field can be localizable by specifying a substitution variable with `$\{var-name}` strings. The localized value is configured to your theme within the themes property files. See the link:{developerguide_link}[{developerguide_name}] for more details. The *description* field can be localizable by specifying a substitution variable with `$\{var-name}` strings. The localized value is configured to your theme within the themes property files. See the link:{developerguide_link}[{developerguide_name}] for more details.

View file

@ -35,7 +35,7 @@ To add a user to a group:
. Click the user that you want to perform a role mapping on. If the user is not displayed, click *View all users*. . Click the user that you want to perform a role mapping on. If the user is not displayed, click *View all users*.
. Click *Groups*. . Click *Groups*.
+ +
.User Groups .User groups
image:{project_images}/user-groups.png[] image:{project_images}/user-groups.png[]
+ +
. Select a group from the *Available Groups* tree. . Select a group from the *Available Groups* tree.
@ -48,5 +48,5 @@ To remove a group from a user:
In this example, the user _jimlincoln_ is in the _North America_ group. You can see _jimlincoln_ displayed under the *Members* tab for the group. In this example, the user _jimlincoln_ is in the _North America_ group. You can see _jimlincoln_ displayed under the *Members* tab for the group.
.Group Membership .Group membership
image:{project_images}/group-membership.png[] image:{project_images}/group-membership.png[]

View file

@ -1,13 +1,13 @@
[id="proc-specifying-default-groups_{context}"] [id="proc-specifying-default-groups_{context}"]
= Using Default Groups = Using default groups
[role="_abstract"] [role="_abstract"]
To automatically assign group membership to any users who is created or who is imported through <<_identity_broker, Identity Brokering>>, you use default groups. To automatically assign group membership to any users who is created or who is imported through <<_identity_broker, Identity Brokering>>, you use default groups.
. Click *Groups* in the menu. . Click *Groups* in the menu.
. Click the *Default Groups* tab. . Click the *Default Groups* tab.
.Default Groups .Default groups
image:{project_images}/default-groups.png[] image:{project_images}/default-groups.png[Default groups]
This screenshot shows that some _default groups_ already exist. This screenshot shows that some _default groups_ already exist.

View file

@ -1,7 +1,7 @@
[id="proc-using-default-roles_{context}"] [id="proc-using-default-roles_{context}"]
[[_default_roles]] [[_default_roles]]
= Using Default Roles = Using default roles
[role="_abstract"] [role="_abstract"]
Use default roles to automatically assign user role mappings when a user is created or imported through <<_identity_broker, Identity Brokering>>. Use default roles to automatically assign user role mappings when a user is created or imported through <<_identity_broker, Identity Brokering>>.
@ -10,7 +10,7 @@ Use default roles to automatically assign user role mappings when a user is crea
. Click *Roles* in the menu . Click *Roles* in the menu
. Click the *Default Roles* tab. . Click the *Default Roles* tab.
.Default Roles .Default roles
image:{project_images}/default-roles.png[] image:{project_images}/default-roles.png[Default roles]
This screenshot shows that some _default roles_ already exist. This screenshot shows that some _default roles_ already exist.

View file

@ -1,10 +1,10 @@
=== Administering Sessions === Administering sessions
To see a top-level view of the active clients and sessions in {project_name}, click *Sessions* from the menu. To see a top-level view of the active clients and sessions in {project_name}, click *Sessions* from the menu.
.Sessions .Sessions
image:{project_images}/sessions.png[] image:{project_images}/sessions.png[Sessions]
==== The *Logout all* Operation ==== The *Logout all* Operation
@ -17,14 +17,14 @@ When you click the *Logout all* button, all SSO cookies become invalid, and clie
Clicking *Logout all* does not revoke outstanding access tokens. Outstanding tokens must expire naturally. For clients using the {project_name} OIDC client adapter, you can push a <<_revocation-policy, revocation policy>> to revoke the token, but this does not work for other adapters. Clicking *Logout all* does not revoke outstanding access tokens. Outstanding tokens must expire naturally. For clients using the {project_name} OIDC client adapter, you can push a <<_revocation-policy, revocation policy>> to revoke the token, but this does not work for other adapters.
==== ====
==== Application Navigation ==== Application navigation
On the `Sessions` page, you can click on each client to go to that client's `Sessions` tab. Click the *Show Sessions* button there to see which users are in the application. On the `Sessions` page, you can click on each client to go to that client's `Sessions` tab. Click the *Show Sessions* button there to see which users are in the application.
.Application Sessions .Application sessions
image:{project_images}/application-sessions.png[] image:{project_images}/application-sessions.png[]
==== User Navigation ==== User navigation
If you go to the `Sessions` tab of an individual user, you can also view the user's session information. If you go to the `Sessions` tab of an individual user, you can also view the user's session information.

View file

@ -1,7 +1,7 @@
[[_offline-access]] [[_offline-access]]
=== Offline Access === Offline access
[role="_abstract"] [role="_abstract"]
During https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess[offline access] logins, the client application requests an offline token instead of a refresh token. The client application saves this offline token and can use it for future logins if the user logs out. This action is useful if your application needs to perform offline actions on behalf of the user even when the user is not online. For example, a regular data backup. During https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess[offline access] logins, the client application requests an offline token instead of a refresh token. The client application saves this offline token and can use it for future logins if the user logs out. This action is useful if your application needs to perform offline actions on behalf of the user even when the user is not online. For example, a regular data backup.

View file

@ -1,4 +1,4 @@
=== Offline Sessions Preloading === Offline sessions preloading
In addition to {jdgserver_name} caches, offline sessions are stored in a database which means they will be available even after server restart. In addition to {jdgserver_name} caches, offline sessions are stored in a database which means they will be available even after server restart.
By default, the offline sessions are preloaded from the database into the {jdgserver_name} caches during the server startup. By default, the offline sessions are preloaded from the database into the {jdgserver_name} caches during the server startup.

View file

@ -1,7 +1,7 @@
[[_revocation-policy]] [[_revocation-policy]]
=== Revocation Policies === Revocation policies
[role="_abstract"] [role="_abstract"]
If your system is compromised, you can revoke all active sessions and access tokens by clicking the `Sessions` screen *Revocation* tab. If your system is compromised, you can revoke all active sessions and access tokens by clicking the `Sessions` screen *Revocation* tab.

View file

@ -1,11 +1,11 @@
[[_timeouts]] [[_timeouts]]
=== Session and Token Timeouts === Session and token timeouts
[role="_abstract"] [role="_abstract"]
{project_name} includes control of the session, cookie, and token timeouts through the *Tokens* tab in the *Realm Settings* menu. {project_name} includes control of the session, cookie, and token timeouts through the *Tokens* tab in the *Realm Settings* menu.
.Tokens Tab .Tokens tab
image:{project_images}/tokens-tab.png[] image:{project_images}/tokens-tab.png[]
|=== |===
@ -25,10 +25,10 @@ image:{project_images}/tokens-tab.png[]
|The maximum time before a user session expires. |The maximum time before a user session expires.
|SSO Session Idle Remember Me |SSO Session Idle Remember Me
|This setting is similar to the standard SSO Session Idle configuration but specific to logins with `Remember Me` enabled. Users can specify longer session idle timeouts when they click `Remember Me` when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same idle timeout as the SSO Session Idle configuration. |This setting is similar to the standard SSO Session Idle configuration but specific to logins with *Remember Me* enabled. Users can specify longer session idle timeouts when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same idle timeout as the SSO Session Idle configuration.
|SSO Session Max Remember Me |SSO Session Max Remember Me
|This setting is similar to the standard SSO Session Max but specific to `Remember Me` logins. Users can specify longer sessions when they click `Remember Me` when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same session lifespan as the SSO Session Max configuration. |This setting is similar to the standard SSO Session Max but specific to *Remember Me* logins. Users can specify longer sessions when they click *Remember Me* when logging in. This setting is an optional configuration and, if its value is not greater than zero, it uses the same session lifespan as the SSO Session Max configuration.
[[_offline-session-idle]] [[_offline-session-idle]]
|Offline Session Idle |Offline Session Idle

View file

@ -1,5 +1,5 @@
== SSO Protocols == SSO protocols
[role="_abstract"] [role="_abstract"]
This section discusses authentication protocols, the {project_name} authentication server and how applications, secured by the {project_name} authentication server, interact with these protocols. This section discusses authentication protocols, the {project_name} authentication server and how applications, secured by the {project_name} authentication server, interact with these protocols.

View file

@ -1,6 +1,6 @@
[id="con-oidc-auth-flows_{context}"] [id="con-oidc-auth-flows_{context}"]
==== OIDC Auth Flows ==== OIDC auth flows
[role="_abstract"] [role="_abstract"]
OIDC has several methods, or flows, that clients or applications can use to authenticate users and receive _identity_ and _access_ tokens. The method depends on the type of application or client requesting access. OIDC has several methods, or flows, that clients or applications can use to authenticate users and receive _identity_ and _access_ tokens. The method depends on the type of application or client requesting access.
@ -20,14 +20,14 @@ to exchange the code for an _identity_ and _access_ and _refresh_ token. To pre
[NOTE] [NOTE]
==== ====
A system is vulnerable to a stolen token for the lifetime of that token. For security and scalability reasons, access_ tokens are generally set to expire quickly so subsequent token requests fail. If a token expires, an application can obtain a new access token using the additional _refresh_ token sent by the login protocol. A system is vulnerable to a stolen token for the lifetime of that token. For security and scalability reasons, access tokens are generally set to expire quickly so subsequent token requests fail. If a token expires, an application can obtain a new access token using the additional _refresh_ token sent by the login protocol.
==== ====
[[_confidential-clients]] [[_confidential-clients]]
_Confidential_ clients provide client secrets when they exchange the temporary codes for tokens. _Public_ clients are not required to provide client secrets. _Confidential_ clients provide client secrets when they exchange the temporary codes for tokens. _Public_ clients are not required to provide client secrets.
_Public_ clients are secure when HTTPS is strictly enforced and redirect URIs registered for the client are strictly controlled. HTML5/JavaScript clients have to be _public_ clients because there is no way to securely transmit the client secret to HTML5/JavaScript clients. For more details, see the xref:assembly-managing-clients_{context}[Managing Clients] chapter. _Public_ clients are secure when HTTPS is strictly enforced and redirect URIs registered for the client are strictly controlled. HTML5/JavaScript clients have to be _public_ clients because there is no way to securely transmit the client secret to HTML5/JavaScript clients. For more details, see the xref:assembly-managing-clients_{context}[Managing Clients] chapter.
{project_name} also supports the https://tools.ietf.org/html/rfc7636[Proof Key for Code Exchange] specification. {project_name} also supports the https://datatracker.ietf.org/doc/html/rfc7636[Proof Key for Code Exchange] specification.
[[_oidc-auth-flows-implicit]] [[_oidc-auth-flows-implicit]]
@ -55,7 +55,7 @@ redirects to the application using the callback URL and additionally adds the _i
[[_oidc-auth-flows-direct]] [[_oidc-auth-flows-direct]]
===== Resource Owner Password Credentials Grant (Direct Access Grants) ===== Resource owner password credentials grant (Direct Access Grants)
_Direct Access Grants_ are used by REST clients to obtain tokens on behalf of users. It is a HTTP POST request that contains: _Direct Access Grants_ are used by REST clients to obtain tokens on behalf of users. It is a HTTP POST request that contains:
@ -66,13 +66,13 @@ _Direct Access Grants_ are used by REST clients to obtain tokens on behalf of us
The HTTP response contains the _identity_, _access_, and _refresh_ tokens. The HTTP response contains the _identity_, _access_, and _refresh_ tokens.
[[_client_credentials_grant]] [[_client_credentials_grant]]
===== Client Credentials Grant ===== Client credentials grant
The _Client Credentials Grant_ creates a token based on the metadata and permissions of a service account associated with the client instead of obtaining a token that works on behalf of an external user. _Client Credentials Grants_ are used by REST clients. The _Client Credentials Grant_ creates a token based on the metadata and permissions of a service account associated with the client instead of obtaining a token that works on behalf of an external user. _Client Credentials Grants_ are used by REST clients.
See the <<_service_accounts,Service Accounts>> chapter for more information. See the <<_service_accounts,Service Accounts>> chapter for more information.
===== Device Authorization Grant ===== Device authorization grant
This is used by clients running on internet-connected devices that have limited input capabilities or lack a suitable browser. Here's a brief summary of the protocol: This is used by clients running on internet-connected devices that have limited input capabilities or lack a suitable browser. Here's a brief summary of the protocol:
@ -81,7 +81,7 @@ This is used by clients running on internet-connected devices that have limited
. The application repeatedly polls {project_name} to find out if the user completed the user authorization. If user authentication is complete, the application exchanges the device code for an _identity_, _access_ and _refresh_ token. . The application repeatedly polls {project_name} to find out if the user completed the user authorization. If user authentication is complete, the application exchanges the device code for an _identity_, _access_ and _refresh_ token.
[[_client_initiated_backchannel_authentication_grant]] [[_client_initiated_backchannel_authentication_grant]]
===== Client Initiated Backchannel Authentication Grant ===== Client initiated backchannel authentication grant
:tech_feature_name: Client Initiated Backchannel Authentication Grant :tech_feature_name: Client Initiated Backchannel Authentication Grant
:tech_feature_setting: -Dkeycloak.profile.feature.ciba=enabled :tech_feature_setting: -Dkeycloak.profile.feature.ciba=enabled
@ -298,3 +298,32 @@ User Resolver Provider is provided as SPI provider so that users of {project_nam
* Only support `login_hint` parameter and is used as default. * Only support `login_hint` parameter and is used as default.
* `username` of UserModel in {project_name} is used to represent the user on CD, {project_name} and the authentication entity. * `username` of UserModel in {project_name} is used to represent the user on CD, {project_name} and the authentication entity.
[[_oidc-logout]]
==== OIDC Logout
OIDC has three different specifications relevant to logout mechanisms, all of these are currently in draft status:
. https://openid.net/specs/openid-connect-session-1_0.html[Session Management]
. https://openid.net/specs/openid-connect-frontchannel-1_0.html[Front-Channel Logout]
. https://openid.net/specs/openid-connect-backchannel-1_0.html[Back-Channel Logout]
Again since all of this is described in the OIDC specification we will only give a brief overview here.
===== Session Management
This is a browser-based logout. The application obtains session status information from {project_name} at a regular basis.
When the session is terminated at {project_name} the application will notice and trigger it's own logout.
===== Frontchannel Logout
This is also a browser-based logout. In contrast to the Session Managment based logout approach {project_name} will send logout
requests to the clients. Applications or clients need to have a frontchannel logout URL registered at {project_name}.
After triggering a logout at {project_name}, it will send logout requests to these registered URLs that will terminate the client sessions.
===== Backchannel Logout
This is a non browser-based logout that uses direct backchannel communication between {project_name} and clients.
{project_name} sends a HTTP POST request containing a logout token to all clients logged into {project_name}. These
requests are sent to a registered backchannel logout URLs at {project_name} and are supposed to trigger a logout at client side.

Some files were not shown because too many files have changed in this diff Show more