memd24 / Blazor.SubtleCrypto

20 stars 5 forks source link

Unhandled occurs when publish to IIS #5

Open thammapat opened 1 year ago

thammapat commented 1 year ago

My project is Blazor webassembly .net 6, everything work fine in my labtop both debug/release but cannot run in IIS. Do you have any solution in this case? Below is exception . Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: An exception occurred executing JS interop: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32.. See InnerException for more details. Microsoft.JSInterop.JSException: An exception occurred executing JS interop: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32.. See InnerException for more details. ---> System.Text.Json.JsonException: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32. ---> System.InvalidOperationException: InvalidCast, StartObject, string at System.Text.Json.Utf8JsonReader.GetString() at System.Text.Json.Serialization.Converters.StringConverter.Read(Utf8JsonReader& , Type , JsonSerializerOptions ) at System.Text.Json.Serialization.Metadata.JsonPropertyInfo1[[System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadJsonAndSetMember(Object , ReadStack& , Utf8JsonReader& ) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , PromiseResult& ) at System.Text.Json.Serialization.JsonConverter1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , PromiseResult& ) at System.Text.Json.Serialization.JsonCollectionConverter2[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , List1& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , List1& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) Exception_EndOfInnerExceptionStack at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& , Utf8JsonReader& , Exception ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCoreAsObject(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Object](JsonConverter , Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.Read[Object](Utf8JsonReader& , JsonTypeInfo ) at System.Text.Json.JsonSerializer.Deserialize(Utf8JsonReader& , Type , JsonSerializerOptions ) at Microsoft.JSInterop.JSRuntime.EndInvokeJS(Int64 , Boolean , Utf8JsonReader& ) Exception_EndOfInnerExceptionStack at Microsoft.JSInterop.JSRuntime.<InvokeAsync>d__161[[System.Collections.Generic.List`1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at Blazor.SubtleCrypto.CryptoService.SubtleEncrypt(Object obj) at Blazor.SubtleCrypto.CryptoService.EncryptAsync(String text) at Gear.Client.Auth.JwtAuthenticationStateProvider.SetTokenAsync(UserToken userToken) at Gear.Client.Service.AuthService.LoginAsync(UserInfo userInfo) at Gear.Client.Pages.Index.SubmitHandlerAsync() at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync() at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task , ComponentState )

alieymur commented 1 year ago

net7.0.8, Blazor Webassybley exeption

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: An exception occurred executing JS interop: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32.. See InnerException for more details. Microsoft.JSInterop.JSException: An exception occurred executing JS interop: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32.. See InnerException for more details. ---> System.Text.Json.JsonException: DeserializeUnableToConvertValue, System.String Path: $[0].reason | LineNumber: 0 | BytePositionInLine: 32. ---> System.InvalidOperationException: InvalidCast, StartObject, string at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ExpectedString(JsonTokenType ) at System.Text.Json.Utf8JsonReader.GetString() at System.Text.Json.Serialization.Converters.StringConverter.Read(Utf8JsonReader& , Type , JsonSerializerOptions ) at System.Text.Json.Serialization.Metadata.JsonPropertyInfo1[[System.String, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadJsonAndSetMember(Object , ReadStack& , Utf8JsonReader& ) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , PromiseResult& ) at System.Text.Json.Serialization.JsonConverter1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , PromiseResult& ) at System.Text.Json.Serialization.JsonCollectionConverter2[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]].OnTryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , List1& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TryRead(Utf8JsonReader& , Type , JsonSerializerOptions , ReadStack& , List1& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) Exception_EndOfInnerExceptionStack at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& , Utf8JsonReader& , Exception ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.Serialization.JsonConverter1[[System.Collections.Generic.List1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCoreAsObject(Utf8JsonReader& , JsonSerializerOptions , ReadStack& ) at System.Text.Json.JsonSerializer.ReadCore[Object](Utf8JsonReader& , JsonTypeInfo , ReadStack& ) at System.Text.Json.JsonSerializer.Read[Object](Utf8JsonReader& , JsonTypeInfo ) at System.Text.Json.JsonSerializer.Deserialize(Utf8JsonReader& , Type , JsonSerializerOptions ) at Microsoft.JSInterop.JSRuntime.EndInvokeJS(Int64 , Boolean , Utf8JsonReader& ) Exception_EndOfInnerExceptionStack at Microsoft.JSInterop.JSRuntime.<InvokeAsync>d__161[[System.Collections.Generic.List`1[[Blazor.SubtleCrypto.PromiseResult, Blazor.SubtleCrypto, Version=6.0.1.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() at Blazor.SubtleCrypto.CryptoService.SubtleEncrypt(Object obj) at Blazor.SubtleCrypto.CryptoService.EncryptAsync(Object obj) at Web.Client.Pages.Yonetim.Kullanicilar.Login.StartSigningIn() at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync() at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task , ComponentState )

meiedomi commented 8 months ago

We have the exact same problem on .NET6. We tried using <PublishTrimmed>false</PublishTrimmed>, but no luck with that either. The JS produced by "eval" seems to be correct even when serving from IIS. So the problem must somehow be in the .NET part. We were not able to figure out the root cause.

meiedomi commented 8 months ago

I have found the issue: Because this library uses JSInterop to call the Browser-native Web Crypto API (https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API), it only succeeds if the Blazor app is served from a secure endpoint (HTTPS), otherwise the encryption fails and the errors manifests as a deserialization error in Blazor.

Serving Blazor over HTTPS resolves the issue, but it would be nice if the library would more explicitly fail (JS Console Output? Or explicit error status?).