Skip to content

Commit 0ad357e

Browse files
committed
Tests update without the migration step
1 parent c2a5566 commit 0ad357e

File tree

27 files changed

+296
-11
lines changed

27 files changed

+296
-11
lines changed

Tests/AzureFunctions.AzureEventGrid.GroupA/modules.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module moduleId="Intent.Application.MediatR.FluentValidation" version="4.9.3" supportedClientVersions="[4.3.0-a, 5.0.0-a)" />
1919
<module moduleId="Intent.Application.ServiceImplementations" version="4.5.13" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2020
<module moduleId="Intent.Application.ServiceImplementations.Conventions.CRUD" version="5.2.1-pre.0" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
21-
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.1" supportedClientVersions="[4.2.4, 5.0.0-a)" />
21+
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2222
<module moduleId="Intent.AzureFunctions.AzureEventGrid" version="1.1.5-pre.0" supportedClientVersions="[4.5.0-a,5.0.0)" />
2323
<module moduleId="Intent.AzureFunctions.Dispatch.MediatR" version="2.0.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2424
<module moduleId="Intent.AzureFunctions.Dispatch.Services" version="5.0.3" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />

Tests/AzureFunctions.AzureEventGrid.GroupB/modules.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module moduleId="Intent.Application.MediatR.FluentValidation" version="4.9.3" supportedClientVersions="[4.3.0-a, 5.0.0-a)" />
1919
<module moduleId="Intent.Application.ServiceImplementations" version="4.5.13" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2020
<module moduleId="Intent.Application.ServiceImplementations.Conventions.CRUD" version="5.2.1-pre.0" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
21-
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.1" supportedClientVersions="[4.2.4, 5.0.0-a)" />
21+
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2222
<module moduleId="Intent.AzureFunctions.AzureEventGrid" version="1.1.5-pre.0" supportedClientVersions="[4.5.0-a,5.0.0)" />
2323
<module moduleId="Intent.AzureFunctions.Dispatch.MediatR" version="2.0.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2424
<module moduleId="Intent.AzureFunctions.Dispatch.Services" version="5.0.3" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />

Tests/AzureFunctions.AzureServiceBus.GroupA/modules.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module moduleId="Intent.Application.MediatR.FluentValidation" version="4.9.3" supportedClientVersions="[4.3.0-a, 5.0.0-a)" />
1919
<module moduleId="Intent.Application.ServiceImplementations" version="4.5.13" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2020
<module moduleId="Intent.Application.ServiceImplementations.Conventions.CRUD" version="5.2.1-pre.0" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
21-
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.1" supportedClientVersions="[4.2.4, 5.0.0-a)" />
21+
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2222
<module moduleId="Intent.AzureFunctions.AzureServiceBus" version="1.0.7" supportedClientVersions="[4.5.0-a,5.0.0)" />
2323
<module moduleId="Intent.AzureFunctions.Dispatch.MediatR" version="2.0.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2424
<module moduleId="Intent.AzureFunctions.Dispatch.Services" version="5.0.3" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />

Tests/AzureFunctions.AzureServiceBus.GroupB/modules.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module moduleId="Intent.Application.MediatR.FluentValidation" version="4.9.3" supportedClientVersions="[4.3.0-a, 5.0.0-a)" />
1919
<module moduleId="Intent.Application.ServiceImplementations" version="4.5.13" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2020
<module moduleId="Intent.Application.ServiceImplementations.Conventions.CRUD" version="5.2.1-pre.0" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
21-
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.1" supportedClientVersions="[4.2.4, 5.0.0-a)" />
21+
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2222
<module moduleId="Intent.AzureFunctions.AzureServiceBus" version="1.0.7" supportedClientVersions="[4.5.0-a,5.0.0)" />
2323
<module moduleId="Intent.AzureFunctions.Dispatch.MediatR" version="2.0.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2424
<module moduleId="Intent.AzureFunctions.Dispatch.Services" version="5.0.3" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />

Tests/AzureFunctions.MongoDb/modules.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<module moduleId="Intent.Application.MediatR.FluentValidation" version="4.9.3" supportedClientVersions="[4.3.0-a, 5.0.0-a)" />
1919
<module moduleId="Intent.Application.ServiceImplementations" version="4.5.13" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2020
<module moduleId="Intent.Application.ServiceImplementations.Conventions.CRUD" version="5.2.1-pre.0" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
21-
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.1" supportedClientVersions="[4.2.4, 5.0.0-a)" />
21+
<module moduleId="Intent.AzureFunctions" version="5.0.16-pre.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2222
<module moduleId="Intent.AzureFunctions.Dispatch.MediatR" version="2.0.2" supportedClientVersions="[4.2.4, 5.0.0-a)" />
2323
<module moduleId="Intent.AzureFunctions.Dispatch.Services" version="5.0.3" supportedClientVersions="[4.5.0-a, 5.0.0-a)" />
2424
<module moduleId="Intent.AzureFunctions.FluentValidation" version="5.1.2-pre.0" supportedClientVersions="[4.2.4, 5.0.0-a)" />

Tests/AzureFunctions.NET8/AzureFunctions.NET8.Api/AzureFunctions.NET8.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
<ItemGroup>
1212
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.23.0" />
13+
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.20" />
1314
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.1.0" />
1415
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="2.0.0" />
1516
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="4.13.0" />

Tests/AzureFunctions.NET8/AzureFunctions.NET8.Api/Configuration/ApplicationSecurityConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.IdentityModel.Tokens.Jwt;
12
using AzureFunctions.NET8.Api.Services;
23
using AzureFunctions.NET8.Application.Common.Interfaces;
34
using Intent.RoslynWeaver.Attributes;
@@ -16,6 +17,8 @@ public static IServiceCollection ConfigureApplicationSecurity(
1617
IConfiguration configuration)
1718
{
1819
services.AddSingleton<ICurrentUserService, CurrentUserService>();
20+
services.AddHttpContextAccessor();
21+
services.AddSingleton<JwtSecurityTokenHandler>();
1922
return services;
2023
}
2124
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using System.IdentityModel.Tokens.Jwt;
2+
using System.Net;
3+
using System.Security.Claims;
4+
using Intent.RoslynWeaver.Attributes;
5+
using Microsoft.AspNetCore.Authorization;
6+
using Microsoft.AspNetCore.Http;
7+
using Microsoft.Azure.Functions.Worker;
8+
using Microsoft.Azure.Functions.Worker.Extensions.Http;
9+
using Microsoft.Azure.Functions.Worker.Middleware;
10+
using Microsoft.Extensions.Hosting;
11+
using Microsoft.Extensions.Logging;
12+
using Microsoft.Extensions.Primitives;
13+
14+
[assembly: DefaultIntentManaged(Mode.Fully)]
15+
[assembly: IntentTemplate("Intent.AzureFunctions.Jwt.JwtClaimsMiddleware", Version = "1.0")]
16+
17+
namespace AzureFunctions.NET8.Api
18+
{
19+
public class JwtClaimsMiddleware : IFunctionsWorkerMiddleware
20+
{
21+
private readonly JwtSecurityTokenHandler _tokenHandler;
22+
private readonly IHttpContextAccessor _httpContextAccessor;
23+
private readonly ILogger<JwtClaimsMiddleware> _logger;
24+
25+
public JwtClaimsMiddleware(JwtSecurityTokenHandler tokenHandler,
26+
IHttpContextAccessor httpContextAccessor,
27+
ILogger<JwtClaimsMiddleware> logger)
28+
{
29+
_tokenHandler = tokenHandler;
30+
_httpContextAccessor = httpContextAccessor;
31+
_logger = logger;
32+
}
33+
34+
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
35+
{
36+
if (!IsHttpTrigger(context))
37+
{
38+
await next(context);
39+
return;
40+
}
41+
var httpContext = context.GetHttpContext();
42+
43+
if (httpContext == null)
44+
{
45+
await next(context);
46+
return;
47+
}
48+
_httpContextAccessor.HttpContext = httpContext;
49+
50+
if (TryGetBearerToken(httpContext.Request, out var tokenValue))
51+
{
52+
if (TryCreatePrincipal(tokenValue, out var principal))
53+
{
54+
AttachPrincipal(httpContext, tokenValue, principal);
55+
}
56+
else
57+
{
58+
httpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
59+
await httpContext.Response.WriteAsync(@"Invalid authorization token.");
60+
return;
61+
}
62+
}
63+
await next(context);
64+
}
65+
66+
private void AttachPrincipal(HttpContext httpContext, string tokenValue, ClaimsPrincipal principal)
67+
{
68+
httpContext.User = principal;
69+
httpContext.Items["RawToken"] = tokenValue;
70+
}
71+
72+
private static bool TryGetBearerToken(HttpRequest request, out string token)
73+
{
74+
token = string.Empty;
75+
76+
if (!request.Headers.TryGetValue(@"Authorization", out StringValues authorizationValues))
77+
{
78+
return false;
79+
}
80+
var authorizationHeader = authorizationValues.FirstOrDefault();
81+
82+
if (string.IsNullOrWhiteSpace(authorizationHeader) || !authorizationHeader.StartsWith(@"Bearer ", StringComparison.OrdinalIgnoreCase))
83+
{
84+
return false;
85+
}
86+
token = authorizationHeader[@"Bearer ".Length..].Trim();
87+
return !string.IsNullOrEmpty(token);
88+
}
89+
90+
private static bool IsHttpTrigger(FunctionContext context)
91+
{
92+
return context.FunctionDefinition.InputBindings.Values.Any(binding => string.Equals(binding.Type, @"httpTrigger", StringComparison.OrdinalIgnoreCase));
93+
}
94+
95+
private bool TryCreatePrincipal(string tokenValue, out ClaimsPrincipal principal)
96+
{
97+
principal = default!;
98+
99+
try
100+
{
101+
var token = _tokenHandler.ReadJwtToken(tokenValue);
102+
var identity = new ClaimsIdentity(token.Claims, @"Bearer", ClaimTypes.Name, ClaimTypes.Role);
103+
principal = new ClaimsPrincipal(identity);
104+
return true;
105+
}
106+
catch (ArgumentException ex)
107+
{
108+
_logger.LogWarning(ex, @"Failed to parse JWT token due to invalid format.");
109+
return false;
110+
}
111+
}
112+
}
113+
114+
public static class JwtClaimsMiddlewareExtensions
115+
{
116+
public static IFunctionsWorkerApplicationBuilder UseJwtClaimsMiddleware(this IFunctionsWorkerApplicationBuilder builder)
117+
{
118+
return builder.UseMiddleware<JwtClaimsMiddleware>();
119+
}
120+
}
121+
}

Tests/AzureFunctions.NET8/AzureFunctions.NET8.Api/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Configuration;
2+
using AzureFunctions.NET8.Api;
23
using AzureFunctions.NET8.Api.Configuration;
34
using AzureFunctions.NET8.Application;
45
using AzureFunctions.NET8.Infrastructure;
@@ -14,6 +15,7 @@
1415
var host = new HostBuilder()
1516
.ConfigureFunctionsWebApplication((ctx, builder) =>
1617
{
18+
builder.UseJwtClaimsMiddleware();
1719
})
1820
.ConfigureServices((ctx, services) =>
1921
{
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Security.Claims;
2+
using AzureFunctions.NET8.Application.Common.Interfaces;
3+
using Intent.RoslynWeaver.Attributes;
4+
5+
[assembly: DefaultIntentManaged(Mode.Fully)]
6+
[assembly: IntentTemplate("Intent.AzureFunctions.Jwt.CurrentUser", Version = "1.0")]
7+
8+
namespace AzureFunctions.NET8.Api.Services
9+
{
10+
public class CurrentUser : ICurrentUser
11+
{
12+
public CurrentUser(ClaimsPrincipal principal, string? accessToken)
13+
{
14+
Principal = principal;
15+
AccessToken = accessToken;
16+
}
17+
18+
public ClaimsPrincipal Principal { get; }
19+
public string? AccessToken { get; }
20+
public string? Id => Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
21+
public string? Name => Principal.FindFirst(ClaimTypes.Name)?.Value;
22+
}
23+
}

0 commit comments

Comments
 (0)