|
11 | 11 | * SPDX-License-Identifier: Apache-2.0 |
12 | 12 | ********************************************************************************/ |
13 | 13 |
|
14 | | -using AasSecurity.Models; |
15 | | -using AasSecurity.Exceptions; |
16 | | -using AasxServer; |
17 | | -using AasxServerStandardBib.Logging; |
18 | | -using AasxServerStandardBib.Services; |
19 | | -using Extensions; |
20 | | -using Jose; |
21 | | -using Microsoft.AspNetCore.Authentication; |
22 | | -using Microsoft.AspNetCore.Http; |
23 | | -using Microsoft.Extensions.Logging; |
24 | | -using Microsoft.IdentityModel.Tokens; |
25 | 14 | using System.Collections.Specialized; |
| 15 | +using System.Data; |
26 | 16 | using System.IdentityModel.Tokens.Jwt; |
| 17 | +using System.Linq.Dynamic.Core; |
| 18 | +using System.Linq.Expressions; |
| 19 | +using System.Net; |
| 20 | +using System.Net.Http.Headers; |
27 | 21 | using System.Security.Claims; |
28 | 22 | using System.Security.Cryptography; |
29 | 23 | using System.Security.Cryptography.X509Certificates; |
30 | 24 | using System.Text; |
| 25 | +using System.Text.Json; |
31 | 26 | using System.Web; |
32 | | -using File = AasCore.Aas3_0.File; |
| 27 | +using AasSecurity.Exceptions; |
| 28 | +using AasSecurity.Models; |
| 29 | +using AasxServer; |
| 30 | +using AasxServerStandardBib.Logging; |
| 31 | +using AasxServerStandardBib.Services; |
33 | 32 | using Contracts; |
34 | | -using System.Linq.Expressions; |
| 33 | +using Extensions; |
35 | 34 | using Irony.Parsing; |
36 | | -using System.Linq.Dynamic.Core; |
| 35 | +using Jose; |
| 36 | +using Microsoft.AspNetCore.Authentication; |
| 37 | +using Microsoft.AspNetCore.Http; |
| 38 | +using Microsoft.Extensions.Logging; |
37 | 39 | using Microsoft.IdentityModel.JsonWebTokens; |
38 | | -using static QRCoder.PayloadGenerator; |
39 | | -using System.Data; |
| 40 | +using Microsoft.IdentityModel.Tokens; |
40 | 41 | using Namotion.Reflection; |
| 42 | +using Newtonsoft.Json.Linq; |
| 43 | +using static QRCoder.PayloadGenerator; |
| 44 | +using File = AasCore.Aas3_0.File; |
41 | 45 |
|
42 | 46 | namespace AasSecurity |
43 | 47 | { |
@@ -427,7 +431,8 @@ private string HandleBearerToken(string? bearerToken, ref string user, ref bool |
427 | 431 | .First(c => c.Type == "tid").Value; |
428 | 432 |
|
429 | 433 | var jwksUrl = $"https://login.microsoftonline.com/{tenantId}/discovery/v2.0/keys"; |
430 | | - using var httpClient = new HttpClient(); |
| 434 | + var clientHandler = new HttpClientHandler { DefaultProxyCredentials = CredentialCache.DefaultCredentials }; |
| 435 | + using var httpClient = new HttpClient(clientHandler); |
431 | 436 | var jwksJson = httpClient.GetStringAsync(jwksUrl).Result; |
432 | 437 | var jwks = new JsonWebKeySet(jwksJson); |
433 | 438 | var signingKeys = jwks.GetSigningKeys(); |
@@ -458,6 +463,50 @@ private string HandleBearerToken(string? bearerToken, ref string user, ref bool |
458 | 463 | } |
459 | 464 | else |
460 | 465 | { |
| 466 | + if (jwtSecurityToken.Header.TryGetValue("kid", out _)) |
| 467 | + { |
| 468 | + user = ""; |
| 469 | + var jwksUrl = ""; |
| 470 | + var kid = jwtSecurityToken.Header["kid"].ToString(); |
| 471 | + if (kid != null) |
| 472 | + { |
| 473 | + jwksUrl = SecurityHelper.FindServerJwksUrl(kid, out domain); |
| 474 | + } |
| 475 | + if (jwksUrl != "") |
| 476 | + { |
| 477 | + var clientHandler = new HttpClientHandler { DefaultProxyCredentials = CredentialCache.DefaultCredentials }; |
| 478 | + using var httpClient = new HttpClient(clientHandler); |
| 479 | + var jwksJson = httpClient.GetStringAsync(jwksUrl + "/jwks").Result; |
| 480 | + var jwks = new JsonWebKeySet(jwksJson); |
| 481 | + var signingKeys = jwks.GetSigningKeys(); |
| 482 | + |
| 483 | + var tokenHandler = new JwtSecurityTokenHandler(); |
| 484 | + var validationParameters = new TokenValidationParameters |
| 485 | + { |
| 486 | + ValidateIssuer = false, |
| 487 | + ValidateAudience = false, |
| 488 | + ValidateLifetime = true, |
| 489 | + ValidateIssuerSigningKey = true, |
| 490 | + IssuerSigningKeys = signingKeys |
| 491 | + }; |
| 492 | + |
| 493 | + try |
| 494 | + { |
| 495 | + var principal = tokenHandler.ValidateToken(bearerToken, validationParameters, out var validatedToken); |
| 496 | + |
| 497 | + user = jwtSecurityToken.Claims.First(c => c.Type == "userName").Value; |
| 498 | + if (!string.IsNullOrEmpty(user)) |
| 499 | + { |
| 500 | + return ""; |
| 501 | + } |
| 502 | + user = ""; |
| 503 | + } |
| 504 | + catch (Exception ex) |
| 505 | + { |
| 506 | + } |
| 507 | + } |
| 508 | + } |
| 509 | + |
461 | 510 | var serverName = jwtSecurityToken.Claims.First(c => c.Type == "serverName").Value; |
462 | 511 | if (!string.IsNullOrEmpty(serverName)) |
463 | 512 | { |
|
0 commit comments