Skip to content

Commit 74217ea

Browse files
committed
wip: security groups assingment from entra id
1 parent 51fbeee commit 74217ea

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

src/EAVFW.Extensions.EasyAuth.MicrosoftEntraId/EAVFW.Extensions.EasyAuth.MicrosoftEntraId.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
<ItemGroup Condition="$(UseEAVFromNuget) != 'false'">
1818
<PackageReference Include="EAVFramework" Version="$(EAVFrameworkVersion)" />
1919
</ItemGroup>
20-
20+
2121
<ItemGroup>
2222
<None Include="..\..\README.md" Link="README.md" Pack="true" PackagePath="\" />
2323
</ItemGroup>
2424

2525
<ItemGroup>
26+
<PackageReference Include="EAVFW.Extensions.SecurityModel" Version="2.0.3" />
2627
<PackageReference Include="IdentityModel" Version="6.2.0" />
2728
</ItemGroup>
2829
</Project>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
3+
using EAVFramework.Shared;
4+
using System;
5+
6+
namespace EAVFW.Extensions.EasyAuth.MicrosoftEntraId
7+
{
8+
[EntityInterface(EntityKey = "Security Group")]
9+
public interface IEntraIDSecurityGroup
10+
{
11+
12+
public Guid? EntraIdGroupId { get; set; }
13+
}
14+
15+
16+
}

src/EAVFW.Extensions.EasyAuth.MicrosoftEntraId/MicrosoftEntraEasyAuthProvider.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
using EAVFramework;
12
using EAVFramework.Authentication;
3+
using EAVFramework.Endpoints;
24
using EAVFramework.Extensions;
5+
using EAVFW.Extensions.SecurityModel;
36
using IdentityModel;
47
using IdentityModel.Client;
58
using Microsoft.AspNetCore.Http;
@@ -25,10 +28,13 @@
2528
namespace EAVFW.Extensions.EasyAuth.MicrosoftEntraId
2629
{
2730

28-
public class MicrosoftEntraEasyAuthProvider : IEasyAuthProvider
31+
public class MicrosoftEntraEasyAuthProvider<TSecurityGroup,TSecurityGroupMember> : IEasyAuthProvider
32+
where TSecurityGroup : DynamicEntity, IEntraIDSecurityGroup
33+
where TSecurityGroupMember : DynamicEntity, ISecurityGroupMember
2934
{
3035
private readonly IOptions<MicrosoftEntraIdEasyAuthOptions> _options;
3136
private readonly IHttpClientFactory _clientFactory;
37+
private readonly EAVDBContext<DynamicContext> _db;
3238

3339
public string AuthenticationName => "MicrosoftEntraId";
3440

@@ -38,10 +44,12 @@ public class MicrosoftEntraEasyAuthProvider : IEasyAuthProvider
3844

3945
public MicrosoftEntraEasyAuthProvider() { }
4046

41-
public MicrosoftEntraEasyAuthProvider(IOptions<MicrosoftEntraIdEasyAuthOptions> options, IHttpClientFactory clientFactory)
47+
public MicrosoftEntraEasyAuthProvider(IOptions<MicrosoftEntraIdEasyAuthOptions> options,
48+
IHttpClientFactory clientFactory, EAVDBContext<DynamicContext> db)
4249
{
4350
_options = options ?? throw new System.ArgumentNullException(nameof(options));
4451
_clientFactory = clientFactory ?? throw new ArgumentNullException(nameof(clientFactory));
52+
_db = db;
4553
}
4654

4755
public async Task OnAuthenticate(HttpContext httpcontext, string handleId, string redirectUrl)
@@ -86,6 +94,27 @@ public async Task OnAuthenticate(HttpContext httpcontext, string handleId, strin
8694
httpcontext.Response.Redirect($"{httpcontext.Request.Scheme}://{httpcontext.Request.Host}callback?error=access_denied&error_subcode=user_not_found");
8795
//return;
8896
}
97+
98+
var handler = new JwtSecurityTokenHandler();
99+
var jwtSecurityToken = handler.ReadJwtToken(response.IdentityToken);
100+
101+
var groupId = jwtSecurityToken.Claims.First(claim => claim.Type == "groups").Value;
102+
103+
var groupids = new string[] { "", "" };
104+
105+
var sgs = _db.Set<TSecurityGroup>();
106+
var assignments = _db.Set<TSecurityGroupMember>();
107+
108+
109+
//Add securityMember for the group ids where found
110+
111+
112+
//Remove securirymember from existing that was not given in groupids.
113+
114+
115+
116+
117+
89118
return await Task.FromResult((new ClaimsPrincipal(identity), redirectUri, handleId));
90119
}
91120

src/EAVFW.Extensions.EasyAuth.MicrosoftEntraId/MicrosoftEntraIdEasyAuthExtensions.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using EAVFramework;
12
using EAVFramework.Configuration;
3+
using EAVFW.Extensions.SecurityModel;
24
using IdentityModel.Client;
35
using Microsoft.AspNetCore.Builder;
46
using Microsoft.AspNetCore.Http;
@@ -10,18 +12,30 @@
1012

1113
namespace EAVFW.Extensions.EasyAuth.MicrosoftEntraId
1214
{
15+
public class GroupMatcherService<TSecurityGroup>
16+
where TSecurityGroup : DynamicEntity, IEntraIDSecurityGroup
17+
{
18+
19+
}
1320
public static class MicrosoftEntraIdEasyAuthExtensions
1421
{
15-
public static AuthenticatedEAVFrameworkBuilder AddMicrosoftEntraIdEasyAuth(this AuthenticatedEAVFrameworkBuilder builder, Func<HttpContext, string, TokenResponse, Task<ClaimsPrincipal>> validateUserAsync, Func<HttpContext, string> getMicrosoftAuthorizationUrl, Func<HttpContext, string> getMicrosoftTokenEndpoint)
22+
public static AuthenticatedEAVFrameworkBuilder AddMicrosoftEntraIdEasyAuth<TSecurityGroup,TSecurityGroupMemeber>(
23+
this AuthenticatedEAVFrameworkBuilder builder,
24+
Func<HttpContext, string, TokenResponse, Task<ClaimsPrincipal>> validateUserAsync,
25+
Func<HttpContext, string> getMicrosoftAuthorizationUrl, Func<HttpContext, string> getMicrosoftTokenEndpoint)
26+
where TSecurityGroup : DynamicEntity, IEntraIDSecurityGroup
27+
where TSecurityGroupMemeber : DynamicEntity, ISecurityGroupMember
1628
{
17-
builder.AddAuthenticationProvider<MicrosoftEntraEasyAuthProvider, MicrosoftEntraIdEasyAuthOptions,IConfiguration>((options, config) =>
29+
builder.AddAuthenticationProvider<MicrosoftEntraEasyAuthProvider<TSecurityGroup,TSecurityGroupMemeber>, MicrosoftEntraIdEasyAuthOptions,IConfiguration>((options, config) =>
1830
{
1931
config.GetSection("EAVEasyAuth:MicrosoftEntraId").Bind(options);
2032
options.ValidateUserAsync = validateUserAsync;
2133
options.GetMicrosoftAuthorizationUrl = getMicrosoftAuthorizationUrl;
2234
options.GetMicrosoftTokenEndpoint = getMicrosoftTokenEndpoint;
2335

2436
});
37+
builder.Services.AddScoped<GroupMatcherService<TSecurityGroup>>();
38+
2539
return builder;
2640
}
2741
}

0 commit comments

Comments
 (0)