Skip to content

Commit b0839f1

Browse files
jonkjetiloyeJon Kjetil Øye
andauthored
Integrate PDP with OED as external authorization source (#474)
* Integrate PDP with OED as external authorization source #343 - Added new OedAuthzClient for integration with the oed-authz API - Added new dependency to Altinn.ApiClients.Maskinporten v9.0.0 - Added new OedAuthzMaskinportenClientDefinition and Configuration - Added new OedRoleAssignmentWrapper service - Added new SBL bridge API client and service for getting SSN from UserId and PartyId Other relevant changes: - ContextHandler will now retrieve and evaluate policy for the App or Resource and evaluate the subjects of the rules. If any 'urn:altinn:rolecode' subjects are found Altinn roles will be retrieved. If any 'urn:oed:rolecode' subjects are found OED roles will be retrieved. Additional PR made for studio-ops repo for both new (Maskinporten client config) and changes existing to configuration values (SBL bridge API path) * Update for PR comments * Added caching for getting the subjects from the policy * NB!: This will change will fail until ABAC project is updated with the new helper on XacmlPolicy for getting attribute values by category. - Changed some references from OED to Digitalt Dødsbo to match new naming - Renamed "urn:oed:rolecode" attributeId to "urn:digitaltdodsbo:rolecode" - Logic for extracting AttributeIds and Values reimplemented as a generic helper method on the XacmlPolicy object in ABAC project * Fix datatype returned by XacmlPolicy * Update ABAC package version to 0.0.6 * Marked OedRoleAssignmentWrapper excluded from codecoverage as integration tests rely on mock implementation * removed quotes character from log statement --------- Co-authored-by: Jon Kjetil Øye <[email protected]>
1 parent 4581c94 commit b0839f1

File tree

49 files changed

+1658
-18
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1658
-18
lines changed

src/Authorization/Altinn.Platform.Authorization.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="Altinn.ApiClients.Maskinporten" Version="9.0.0" />
1011
<PackageReference Include="Altinn.Common.AccessTokenClient" Version="1.1.4" />
1112
<PackageReference Include="Altinn.Common.PEP" Version="1.3.0" />
1213
<PackageReference Include="Altinn.Platform.Models" Version="1.2.0" />
@@ -15,7 +16,7 @@
1516
<PackageReference Include="Azure.Storage.Blobs" Version="12.18.0" />
1617
<PackageReference Include="Azure.Storage.Queues" Version="12.16.0" />
1718
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.21.0" />
18-
<PackageReference Include="Altinn.Authorization.ABAC" Version="0.0.5" />
19+
<PackageReference Include="Altinn.Authorization.ABAC" Version="0.0.6" />
1920
<PackageReference Include="Altinn.Platform.Storage.Interface" Version="3.24.0" />
2021
<PackageReference Include="JWTCookieAuthentication" Version="3.0.1" />
2122
<PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.20.0" />
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using System.Net.Http;
3+
using System.Net.Http.Headers;
4+
using System.Threading.Tasks;
5+
using Altinn.Platform.Authorization.Configuration;
6+
using Microsoft.Extensions.Options;
7+
8+
namespace Altinn.Platform.Authorization.Clients
9+
{
10+
/// <summary>
11+
/// Client configuration for Oed Authz API integration
12+
/// </summary>
13+
public class OedAuthzClient
14+
{
15+
/// <summary>
16+
/// Gets an instance of httpclient from httpclientfactory
17+
/// </summary>
18+
public HttpClient Client { get; }
19+
20+
/// <summary>
21+
/// Initializes the http client for retrieving Oed Authz role-assignments
22+
/// </summary>
23+
/// <param name="client">the http client</param>
24+
/// <param name="settings">the general settings configured for the authorization component</param>
25+
public OedAuthzClient(HttpClient client, IOptions<GeneralSettings> settings)
26+
{
27+
GeneralSettings generalSettings = settings.Value;
28+
Client = client;
29+
Client.BaseAddress = new Uri(generalSettings.OedAuthzApiEndpoint);
30+
Client.DefaultRequestHeaders.Clear();
31+
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
32+
}
33+
34+
/// <summary>
35+
/// post request that gets OED roleassignments
36+
/// </summary>
37+
/// <param name="requestBody">the request body</param>
38+
/// <param name="token">the bearer token</param>
39+
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
40+
public async Task<HttpResponseMessage> GetOedRoleAssignments(StringContent requestBody, AuthenticationHeaderValue token)
41+
{
42+
Client.DefaultRequestHeaders.Authorization = token;
43+
string endpoint = Client.BaseAddress + "v1/pip";
44+
return await Client.PostAsync(endpoint, requestBody);
45+
}
46+
}
47+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Text;
3+
using System.Threading.Tasks;
4+
using Altinn.ApiClients.Maskinporten.Interfaces;
5+
using Altinn.ApiClients.Maskinporten.Models;
6+
using Altinn.Platform.Authorization.Configuration;
7+
using Microsoft.Extensions.Options;
8+
9+
namespace Altinn.Platform.Authorization.Clients
10+
{
11+
/// <summary>
12+
/// Maskinporten client definition for OED Authz API integration
13+
/// </summary>
14+
public class OedAuthzMaskinportenClientDefinition : IClientDefinition
15+
{
16+
/// <inheritdoc/>
17+
public IMaskinportenSettings ClientSettings { get; set; }
18+
19+
/// <summary>
20+
/// Initializes a new instance of the <see cref="OedAuthzMaskinportenClientDefinition"/> class
21+
/// </summary>
22+
/// <param name="clientSettings">Maskinporten client settings</param>
23+
public OedAuthzMaskinportenClientDefinition(IOptions<OedAuthzMaskinportenClientSettings> clientSettings) => ClientSettings = clientSettings.Value;
24+
25+
/// <inheritdoc/>
26+
public Task<ClientSecrets> GetClientSecrets()
27+
{
28+
ClientSecrets clientSecrets = new ClientSecrets();
29+
30+
byte[] bytesFromBase64Jwk = Convert.FromBase64String(ClientSettings.EncodedJwk);
31+
string jwkJson = Encoding.UTF8.GetString(bytesFromBase64Jwk);
32+
clientSecrets.ClientKey = new Microsoft.IdentityModel.Tokens.JsonWebKey(jwkJson);
33+
return Task.FromResult(clientSecrets);
34+
}
35+
}
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Net.Http;
3+
using System.Net.Http.Headers;
4+
using Altinn.Platform.Authorization.Configuration;
5+
using Microsoft.Extensions.Options;
6+
7+
namespace Altinn.Platform.Authorization.Clients
8+
{
9+
/// <summary>
10+
/// Client configuration for profile api
11+
/// </summary>
12+
public class ProfileClient
13+
{
14+
/// <summary>
15+
/// Gets an instance of httpclient from httpclientfactory
16+
/// </summary>
17+
public HttpClient Client { get; }
18+
19+
/// <summary>
20+
/// Initializes the http client for actor
21+
/// </summary>
22+
/// <param name="client">the http client</param>
23+
/// <param name="generalSettings">the general settings configured for the authorization component</param>
24+
public ProfileClient(HttpClient client, IOptions<GeneralSettings> generalSettings)
25+
{
26+
GeneralSettings settings = generalSettings.Value;
27+
Client = client;
28+
Client.BaseAddress = new Uri(settings.GetBridgeApiEndpoint);
29+
Client.Timeout = new TimeSpan(0, 0, 30);
30+
Client.DefaultRequestHeaders.Clear();
31+
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
32+
}
33+
}
34+
}

src/Authorization/Configuration/GeneralSettings.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public string GetBridgeApiEndpoint
6161
/// </summary>
6262
public string OpenIdWellKnownEndpoint { get; set; }
6363

64+
/// <summary>
65+
/// Gets or sets the OED api endpoint
66+
/// </summary>
67+
public string OedAuthzApiEndpoint { get; set; }
68+
6469
/// <summary>
6570
/// Gets the SBL base adress from kubernetes environment variables and appsettings if environment variable is not set
6671
/// </summary>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Altinn.ApiClients.Maskinporten.Interfaces;
2+
3+
namespace Altinn.Platform.Authorization.Configuration
4+
{
5+
/// <summary>
6+
/// Configuration for Maskinporten Client for Oed role-assignments API integration
7+
/// </summary>
8+
public class OedAuthzMaskinportenClientSettings : IMaskinportenSettings
9+
{
10+
/// <inheritdoc/>
11+
public string Environment { get; set; }
12+
13+
/// <inheritdoc/>
14+
public string ClientId { get; set; }
15+
16+
/// <inheritdoc/>
17+
public string Scope { get; set; }
18+
19+
/// <inheritdoc/>
20+
public string EncodedJwk { get; set; }
21+
22+
/// <inheritdoc/>
23+
public string Resource { get; set; }
24+
25+
/// <inheritdoc/>
26+
public string CertificatePkcs12Path { get; set; }
27+
28+
/// <inheritdoc/>
29+
public string CertificatePkcs12Password { get; set; }
30+
31+
/// <inheritdoc/>
32+
public string CertificateStoreThumbprint { get; set; }
33+
34+
/// <inheritdoc/>
35+
public string EncodedX509 { get; set; }
36+
37+
/// <inheritdoc/>
38+
public string ConsumerOrgNo { get; set; }
39+
40+
/// <inheritdoc/>
41+
public string EnterpriseUserName { get; set; }
42+
43+
/// <inheritdoc/>
44+
public string EnterpriseUserPassword { get; set; }
45+
46+
/// <inheritdoc/>
47+
public bool? ExhangeToAltinnToken { get; set; }
48+
49+
/// <inheritdoc/>
50+
public string TokenExchangeEnvironment { get; set; }
51+
52+
/// <inheritdoc/>
53+
public bool? UseAltinnTestOrg { get; set; }
54+
55+
/// <inheritdoc/>
56+
public bool? EnableDebugLogging { get; set; }
57+
58+
/// <inheritdoc/>
59+
public bool? OverwriteAuthorizationHeader { get; set; }
60+
}
61+
}

src/Authorization/Constants/AltinnXacmlConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public static class MatchAttributeIdentifiers
8080
/// Role Code attribute match indentifier
8181
/// </summary>
8282
public const string RoleAttribute = "urn:altinn:rolecode";
83+
84+
/// <summary>
85+
/// Digitalt Dødsbo Role Code Attribute match identifier
86+
/// </summary>
87+
public const string OedRoleAttribute = "urn:digitaltdodsbo:rolecode";
8388
}
8489

8590
/// <summary>

src/Authorization/Constants/XacmlRequestAttribute.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public static class XacmlRequestAttribute
5555
/// </summary>
5656
public const string RoleAttribute = "urn:altinn:rolecode";
5757

58+
/// <summary>
59+
/// Digitalt Dødsbo Role Code Attribute match identifier
60+
/// </summary>
61+
public const string OedRoleAttribute = "urn:digitaltdodsbo:rolecode";
62+
5863
/// <summary>
5964
/// xacml string that represents resource
6065
/// </summary>

src/Authorization/Helpers/PolicyHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
2-
using System.Collections;
32
using System.Collections.Generic;
3+
using System.Collections.ObjectModel;
44
using System.IO;
55
using System.Linq;
66
using System.Text;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Altinn.Platform.Authorization.Models.Oed
5+
{
6+
/// <summary>
7+
/// Model for OED role assignment
8+
/// </summary>
9+
public class OedRoleAssignment
10+
{
11+
/// <summary>
12+
/// The OED/Digitalt dødsbo role code
13+
/// </summary>
14+
[JsonPropertyName("urn:digitaltdodsbo:rolecode")]
15+
public string OedRoleCode { get; set; }
16+
17+
/// <summary>
18+
/// The deceased person's pid
19+
/// </summary>
20+
public string From { get; set; }
21+
22+
/// <summary>
23+
/// The inheriting person's pid
24+
/// </summary>
25+
public string To { get; set; }
26+
27+
/// <summary>
28+
/// The datetime created
29+
/// </summary>
30+
public DateTime Created { get; set; }
31+
}
32+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace Altinn.Platform.Authorization.Models
2+
{
3+
/// <summary>
4+
/// Model for requesting OED/Digitalt dødsbo role assignments between two persons
5+
/// </summary>
6+
public class OedRoleAssignmentRequest
7+
{
8+
/// <summary>
9+
/// The person the OED/Digitalt dødsbo role if provided from (the deceased)
10+
/// </summary>
11+
public string From { get; set; }
12+
13+
/// <summary>
14+
/// The person the OED/Digitalt dødsbo role if provided to
15+
/// </summary>
16+
public string To { get; set; }
17+
}
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Collections.Generic;
2+
using Altinn.Platform.Authorization.Models.Oed;
3+
4+
namespace Altinn.Platform.Authorization.Models
5+
{
6+
/// <summary>
7+
/// Model for a list of OED/Digitalt dødsbo role assignment
8+
/// </summary>
9+
public class OedRoleAssignments
10+
{
11+
/// <summary>
12+
/// The list of OED/Digitalt dødsbo role assignments
13+
/// </summary>
14+
public List<OedRoleAssignment> RoleAssignments { get; set; }
15+
}
16+
}

src/Authorization/Program.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
using System.IO;
33
using System.Reflection;
44
using System.Threading.Tasks;
5-
5+
using Altinn.ApiClients.Maskinporten.Config;
6+
using Altinn.ApiClients.Maskinporten.Extensions;
7+
using Altinn.ApiClients.Maskinporten.Interfaces;
8+
using Altinn.ApiClients.Maskinporten.Services;
69
using Altinn.Authorization.ABAC.Interface;
710
using Altinn.Common.AccessTokenClient.Services;
811
using Altinn.Common.PEP.Authorization;
@@ -196,7 +199,9 @@ void ConfigureServices(IServiceCollection services, IConfiguration config)
196199
services.AddHealthChecks().AddCheck<HealthCheck>("authorization_health_check");
197200
services.AddSingleton(config);
198201
services.AddSingleton<IParties, PartiesWrapper>();
202+
services.AddSingleton<IProfile, ProfileWrapper>();
199203
services.AddSingleton<IRoles, RolesWrapper>();
204+
services.AddSingleton<IOedRoleAssignmentWrapper, OedRoleAssignmentWrapper>();
200205
services.AddSingleton<IContextHandler, ContextHandler>();
201206
services.AddSingleton<IDelegationContextHandler, DelegationContextHandler>();
202207
services.AddSingleton<IPolicyRetrievalPoint, PolicyRetrievalPoint>();
@@ -208,16 +213,22 @@ void ConfigureServices(IServiceCollection services, IConfiguration config)
208213
services.AddSingleton<IDelegationMetadataRepository, DelegationMetadataRepository>();
209214
services.AddSingleton<IDelegationChangeEventQueue, DelegationChangeEventQueue>();
210215
services.AddSingleton<IEventMapperService, EventMapperService>();
216+
211217
services.Configure<GeneralSettings>(config.GetSection("GeneralSettings"));
212218
services.Configure<AzureStorageConfiguration>(config.GetSection("AzureStorageConfiguration"));
213219
services.Configure<AzureCosmosSettings>(config.GetSection("AzureCosmosSettings"));
214220
services.Configure<PostgreSQLSettings>(config.GetSection("PostgreSQLSettings"));
215221
services.Configure<PlatformSettings>(config.GetSection("PlatformSettings"));
222+
OedAuthzMaskinportenClientSettings oedAuthzMaskinportenClientSettings = config.GetSection("OedAuthzMaskinportenClientSettings").Get<OedAuthzMaskinportenClientSettings>();
223+
services.Configure<OedAuthzMaskinportenClientSettings>(config.GetSection("OedAuthzMaskinportenClientSettings"));
224+
services.AddMaskinportenHttpClient<SettingsJwkClientDefinition, OedAuthzMaskinportenClientDefinition>(oedAuthzMaskinportenClientSettings);
216225
services.AddHttpClient<IRegisterService, RegisterService>();
217226
services.AddHttpClient<PartyClient>();
227+
services.AddHttpClient<ProfileClient>();
218228
services.AddHttpClient<RolesClient>();
219229
services.AddHttpClient<SBLClient>();
220230
services.AddHttpClient<ResourceRegistryClient>();
231+
services.AddHttpClient<OedAuthzClient>();
221232
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
222233
services.AddSingleton<IAccessTokenGenerator, AccessTokenGenerator>();
223234
services.AddTransient<ISigningCredentialsResolver, SigningCredentialsResolver>();

0 commit comments

Comments
 (0)