DK privilege - trasformazioni delle claims
FoxIDs supporta la conversione del privilege XML DK in JSON, rendendo i token leggibili e la struttura dei privilegi piu semplice da usare. Il privilege DK viene usato nel NemLog-in danese e nel Context Handler (in danese chiamato Faelleskommunal Adgangsstyring).
Standard privilege supportato:
- OIO Basic Privilege Profile, Version 1.2
- FoxIDs supporta gli elementi
PrivilegeGroupdefiniti nel model 2 (scoping e delega) e nel model 3 (scoping, delega e vincolo). - FoxIDs supporta sia la lettura della stringa privilege codificata in base64 dalla claim standard
https://data.gov.dk/model/core/eid/privilegesIntermediatesia da una claim definita personalizzata.
Configuring DK privilege - claim transforms
Il privilege DK puo essere configurato sia in un metodo di autenticazione e registrazione applicazione SAML 2.0 sia in un metodo di autenticazione e registrazione applicazione OpenID Connect.
- La claim SAML 2.0
https://data.gov.dk/model/core/eid/privilegesIntermediateviene trasformata. - La claim OpenID Connect / JWT
privileges_intermediateviene trasformata.
Configura il trasformatore di claim privilege DK sul metodo di autenticazione SAML 2.0 in FoxIDs Control Client:
- Seleziona la scheda Claim transform
- Fai clic su Add claim transform e poi su DK XML privilege to JSON
- Fai clic su Update

Model 2
La claim privilege DK viene trasformata in un elenco di claims, una claim per ogni gruppo. L'elemento XML PrivilegeGroup viene trasformato in un oggetto JSON e serializzato come stringa.
I 4 scope possibili vengono tradotti in proprieta con un nome breve:
Scope="urn:dk:gov:saml:cvrNumberIdentifier:<cvr_number>"diventa"cvr": "<cvr_number>"Scope="urn:dk:gov:saml:productionUnitIdentifier:<p_number>"diventa"p": "<p_number>"Scope="urn:dk:gov:saml:seNumberIdentifier:<se_number>"diventa"se": "<se_number>"Scope="urn:dk:gov:saml:cprNumberIdentifier:<cpr_number>"diventa"cpr": "<cpr_number>"
L'elemento o gli elementi Privilege vengono tradotti nella proprieta p con i valori privilege come elenco.
Esempio privilege DK decodificato da base64: (con spazi extra e interruzioni di riga solo a scopo di visualizzazione)
<?xml version="1.0" encoding="UTF-8"?>
<bpp:PrivilegeList xmlns:bpp="http://digst.dk/oiosaml/basic_privilege_profile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<PrivilegeGroup Scope="urn:dk:gov:saml:cvrNumberIdentifier:12345678">
<Privilege>urn:dk:some_domain:myPrivilege1A</Privilege>
<Privilege>urn:dk:some_domain:myPrivilege1B</Privilege>
</PrivilegeGroup>
<PrivilegeGroup Scope="urn:dk:gov:saml:seNumberIdentifier:27384223">
<Privilege>urn:dk:some_domain:myPrivilege1C</Privilege>
<Privilege>urn:dk:some_domain:myPrivilege1D</Privilege>
</PrivilegeGroup>
</bpp:PrivilegeList>
Viene tradotto in due claims con valori JSON: (con spazi extra e interruzioni di riga solo a scopo di visualizzazione)
{
"cvr": "12345678",
"p": [ "urn:dk:some_domain:myPrivilege1A", "urn:dk:some_domain:myPrivilege1B" ]
}
e
{
"se": "27384223",
"p": [ "urn:dk:some_domain:myPrivilege1C", "urn:dk:some_domain:myPrivilege1D" ]
}
Model 3
Model 3 e un'estensione di Model 2.
L'elemento o gli elementi Constraint vengono tradotti nella proprieta c con i constraint come elenco di coppie chiave-valore.
Esempio privilege DK decodificato da base64: (con spazi extra e interruzioni di riga solo a scopo di visualizzazione)
<?xml version="1.0" encoding="UTF-8"?>
<bpp:PrivilegeList xmlns:bpp="http://digst.dk/oiosaml/basic_privilege_profile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<PrivilegeGroup Scope="urn:dk:gov:saml:cvrNumberIdentifier:12345678">
<Constraint Name="urn:dk:kombit:KLE">25.*</Constraint>
<Constraint Name="urn:dk:kombit:sensitivity">3</Constraint>
<Privilege>urn:dk:kombit:system_xyz:view_case</Privilege>
</PrivilegeGroup>
</bpp:PrivilegeList>
Viene tradotto in una claim con valori JSON: (con spazi extra e interruzioni di riga solo a scopo di visualizzazione)
{
"cvr": "12345678",
"c": [ { "urn:dk:kombit:KLE": "25.*" }, { "urn:dk:kombit:sensitivity": "3" } ]
"p": [ "urn:dk:kombit:system_xyz:view_case" ]
}
Using JSON privilege claim in an application
La registrazione applicazione riceve la claim privilege con il privilege serializzato come stringa JSON.
L'esempio di codice C# seguente mostra come deserializzare la claim JSON in un oggetto in un'applicazione ASP.NET Core usando Newtonsoft.Json.
Crea la classe privilege group
public class DkPrivilegeGroup
{
[JsonProperty(PropertyName = "cvr")]
public string CvrNumber { get; set; }
[JsonProperty(PropertyName = "pu")]
public string ProductionUnit { get; set; }
[JsonProperty(PropertyName = "se")]
public string SeNumber { get; set; }
[JsonProperty(PropertyName = "cpr")]
public string CprNumber { get; set; }
[JsonProperty(PropertyName = "c")]
public Dictionary<string, string> Constraint { get; set; }
[JsonProperty(PropertyName = "p")]
public List<string> Privilege { get; set; }
}
e deserializza la claim, ad esempio, in un controller
var privileges = User.Claims.Where(c => c.Type == "privilege")
.Select(c => JsonConvert.DeserializeObject<DkPrivilegeGroup>(c.Value)).ToList();
foreach(var privilege in privileges)
{
// TODO gestire l'accesso in base al privilege
}