Skip to content
This repository was archived by the owner on Sep 28, 2022. It is now read-only.

Commit e6f91dc

Browse files
author
Dominik František Bučík
authored
Merge pull request #36 from dBucik/acr_client_id
feat: 🎸 Forward client_id in AuthenticationContextClass
2 parents 8cf4b64 + 6a6d1e3 commit e6f91dc

File tree

3 files changed

+66
-3
lines changed

3 files changed

+66
-3
lines changed

perun-oidc-server-webapp/src/main/webapp/WEB-INF/user-context.xml

+2
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
<prop key="saml.internalReferrers"/> <!-- comma separated list of URLs (which are matched as prefixes) -->
134134
<prop key="saml.acrs.reserverdPrefixes">urn:cesnet:</prop>
135135
<prop key="saml.acrs.enableComparison">false</prop>
136+
<prop key="saml.acrs.onlyreserved.append">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</prop>
136137
<prop key="saml.user.attrIdentifier">eppn</prop><!-- eppn|epuid|eptid|uid|uniqueIdentifier -->
137138
<!-- STATS JDBC -->
138139
<prop key="stats.jdbc.url">jdbc:mariadb://localhost:3306/STATS</prop>
@@ -198,6 +199,7 @@
198199
<property name="idpMetadataFile" value="${saml.idp.metadataLocation}"/>
199200
<property name="idpMetadataUrl" value="${saml.idp.metadataUrl}"/>
200201
<property name="acrReservedPrefixes" value="#{'${saml.acrs.reserverdPrefixes}'.split('\s*,\s*')}"/>
202+
<property name="acrsToBeAdded" value="#{'${saml.acrs.onlyreserved.append}'.split('\s*,\s*')}"/>
201203
<property name="userIdentifierAttribute" value="${saml.user.attrIdentifier}"/>
202204
</bean>
203205

perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlEntryPoint.java

+55-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package cz.muni.ics.oidc.saml;
22

3+
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.CLIENT_ID_PREFIX;
34
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.EFILTER_PREFIX;
45
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.FILTER_PREFIX;
56
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.IDP_ENTITY_ID_PREFIX;
7+
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_CLIENT_ID;
68
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_PROMPT;
79
import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.REFEDS_MFA;
810

@@ -14,9 +16,13 @@
1416
import cz.muni.ics.oidc.server.filters.PerunFilterConstants;
1517
import java.io.IOException;
1618
import java.util.ArrayList;
19+
import java.util.Arrays;
1720
import java.util.HashMap;
21+
import java.util.HashSet;
22+
import java.util.LinkedList;
1823
import java.util.List;
1924
import java.util.Map;
25+
import java.util.Set;
2026
import javax.servlet.ServletException;
2127
import javax.servlet.http.HttpServletRequest;
2228
import javax.servlet.http.HttpServletResponse;
@@ -43,14 +49,18 @@ public class PerunSamlEntryPoint extends SAMLEntryPoint {
4349
private final PerunAdapter perunAdapter;
4450
private final PerunOidcConfig config;
4551
private final FacilityAttrsConfig facilityAttrsConfig;
52+
private final SamlProperties samlProperties;
4653

4754
@Autowired
48-
public PerunSamlEntryPoint(PerunAdapter perunAdapter, PerunOidcConfig config,
49-
FacilityAttrsConfig facilityAttrsConfig)
55+
public PerunSamlEntryPoint(PerunAdapter perunAdapter,
56+
PerunOidcConfig config,
57+
FacilityAttrsConfig facilityAttrsConfig,
58+
SamlProperties samlProperties)
5059
{
5160
this.perunAdapter = perunAdapter;
5261
this.config = config;
5362
this.facilityAttrsConfig = facilityAttrsConfig;
63+
this.samlProperties = samlProperties;
5464
}
5565

5666
@Override
@@ -163,15 +173,57 @@ private void processAcrValues(HttpServletRequest request, WebSSOProfileOptions o
163173
options.setForceAuthN(true);
164174
}
165175

176+
if (StringUtils.hasText(request.getParameter(PARAM_CLIENT_ID)) && config.isAddClientIdToAcrs()) {
177+
String clientIdAcr = CLIENT_ID_PREFIX + request.getParameter(PARAM_CLIENT_ID);
178+
log.debug("Adding client_id ACR ({}) to list of AuthnContextClassRefs for purposes" +
179+
" of displaying service name on the wayf", clientIdAcr);
180+
acrs.add(clientIdAcr);
181+
}
182+
166183
if (acrs.size() > 0) {
184+
185+
167186
options.setAuthnContexts(acrs);
168187
log.debug("Transformed acr_values ({}) to SAML AuthnContextClassRef ({})",
169188
acrValues, options.getAuthnContexts());
170189
}
171190
}
172191

192+
private void processAcrs(List<String> acrs) {
193+
if (acrs == null || acrs.isEmpty()) {
194+
return;
195+
}
196+
197+
String[] reservedAcrsPrefixes = samlProperties.getAcrReservedPrefixes();
198+
Set<String> reservedPrefixes = (reservedAcrsPrefixes != null) ?
199+
new HashSet<>(Arrays.asList(reservedAcrsPrefixes)) : new HashSet<>();
200+
if (reservedPrefixes.isEmpty()) {
201+
return;
202+
}
203+
204+
boolean hasNonReserved = false;
205+
for (String prefix: reservedPrefixes) {
206+
for (String acr: acrs) {
207+
if (!acr.startsWith(prefix)) {
208+
log.debug("ACR with non reserved prefix found: {}", acr);
209+
hasNonReserved = true;
210+
break;
211+
}
212+
}
213+
if (hasNonReserved) {
214+
break;
215+
}
216+
}
217+
218+
if (!hasNonReserved) {
219+
List<String> toBeAdded = new LinkedList<>(Arrays.asList(samlProperties.getAcrsToBeAdded()));
220+
log.debug("NO ACR with non reserved prefix found, adding following: {}", toBeAdded);
221+
acrs.addAll(toBeAdded);
222+
}
223+
}
224+
173225
private List<String> convertAcrValuesToList(String acrValues) {
174-
List<String> acrs = new ArrayList<>();
226+
List<String> acrs = new LinkedList<>();
175227
if (StringUtils.hasText(acrValues)) {
176228
String[] parts = acrValues.split(" ");
177229
if (parts.length > 0) {

perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/SamlProperties.java

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class SamlProperties implements InitializingBean {
2323
private String idpMetadataFile;
2424
private String idpMetadataUrl;
2525
private String[] acrReservedPrefixes;
26+
private String[] acrsToBeAdded;
2627
private String userIdentifierAttribute;
2728

2829
public String getEntityID() {
@@ -127,6 +128,14 @@ public void setAcrReservedPrefixes(String[] acrReservedPrefixes) {
127128
}
128129
}
129130

131+
public String[] getAcrsToBeAdded() {
132+
return acrsToBeAdded;
133+
}
134+
135+
public void setAcrsToBeAdded(String[] acrsToBeAdded) {
136+
this.acrsToBeAdded = acrsToBeAdded;
137+
}
138+
130139
public String getUserIdentifierAttribute() {
131140
return userIdentifierAttribute;
132141
}

0 commit comments

Comments
 (0)