Skip to content

Commit 47353f5

Browse files
authored
Refactored Orleans.Identity. Removed unnecessary parts, leaved grain … (#27)
* Refactored Orleans.Identity. Removed unnecessary parts, leaved grain authorization and authentication. Implemented extension method for grain to get user claims from request context * Added fixes. Data flow now with ClaimPrincipal, direct exceptions, no string literals * Added fixes from copilot * Small fix of foreach loop. * Removed unnecessary variable
1 parent b883911 commit 47353f5

File tree

66 files changed

+945
-3163
lines changed

Some content is hidden

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

66 files changed

+945
-3163
lines changed

ManagedCode.Orleans.Identity.Client/Extensions/AuthenticationHandlerExtensions.cs

Lines changed: 0 additions & 56 deletions
This file was deleted.

ManagedCode.Orleans.Identity.Client/Extensions/OrleansContextMiddlewareExtensions.cs

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using ManagedCode.Orleans.Identity.Client.Middlewares;
2+
using Microsoft.AspNetCore.Builder;
3+
using Microsoft.AspNetCore.SignalR;
4+
using Microsoft.Extensions.DependencyInjection;
5+
6+
namespace ManagedCode.Orleans.Identity.Client.Extensions;
7+
8+
public static class OrleansIdentityExtensions
9+
{
10+
public static IServiceCollection AddOrleansIdentity(this IServiceCollection services)
11+
{
12+
services.AddScoped<OrleansContextMiddleware>();
13+
14+
services.AddSignalR(options =>
15+
{
16+
options.AddFilter<SignalRAuthorizationFilter>();
17+
});
18+
19+
return services;
20+
}
21+
22+
public static IApplicationBuilder UseOrleansIdentity(this IApplicationBuilder app)
23+
{
24+
app.UseMiddleware<OrleansContextMiddleware>();
25+
26+
return app;
27+
}
28+
}
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
using System.Security.Claims;
12
using System.Threading.Tasks;
2-
using ManagedCode.Orleans.Identity.Core.Extensions;
33
using Microsoft.AspNetCore.Http;
4+
using Orleans.Runtime;
5+
using ManagedCode.Orleans.Identity.Core.Constants;
46

57
namespace ManagedCode.Orleans.Identity.Client.Middlewares;
68

7-
public class OrleansContextMiddleware(RequestDelegate next)
9+
public class OrleansContextMiddleware : IMiddleware
810
{
9-
public async Task InvokeAsync(HttpContext context)
11+
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
1012
{
11-
context.User.SetOrleansContext();
13+
if (context.User.Identity?.IsAuthenticated == true)
14+
{
15+
RequestContext.Set(OrleansIdentityConstants.USER_CLAIMS, context.User);
16+
}
17+
1218
await next(context);
1319
}
1420
}

ManagedCode.Orleans.Identity.Client/Middlewares/OrleansIdentityAuthenticationHandler.cs

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Microsoft.AspNetCore.SignalR;
4+
using Orleans.Runtime;
5+
using ManagedCode.Orleans.Identity.Core.Constants;
6+
7+
namespace ManagedCode.Orleans.Identity.Client.Middlewares;
8+
9+
public class SignalRAuthorizationFilter : IHubFilter
10+
{
11+
public async ValueTask<object?> InvokeMethodAsync(
12+
HubInvocationContext invocationContext,
13+
Func<HubInvocationContext, ValueTask<object?>> next)
14+
{
15+
if (invocationContext.Context.User?.Identity?.IsAuthenticated == true)
16+
{
17+
RequestContext.Set(OrleansIdentityConstants.USER_CLAIMS, invocationContext.Context.User);
18+
}
19+
20+
return await next(invocationContext);
21+
}
22+
23+
public Task OnConnectedAsync(HubLifetimeContext context, Func<HubLifetimeContext, Task> next)
24+
{
25+
if (context.Context.User?.Identity?.IsAuthenticated == true)
26+
{
27+
RequestContext.Set(OrleansIdentityConstants.USER_CLAIMS, context.Context.User);
28+
}
29+
30+
return next(context);
31+
}
32+
33+
public Task OnDisconnectedAsync(HubLifetimeContext context, Exception? exception, Func<HubLifetimeContext, Exception?, Task> next)
34+
{
35+
return next(context, exception);
36+
}
37+
}

ManagedCode.Orleans.Identity.Core/Constants/OrleansIdentityConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ public static class OrleansIdentityConstants
66
public static string AUTH_TOKEN = "AUTH-TOKEN";
77
public static string AUTHENTICATION_TYPE = "MC-OrleansIdentity";
88
public const string SESSION_ID_CLAIM_NAME = "SessionId";
9+
public const string USER_CLAIMS = "UserClaims";
910
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Security.Claims;
3+
using Orleans;
4+
using Orleans.Runtime;
5+
using ManagedCode.Orleans.Identity.Core.Constants;
6+
7+
namespace ManagedCode.Orleans.Identity.Core.Extensions;
8+
9+
public static class GrainExtensions
10+
{
11+
public static ClaimsPrincipal GetCurrentUser(this Grain grain)
12+
{
13+
var requestContext = RequestContext.Get(OrleansIdentityConstants.USER_CLAIMS);
14+
return requestContext as ClaimsPrincipal ?? new ClaimsPrincipal(new ClaimsIdentity());
15+
}
16+
}

ManagedCode.Orleans.Identity.Core/Serializations/ClaimSurrogate.cs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,24 @@
44
namespace ManagedCode.Orleans.Identity.Core.Serializations;
55

66
// This is the surrogate which will act as a stand-in for the foreign type.
7-
// Surrogates should use plain fields instead of properties for better perfomance.
7+
// Surrogates should use plain fields instead of properties for better performance.
88
[GenerateSerializer]
9-
public struct ClaimSurrogate
9+
public struct ClaimSurrogate(string type, string value, string valueType, string issuer, string originalIssuer)
1010
{
11-
public ClaimSurrogate(string type, string value, string valueType, string issuer, string originalIssuer, ClaimsIdentity? subject)
12-
{
13-
Issuer = issuer;
14-
OriginalIssuer = originalIssuer;
15-
Subject = subject;
16-
Type = type;
17-
Value = value;
18-
ValueType = valueType;
19-
}
20-
2111
[Id(0)]
22-
public string Issuer { get; set; }
12+
public string Issuer { get; set; } = issuer;
2313

2414
[Id(1)]
25-
public string OriginalIssuer { get; set; }
15+
public string OriginalIssuer { get; set; } = originalIssuer;
2616

2717
[Id(2)]
28-
public ClaimsIdentity? Subject { get; set; }
18+
public string Type { get; set; } = type;
2919

3020
[Id(3)]
31-
public string Type { get; set; }
21+
public string Value { get; set; } = value;
3222

3323
[Id(4)]
34-
public string Value { get; set; }
35-
36-
[Id(5)]
37-
public string ValueType { get; set; }
24+
public string ValueType { get; set; } = valueType;
3825
}
3926

4027
// This is a converter which converts between the surrogate and the foreign type.

ManagedCode.Orleans.Identity.Core/Serializations/ClaimSurrogateConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ public sealed class ClaimSurrogateConverter : IConverter<Claim, ClaimSurrogate>
88
{
99
public Claim ConvertFromSurrogate(in ClaimSurrogate surrogate)
1010
{
11-
return new Claim(surrogate.Type, surrogate.Value, surrogate.ValueType, surrogate.Issuer, surrogate.OriginalIssuer, surrogate.Subject);
11+
return new Claim(surrogate.Type, surrogate.Value, surrogate.ValueType, surrogate.Issuer, surrogate.OriginalIssuer);
1212
}
1313

1414
public ClaimSurrogate ConvertToSurrogate(in Claim value)
1515
{
16-
return new ClaimSurrogate(value.Type, value.Value, value.ValueType, value.Issuer, value.OriginalIssuer, value.Subject);
16+
return new ClaimSurrogate(value.Type, value.Value, value.ValueType, value.Issuer, value.OriginalIssuer);
1717
}
1818
}

0 commit comments

Comments
 (0)