|
15 | 15 | using System.Security;
|
16 | 16 | using System.Security.Claims;
|
17 | 17 | using System.Threading.Tasks;
|
| 18 | +#if !NET50 && !NET60 |
| 19 | +using ITfoxtec.Identity.Models; |
| 20 | +#endif |
18 | 21 |
|
19 | 22 | namespace ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
|
20 | 23 | {
|
@@ -161,13 +164,19 @@ public async Task LoginCallBackAsync(string responseUrl)
|
161 | 164 | if (tokenResponse.AccessToken.IsNullOrEmpty()) throw new ArgumentNullException(nameof(tokenResponse.AccessToken), tokenResponse.GetTypeName());
|
162 | 165 | if (tokenResponse.ExpiresIn <= 0) throw new ArgumentNullException(nameof(tokenResponse.ExpiresIn), tokenResponse.GetTypeName());
|
163 | 166 |
|
164 |
| - //var oidcDiscoveryKeySet = await GetOidcDiscoveryKeysAsync(openidClientPkceState.OidcDiscoveryUri); |
165 |
| - |
166 |
| - //(var idTokenPrincipal, _) = JwtHandler.ValidateToken(tokenResponse.IdToken, oidcDiscovery.Issuer, oidcDiscoveryKeySet.Keys.ToMSJsonWebKeys(), openidClientPkceState.ClientId, |
167 |
| - // nameClaimType: globalOpenidClientPkceSettings.NameClaimType, roleClaimType: globalOpenidClientPkceSettings.RoleClaimType); |
168 |
| - // Changed to only read ID token and not do validation |
169 |
| - |
| 167 | + // .NET 5.0 error, System.Security.Cryptography.RSA.Create() - System.PlatformNotSupportedException: System.Security.Cryptography.Algorithms is not supported on this platform. |
| 168 | + // https://github.com/dotnet/aspnetcore/issues/26123 |
| 169 | + // https://github.com/dotnet/runtime/issues/40074 |
| 170 | + // .NET 7 |
| 171 | + // https://github.com/dotnet/designs/blob/main/accepted/2021/blazor-wasm-crypto.md#net-7-plan |
| 172 | +#if !NET50 && !NET60 |
| 173 | + var oidcDiscoveryKeySet = await GetOidcDiscoveryKeysAsync(openidClientPkceState.OidcDiscoveryUri); |
| 174 | + |
| 175 | + (var idTokenPrincipal, _) = JwtHandler.ValidateToken(tokenResponse.IdToken, oidcDiscovery.Issuer, oidcDiscoveryKeySet.Keys.ToMSJsonWebKeys(), openidClientPkceState.ClientId, |
| 176 | + nameClaimType: globalOpenidClientPkceSettings.NameClaimType, roleClaimType: globalOpenidClientPkceSettings.RoleClaimType); |
| 177 | +#else |
170 | 178 | var idTokenPrincipal = JwtHandler.ReadTokenClaims(tokenResponse.IdToken);
|
| 179 | +#endif |
171 | 180 |
|
172 | 181 | var nonce = idTokenPrincipal.Claims.Where(c => c.Type == JwtClaimTypes.Nonce).Select(c => c.Value).FirstOrDefault();
|
173 | 182 | if (!openidClientPkceState.Nonce.Equals(nonce, StringComparison.Ordinal))
|
@@ -228,13 +237,19 @@ public async Task<OidcUserSession> HandleRefreshTokenAsync(OidcUserSession userS
|
228 | 237 | if (tokenResponse.AccessToken.IsNullOrEmpty()) throw new ArgumentNullException(nameof(tokenResponse.AccessToken), tokenResponse.GetTypeName());
|
229 | 238 | if (tokenResponse.ExpiresIn <= 0) throw new ArgumentNullException(nameof(tokenResponse.ExpiresIn), tokenResponse.GetTypeName());
|
230 | 239 |
|
231 |
| - //var oidcDiscoveryKeySet = await GetOidcDiscoveryKeysAsync(oidcDiscoveryUri); |
232 |
| - |
233 |
| - //(var idTokenPrincipal, _) = JwtHandler.ValidateToken(tokenResponse.IdToken, oidcDiscovery.Issuer, oidcDiscoveryKeySet.Keys, clientId, |
234 |
| - // nameClaimType: globalOpenidClientPkceSettings.NameClaimType, roleClaimType: globalOpenidClientPkceSettings.RoleClaimType); |
235 |
| - // Changed to only read ID token and not do validation |
236 |
| - |
| 240 | + // .NET 5.0 error, System.Security.Cryptography.RSA.Create() - System.PlatformNotSupportedException: System.Security.Cryptography.Algorithms is not supported on this platform. |
| 241 | + // https://github.com/dotnet/aspnetcore/issues/26123 |
| 242 | + // https://github.com/dotnet/runtime/issues/40074 |
| 243 | + // .NET 7 |
| 244 | + // https://github.com/dotnet/designs/blob/main/accepted/2021/blazor-wasm-crypto.md#net-7-plan |
| 245 | +#if !NET50 && !NET60 |
| 246 | + var oidcDiscoveryKeySet = await GetOidcDiscoveryKeysAsync(oidcDiscoveryUri); |
| 247 | + |
| 248 | + (var idTokenPrincipal, _) = JwtHandler.ValidateToken(tokenResponse.IdToken, oidcDiscovery.Issuer, oidcDiscoveryKeySet.Keys, clientId, |
| 249 | + nameClaimType: globalOpenidClientPkceSettings.NameClaimType, roleClaimType: globalOpenidClientPkceSettings.RoleClaimType); |
| 250 | +#else |
237 | 251 | var idTokenPrincipal = JwtHandler.ReadTokenClaims(tokenResponse.IdToken);
|
| 252 | +#endif |
238 | 253 |
|
239 | 254 | if (!subject.IsNullOrEmpty() && subject != idTokenPrincipal.Claims.Where(c => c.Type == globalOpenidClientPkceSettings.NameClaimType).Single().Value)
|
240 | 255 | {
|
@@ -353,19 +368,20 @@ private async Task<OidcDiscovery> GetOidcDiscoveryAsync(string oidcDiscoveryUri)
|
353 | 368 | }
|
354 | 369 | }
|
355 | 370 |
|
356 |
| - // Changed to only read ID token and not do validation |
357 |
| - //private async Task<JsonWebKeySet> GetOidcDiscoveryKeysAsync(string oidcDiscoveryUri) |
358 |
| - //{ |
359 |
| - // try |
360 |
| - // { |
361 |
| - // var oidcDiscoveryHandler = serviceProvider.GetService<OidcDiscoveryHandler>(); |
362 |
| - // return await oidcDiscoveryHandler.GetOidcDiscoveryKeysAsync(oidcDiscoveryUri); |
363 |
| - // } |
364 |
| - // catch (Exception ex) |
365 |
| - // { |
366 |
| - // throw new Exception($"Failed to fetch OIDC Discovery Keys from discovery '{oidcDiscoveryUri}'.", ex); |
367 |
| - // } |
368 |
| - //} |
| 371 | +#if !NET50 && !NET60 |
| 372 | + private async Task<JsonWebKeySet> GetOidcDiscoveryKeysAsync(string oidcDiscoveryUri) |
| 373 | + { |
| 374 | + try |
| 375 | + { |
| 376 | + var oidcDiscoveryHandler = serviceProvider.GetService<OidcDiscoveryHandler>(); |
| 377 | + return await oidcDiscoveryHandler.GetOidcDiscoveryKeysAsync(oidcDiscoveryUri); |
| 378 | + } |
| 379 | + catch (Exception ex) |
| 380 | + { |
| 381 | + throw new Exception($"Failed to fetch OIDC Discovery Keys from discovery '{oidcDiscoveryUri}'.", ex); |
| 382 | + } |
| 383 | + } |
| 384 | +#endif |
369 | 385 |
|
370 | 386 | private async Task<string> SaveStateAsync(OpenidConnectPkceSettings openidConnectPkceSettings, string callBackUri, string redirectUri, string codeVerifier = null, string nonce = null)
|
371 | 387 | {
|
|
0 commit comments