Skip to content

Commit 598da0d

Browse files
Support tokens from Altinn Test Tools in IAuthenticationContext/Authenticated and correctly set InAltinnPortal for localtest tokens (#1204)
1 parent f1c6731 commit 598da0d

16 files changed

+1025
-162
lines changed

src/Altinn.App.Core/Features/Auth/Authenticated.cs

Lines changed: 74 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,21 @@ public async Task<Details> LoadDetails()
594594
// TODO: app token?
595595
// public sealed record App(string Token) : Authenticated;
596596

597+
internal delegate Authenticated Parser(
598+
string tokenStr,
599+
bool isAuthenticated,
600+
ApplicationMetadata appMetadata,
601+
Func<string?> getSelectedParty,
602+
Func<int, Task<UserProfile?>> getUserProfile,
603+
Func<int, Task<Party?>> lookupUserParty,
604+
Func<string, Task<Party>> lookupOrgParty,
605+
Func<int, Task<List<Party>?>> getPartyList,
606+
Func<int, int, Task<bool?>> validateSelectedParty
607+
);
608+
597609
internal static Authenticated FromLocalTest(
598610
string tokenStr,
611+
bool isAuthenticated,
599612
ApplicationMetadata appMetadata,
600613
Func<string?> getSelectedParty,
601614
Func<int, Task<UserProfile?>> getUserProfile,
@@ -607,7 +620,7 @@ internal static Authenticated FromLocalTest(
607620
{
608621
var context = new ParseContext(
609622
tokenStr,
610-
!string.IsNullOrWhiteSpace(tokenStr),
623+
isAuthenticated,
611624
appMetadata,
612625
getSelectedParty,
613626
getUserProfile,
@@ -622,14 +635,15 @@ internal static Authenticated FromLocalTest(
622635
var handler = new JwtSecurityTokenHandler();
623636
var token = handler.ReadJwtToken(tokenStr);
624637

625-
context.TokenIssuer = TokenIssuer.Altinn;
626-
context.IsExchanged = true;
627-
628638
context.ReadClaims(token);
629639

640+
context.TokenIssuer = context.OrgNoClaim.Exists ? TokenIssuer.Maskinporten : TokenIssuer.Altinn;
641+
context.IsExchanged =
642+
context.TokenIssuer == TokenIssuer.Maskinporten || context.TokenIssuer == TokenIssuer.IDporten;
630643
context.Scopes = context.ScopeClaim.IsValidString(out var scopeClaimValue)
631644
? new Scopes(scopeClaimValue)
632645
: new Scopes(null);
646+
context.IsInAltinnPortal = context.UserIdClaim.Exists;
633647

634648
int? partyId = null;
635649
if (context.PartyIdClaim.Exists)
@@ -709,6 +723,7 @@ internal record struct ParseContext(
709723
)
710724
{
711725
public TokenClaim IssuerClaim = default;
726+
public TokenClaim ActualIssuerClaim = default;
712727
public TokenClaim AuthLevelClaim = default;
713728
public TokenClaim AuthMethodClaim = default;
714729
public TokenClaim ScopeClaim = default;
@@ -804,6 +819,7 @@ public void ReadClaims(JwtSecurityToken token)
804819
foreach (var claim in token.Payload)
805820
{
806821
TryAssign(claim, JwtClaimTypes.Issuer, ref IssuerClaim);
822+
TryAssign(claim, "actual_iss", ref ActualIssuerClaim);
807823
TryAssign(claim, AltinnCoreClaimTypes.AuthenticationLevel, ref AuthLevelClaim);
808824
TryAssign(claim, AltinnCoreClaimTypes.AuthenticateMethod, ref AuthMethodClaim);
809825
TryAssign(claim, JwtClaimTypes.Scope, ref ScopeClaim);
@@ -867,7 +883,13 @@ internal static Authenticated From(
867883
context.Scopes = context.ScopeClaim.IsValidString(out var scopeClaimValue)
868884
? new Scopes(scopeClaimValue)
869885
: new Scopes(null);
870-
context.IsInAltinnPortal = context.Scopes.HasScope("altinn:portal/enduser");
886+
context.IsInAltinnPortal =
887+
context.Scopes.HasScope("altinn:portal/enduser")
888+
|| (
889+
context.ActualIssuerClaim.IsValidString(out var actualIssuer)
890+
&& actualIssuer == "altinn-test-tools"
891+
&& context.UserIdClaim.Exists
892+
);
871893

872894
context.ResolveIssuer();
873895

@@ -918,12 +940,13 @@ static Authenticated NewUser(ref ParseContext context)
918940
{
919941
if (!context.UserIdClaim.Exists)
920942
throw new AuthenticationContextException("Missing user ID claim for user token");
921-
if (!context.UserIdClaim.IsValidString(out var userIdStr))
943+
944+
if (!context.UserIdClaim.IsValidInt(out var userId))
945+
{
922946
throw new AuthenticationContextException(
923947
$"Invalid user ID claim value for user token: {context.UserIdClaim.Value}"
924948
);
925-
if (!int.TryParse(userIdStr, CultureInfo.InvariantCulture, out var userId))
926-
throw new AuthenticationContextException($"Invalid user ID claim value for user token: {userIdStr}");
949+
}
927950

928951
if (!context.PartyIdClaim.Exists)
929952
throw new AuthenticationContextException("Missing party ID for user token");
@@ -941,7 +964,13 @@ static Authenticated NewUser(ref ParseContext context)
941964
if (!context.UsernameClaim.IsValidString(out var usernameClaimValue))
942965
throw new AuthenticationContextException("Missing username claim for self-identified user token");
943966

944-
return new SelfIdentifiedUser(usernameClaimValue, userId, partyId.Value, authMethodClaimValue, ref context);
967+
return new SelfIdentifiedUser(
968+
usernameClaimValue,
969+
userId.Value,
970+
partyId.Value,
971+
authMethodClaimValue,
972+
ref context
973+
);
945974
}
946975

947976
int selectedPartyId = partyId.Value;
@@ -953,7 +982,7 @@ static Authenticated NewUser(ref ParseContext context)
953982
selectedPartyId = selectedParty;
954983
}
955984

956-
return new User(userId, partyId.Value, authLevel, authMethodClaimValue, selectedPartyId, ref context);
985+
return new User(userId.Value, partyId.Value, authLevel, authMethodClaimValue, selectedPartyId, ref context);
957986
}
958987

959988
static Org NewOrg(ref ParseContext context)
@@ -971,17 +1000,7 @@ static SystemUser NewSystemUser(ref ParseContext context)
9711000
{
9721001
if (!context.AuthorizationDetailsClaim.IsJson(out var json))
9731002
throw new AuthenticationContextException($"Invalid authorization details claim value for token: {json}");
974-
var authorizationDetails = json.Value.ValueKind switch
975-
{
976-
JsonValueKind.Object => JsonSerializer.Deserialize<AuthorizationDetailsClaim>(json.Value),
977-
JsonValueKind.Array when json.Value.GetArrayLength() == 1 => JsonSerializer
978-
.Deserialize<AuthorizationDetailsClaim[]>(json.Value)
979-
?[0],
980-
_ => throw new AuthenticationContextException(
981-
"Invalid authorization details claim value for systemuser token: "
982-
+ context.AuthorizationDetailsClaim.Value
983-
),
984-
};
1003+
var authorizationDetails = AuthorizationDetailsClaim.Parse(json.Value);
9851004
if (authorizationDetails is null)
9861005
throw new AuthenticationContextException("Invalid authorization details claim value for systemuser token");
9871006
if (authorizationDetails is not SystemUserAuthorizationDetailsClaim systemUser)
@@ -1061,10 +1080,25 @@ public bool IsValidInt([NotNullWhen(true)] out int? integer)
10611080
{
10621081
integer = null;
10631082

1064-
if (Type is not null && Value is int intValue)
1083+
if (Type is not null)
10651084
{
1066-
integer = intValue;
1067-
return true;
1085+
if (Value is int intValue)
1086+
{
1087+
integer = intValue;
1088+
return true;
1089+
}
1090+
// We parse tokens from various different sources:
1091+
// * altinn-authentication
1092+
// * localtest
1093+
// * AltinnTesTools
1094+
// * TestAuthentication (this repo)
1095+
// All of them have slight differences in how values encoded in the JWT payload,
1096+
// so that's why we are flexible here...
1097+
if (Value is string strValue && int.TryParse(strValue, CultureInfo.InvariantCulture, out intValue))
1098+
{
1099+
integer = intValue;
1100+
return true;
1101+
}
10681102
}
10691103

10701104
return false;
@@ -1086,7 +1120,22 @@ public bool IsJson([NotNullWhen(true)] out JsonElement? json)
10861120

10871121
[JsonPolymorphic(TypeDiscriminatorPropertyName = "type")]
10881122
[JsonDerivedType(typeof(SystemUserAuthorizationDetailsClaim), typeDiscriminator: "urn:altinn:systemuser")]
1089-
internal record AuthorizationDetailsClaim();
1123+
internal record AuthorizationDetailsClaim()
1124+
{
1125+
public static AuthorizationDetailsClaim? Parse(JsonElement json)
1126+
{
1127+
return json.ValueKind switch
1128+
{
1129+
JsonValueKind.Object => JsonSerializer.Deserialize<AuthorizationDetailsClaim>(json),
1130+
JsonValueKind.Array when json.GetArrayLength() == 1 => JsonSerializer
1131+
.Deserialize<AuthorizationDetailsClaim[]>(json)
1132+
?[0],
1133+
_ => throw new AuthenticationContextException(
1134+
"Invalid authorization details claim value for systemuser token: " + json
1135+
),
1136+
};
1137+
}
1138+
}
10901139

10911140
internal sealed record SystemUserAuthorizationDetailsClaim(
10921141
[property: JsonPropertyName("systemuser_id")] IReadOnlyList<Guid> SystemUserId,

src/Altinn.App.Core/Features/Auth/AuthenticationContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public Authenticated Current
6969
{
7070
authInfo = Authenticated.FromLocalTest(
7171
tokenStr: token,
72+
isAuthenticated: true,
7273
_appConfigurationCache.ApplicationMetadata,
7374
() => _httpContext.Request.Cookies[_generalSettings.CurrentValue.GetAltinnPartyCookieName],
7475
_profileClient.GetUserProfile,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
Description: Maskinporten exchanged org token (not service owner),
3+
AuthType: Altinn.App.Core.Features.Auth.Authenticated+Org,
4+
Auth: {
5+
OrgNo: 991825827,
6+
AuthenticationLevel: 3,
7+
AuthenticationMethod: maskinporten,
8+
TokenIssuer: Maskinporten,
9+
TokenIsExchanged: true,
10+
Scopes: altinn:instances.read altinn:instances.write,
11+
Token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ4RDg2N0M3RDUyMTM2MEY0RjM1Q0Q1MTU4MEM0OUEwNTE2NUQ0RTEiLCJ4NXQiOiIyTmhueDlVaE5nOVBOYzFSV0F4Sm9GRmwxT0UiLCJ0eXAiOiJKV1QifQ.eyJzY29wZSI6ImFsdGlubjppbnN0YW5jZXMucmVhZCBhbHRpbm46aW5zdGFuY2VzLndyaXRlIiwidG9rZW5fdHlwZSI6IkJlYXJlciIsImV4cCI6MTczNzg0NDE1NywiaWF0IjoxNzM3ODQyMzU3LCJjbGllbnRfaWQiOiIwNDRmNTA0MC01NGUzLTRhMjctYTIyMS1hODUxNGZkMzBjYTkiLCJjb25zdW1lciI6eyJhdXRob3JpdHkiOiJpc282NTIzLWFjdG9yaWQtdXBpcyIsIklEIjoiMDE5Mjo5OTE4MjU4MjcifSwidXJuOmFsdGlubjpvcmdOdW1iZXIiOiI5OTE4MjU4MjciLCJ1cm46YWx0aW5uOmF1dGhlbnRpY2F0ZW1ldGhvZCI6Im1hc2tpbnBvcnRlbiIsInVybjphbHRpbm46YXV0aGxldmVsIjozLCJpc3MiOiJodHRwczovL3BsYXRmb3JtLnR0MDIuYWx0aW5uLm5vL2F1dGhlbnRpY2F0aW9uL2FwaS92MS9vcGVuaWQvIiwianRpIjoiMzUwYWNhOTYtYjNkZi00YTdmLTg4YWItOWY4ZDc4ZDYxMjI0IiwibmJmIjoxNzM3ODQyMzU3fQ.g6EFkX6pAKtA64p11CpoTDU6Nzzst4duOzBletMAexEmX-V5C4rXsndkwK3pL9JpZNBbjBZZaEAbBta177PIQo208dZwzYV2meLrip5fQ-hnWF3Ub0VdpxcgggDbcx8WqT1HSix-GQlNcSe2uyZB0KZ_8GRB2aKXjatX4R392A3CZfzBq8Dt3ra5AP0pWVxJAd4NuKHPQRKGbNWkC62J92zLYYtTz4j8DS9yogeP28hrcLzuqyVScDndmOiIjeexXXWdgrwVLDBO2mpVU_i4xqRUbjK9UdySrrkYfv-ZIZQRoZsyPE3ab0SDym-4kVxSIp4xyH3nQuzZJqz24LuBcw
12+
},
13+
Jwt: {
14+
client_id: 044f5040-54e3-4a27-a221-a8514fd30ca9,
15+
consumer: {
16+
ValueKind: Object
17+
},
18+
exp: 1737844157,
19+
iat: 1737842357,
20+
iss: https://platform.tt02.altinn.no/authentication/api/v1/openid/,
21+
jti: 350aca96-b3df-4a7f-88ab-9f8d78d61224,
22+
nbf: 1737842357,
23+
scope: altinn:instances.read altinn:instances.write,
24+
token_type: Bearer,
25+
urn:altinn:authenticatemethod: maskinporten,
26+
urn:altinn:authlevel: 3,
27+
urn:altinn:orgNumber: 991825827
28+
},
29+
Details: {
30+
Party: {
31+
PartyId: 1234,
32+
PartyTypeName: Organisation,
33+
OrgNumber: 991825827,
34+
Name: Test AS,
35+
IsDeleted: false,
36+
OnlyHierarchyElementWithNoAccess: false
37+
},
38+
CanInstantiate: true
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{
2+
Description: Altinn portal tt02 self identified, token extracted from AltinnStudioRuntime cookie,
3+
AuthType: Altinn.App.Core.Features.Auth.Authenticated+SelfIdentifiedUser,
4+
Auth: {
5+
Username: martinothamar,
6+
UserId: 1428813,
7+
PartyId: 53328660,
8+
AuthenticationMethod: SelfIdentified,
9+
TokenIssuer: Altinn,
10+
TokenIsExchanged: false,
11+
Scopes: altinn:portal/enduser,
12+
Token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ4RDg2N0M3RDUyMTM2MEY0RjM1Q0Q1MTU4MEM0OUEwNTE2NUQ0RTEiLCJ4NXQiOiIyTmhueDlVaE5nOVBOYzFSV0F4Sm9GRmwxT0UiLCJ0eXAiOiJKV1QifQ.eyJuYW1laWQiOiIxNDI4ODEzIiwidXJuOmFsdGlubjp1c2VyaWQiOiIxNDI4ODEzIiwidXJuOmFsdGlubjp1c2VybmFtZSI6Im1hcnRpbm90aGFtYXIiLCJ1cm46YWx0aW5uOnBhcnR5aWQiOjUzMzI4NjYwLCJ1cm46YWx0aW5uOmF1dGhlbnRpY2F0ZW1ldGhvZCI6IlNlbGZJZGVudGlmaWVkIiwidXJuOmFsdGlubjphdXRobGV2ZWwiOjAsImp0aSI6Ijg3OGFkMDZiLWE0Y2EtNDFhZi04YjQzLWY3NTE2Mzk3Yzc3NyIsInNjb3BlIjoiYWx0aW5uOnBvcnRhbC9lbmR1c2VyIiwibmJmIjoxNzM3ODE1NjU0LCJleHAiOjE3Mzc4MTc0NTQsImlhdCI6MTczNzgxNTY1NH0.RLnlBcd_mfgixYkZcePG09iMsAk2XM25FdifashYcLEtebutWEub89GZyFHus7oLbCj_yDiyE1Rilpi3qBxUo9wVPH20ZsmFK5XX1jq7K_wzTsQGYlXPkjROyuXObOW1vuPZL973PEuSsFSc0MX38RfpHlOx7QZHx8gxOES3LwLFqCpdSCmTvsbPXmpHu4SKUb0BcaUFH3flexgbry4hixQbO65v6cQP7Od3A-5tTLCtPsBzCRY3u4EqbCVSJvXAj5x0PEYe-rKgQmY6nQl_dPfCre3uksPlKQeWtdDrmR1YiFfvKfg1DD_Fcf9wjeVGavyRh4qYhFV_7jueueGoqQ
13+
},
14+
Jwt: {
15+
exp: 1737817454,
16+
iat: 1737815654,
17+
jti: 878ad06b-a4ca-41af-8b43-f7516397c777,
18+
nameid: 1428813,
19+
nbf: 1737815654,
20+
scope: altinn:portal/enduser,
21+
urn:altinn:authenticatemethod: SelfIdentified,
22+
urn:altinn:authlevel: 0,
23+
urn:altinn:partyid: 53328660,
24+
urn:altinn:userid: 1428813,
25+
urn:altinn:username: martinothamar
26+
},
27+
Details: {
28+
Party: {
29+
PartyId: 53328660,
30+
PartyTypeName: Person,
31+
SSN: 12345678901,
32+
Name: Test Testesen,
33+
IsDeleted: false,
34+
OnlyHierarchyElementWithNoAccess: false
35+
},
36+
Profile: {
37+
UserId: 1428813,
38+
IsReserved: false,
39+
PartyId: 53328660,
40+
Party: {
41+
PartyId: 53328660,
42+
PartyTypeName: Person,
43+
SSN: 12345678901,
44+
Name: Test Testesen,
45+
IsDeleted: false,
46+
OnlyHierarchyElementWithNoAccess: false
47+
}
48+
},
49+
RepresentsSelf: true,
50+
CanInstantiate: true
51+
}
52+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
Description: GetTestOrgToken in localtest,
3+
AuthType: Altinn.App.Core.Features.Auth.Authenticated+ServiceOwner,
4+
Auth: {
5+
Name: skd,
6+
OrgNo: 974761076,
7+
AuthenticationLevel: 3,
8+
AuthenticationMethod: localtest,
9+
TokenIssuer: Maskinporten,
10+
TokenIsExchanged: true,
11+
Token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjQ4Q0VFNjAzMzEwMkYzMjQzMTk2NDc4QUYwNkZCNDNBMTc2NEQ4NDMiLCJ4NXQiOiJTTTdtQXpFQzh5UXhsa2VLOEctME9oZGsyRU0iLCJ0eXAiOiJKV1QifQ.eyJ1cm46YWx0aW5uOm9yZyI6InNrZCIsInVybjphbHRpbm46YXV0aGxldmVsIjozLCJ1cm46YWx0aW5uOnNjb3BlIjoiYWx0aW5uOnNlcnZpY2Vvd25lci9pbnN0YW5jZXMud3JpdGUgYWx0aW5uOnNlcnZpY2Vvd25lci9pbnN0YW5jZXMucmVhZCIsInVybjphbHRpbm46b3JnTnVtYmVyIjoiOTc0NzYxMDc2IiwibmJmIjoxNzQyOTA2NDYyLCJleHAiOjE3NDI5NjQwNjIsImlhdCI6MTc0MjkwNjQ2Mn0.UJSqOGZG3xCMH7KUx148NhPvARATpI2yzK4RxxL_Fe2XqtEaRJQX6IBMTbfu-WLdHZ8l4m7Epk7cJwxE1ek3BP1XMayq95rrNIwjcXoicDBfLUb7Ug2II89jKd-pCinuZGT8ai4LmKz8ydPAXgq6fV1ExctsqcTQhQIbgDYa9TFVKInpmv3Mj9f7vdiJKdfuxE_rHOzu8cqUVECLvK4AU602pnw9JvclAXa53hBkDlHmNv8-JzVUdqkEMBiPrWklWDZqHNZuVkKrrvS_5-dS9Z6rjZ9IcnMZ2fSRNoTHO85qtVqGzTzLsN0QjRXOYGk_mZVD4LVjOp7JBDuWqcpefQ
12+
},
13+
Jwt: {
14+
exp: 1742964062,
15+
iat: 1742906462,
16+
nbf: 1742906462,
17+
urn:altinn:authlevel: 3,
18+
urn:altinn:org: skd,
19+
urn:altinn:orgNumber: 974761076,
20+
urn:altinn:scope: altinn:serviceowner/instances.write altinn:serviceowner/instances.read
21+
},
22+
Details: {
23+
Party: {
24+
PartyId: 1234,
25+
PartyTypeName: Organisation,
26+
OrgNumber: 974761076,
27+
Name: Test AS,
28+
IsDeleted: false,
29+
OnlyHierarchyElementWithNoAccess: false
30+
}
31+
}
32+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
Description: Altinn-Test-Tools GetEnterpriseToken,
3+
AuthType: Altinn.App.Core.Features.Auth.Authenticated+ServiceOwner,
4+
Auth: {
5+
Name: digdir,
6+
OrgNo: 991825827,
7+
AuthenticationLevel: 3,
8+
AuthenticationMethod: maskinporten,
9+
TokenIssuer: Maskinporten,
10+
TokenIsExchanged: true,
11+
Scopes: altinn:serviceowner/instances.read altinn:serviceowner/instances.write,
12+
Token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ4RDg2N0M3RDUyMTM2MEY0RjM1Q0Q1MTU4MEM0OUEwNTE2NUQ0RTEiLCJ0eXAiOiJKV1QiLCJ4NWMiOiJEOEQ4NjdDN0Q1MjEzNjBGNEYzNUNENTE1ODBDNDlBMDUxNjVENEUxIn0.eyJzY29wZSI6ImFsdGlubjpzZXJ2aWNlb3duZXIvaW5zdGFuY2VzLnJlYWQgYWx0aW5uOnNlcnZpY2Vvd25lci9pbnN0YW5jZXMud3JpdGUiLCJ0b2tlbl90eXBlIjoiQmVhcmVyIiwiZXhwIjoxNzQyOTA5NDk3LCJpYXQiOjE3NDI5MDc2OTcsImNsaWVudF9pZCI6Ijc0M2U5MGZkLTAyMDItNDM5ZC05MzYwLTViYmZiOGU5MGYzYiIsImp0aSI6IkJIWTFzTXAxZGdCeEdOWDBjczdvUWNBdG1wVUlDdTlzY3A1dUFIY0F3T2YiLCJjb25zdW1lciI6eyJhdXRob3JpdHkiOiJpc282NTIzLWFjdG9yaWQtdXBpcyIsIklEIjoiMDE5Mjo5OTE4MjU4MjcifSwidXJuOmFsdGlubjpvcmdOdW1iZXIiOiI5OTE4MjU4MjciLCJ1cm46YWx0aW5uOmF1dGhlbnRpY2F0ZW1ldGhvZCI6Im1hc2tpbnBvcnRlbiIsInVybjphbHRpbm46YXV0aGxldmVsIjozLCJpc3MiOiJodHRwczovL3BsYXRmb3JtLnR0MDIuYWx0aW5uLm5vL2F1dGhlbnRpY2F0aW9uL2FwaS92MS9vcGVuaWQvIiwiYWN0dWFsX2lzcyI6ImFsdGlubi10ZXN0LXRvb2xzIiwibmJmIjoxNzQyOTA3Njk3LCJ1cm46YWx0aW5uOm9yZyI6ImRpZ2RpciJ9.YOX4cViSE1KG_sf3alCkR-aXDOJu1R850OS6fBBu7HYDitTa9DO4aoISeu42NzAjxMcpBee1r3wsg2n13cdAOs_Ab2BH385u_1EN-afXZURx9OjMr2SyWfDvVIEYGatiqpNB7pFf1zek8dJYRQfo3aenfOGuJTszHK0HAY_S7U2_ziMdXMWTUKlChel_lsGb40kUuTHLcUHwl5b10efU4dv-QZsj1PM_QHYDLikd6mCxS2KbqiAutcpdsv2zNgmh4uwXuntXvFF9X8oK0bkLlX8nNGvcWCsy9oRgLtq2y8cWUoVU89FgFR2NaHaEIdXIUwTCrxFzdIWZjEkMR1RYag
13+
},
14+
Jwt: {
15+
actual_iss: altinn-test-tools,
16+
client_id: 743e90fd-0202-439d-9360-5bbfb8e90f3b,
17+
consumer: {
18+
ValueKind: Object
19+
},
20+
exp: 1742909497,
21+
iat: 1742907697,
22+
iss: https://platform.tt02.altinn.no/authentication/api/v1/openid/,
23+
jti: BHY1sMp1dgBxGNX0cs7oQcAtmpUICu9scp5uAHcAwOf,
24+
nbf: 1742907697,
25+
scope: altinn:serviceowner/instances.read altinn:serviceowner/instances.write,
26+
token_type: Bearer,
27+
urn:altinn:authenticatemethod: maskinporten,
28+
urn:altinn:authlevel: 3,
29+
urn:altinn:org: digdir,
30+
urn:altinn:orgNumber: 991825827
31+
},
32+
Details: {
33+
Party: {
34+
PartyId: 1234,
35+
PartyTypeName: Organisation,
36+
OrgNumber: 991825827,
37+
Name: Test AS,
38+
IsDeleted: false,
39+
OnlyHierarchyElementWithNoAccess: false
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)