блейзор использовал криптографию.Ошибка Алгоритмов

#cryptography #blazor-webassembly

Вопрос:

    Unhandled exception rendering component: System.Security.Cryptography.Algorithms is not supported on this platform.
System.PlatformNotSupportedException: System.Security.Cryptography.Algorithms is not supported on this platform.
   at System.Security.Cryptography.Aes.Create()
   at AutoTradingWebAppV2.Helper.Crypto.Encryptstring(String text, String keyString) in D:WebAutoTradingApp-BWASMAutoTradingWebAppV2HelperCrypto.cs:line 12
   at AutoTradingWebAppV2.Handler.CustomUpbitAuthHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in D:WebAutoTradingApp-BWASMAutoTradingWebAppV2HandlerCustomUpbitAuthHandler.cs:line 31
   at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<>n__0(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at System.Net.Http.Json.HttpClientJsonExtensions.<GetFromJsonAsyncCore>d__13`1[[System.Collections.Generic.IEnumerable`1[[DTOs.AccountDTO, DTOs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
   at Services.UpbitService.GetAccounts() in D:WebAutoTradingApp-BWASMServicesUpbitService.cs:line 31
   at AppViewModels.UpbitTradingViewModel.GetAccounts() in D:WebAutoTradingApp-BWASMAppViewModelsUpbitTradingViewModel.cs:line 156
   at AutoTradingWebAppV2.Pages.TradingInfoBoard.TryConnectToWebsocket() in D:WebAutoTradingApp-BWASMAutoTradingWebAppV2PagesTradingInfoBoard.razor.cs:line 48
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)
 

https://docs.microsoft.com/en-us/dotnet/core/compatibility/cryptography/5.0/cryptography-apis-not-supported-on-blazor-webassembly

тогда как создать JWT в blazor ? или использовать AES?

как это исправить или когда они обновят blazor?

             var jwtToken = JwtBuilder.Create()
                                     .WithAlgorithm(new HMACSHA256Algorithm())
                                     .WithSecret(SecretKey)
                                     .AddClaim("access_key",AccessKey)
                                     .AddClaim("nonce", Guid.NewGuid().ToString())
                                     .Encode();
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
 

Я добавил этот код в обработчик httpclient, но не могу использовать этот код на blazor…

вот пример кода открытого API. Я должен создать токен JWT на клиенте и отправить запрос в api

КОД НА C#.

 public class OpenAPISample {
    public static void Main() {
        var payload = new JwtPayload
        {
            { "access_key", "Access Key" },
            { "nonce", Guid.NewGuid().ToString() },
            { "query_hash", queryHash },
            { "query_hash_alg", "SHA512" }
        };

        byte[] keyBytes = Encoding.Default.GetBytes("Secret Key");
        var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(keyBytes);
        var credentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(securityKey, "HS256");
        var header = new JwtHeader(credentials);
        var secToken = new JwtSecurityToken(header, payload);

        var jwtToken = new JwtSecurityTokenHandler().WriteToken(secToken);
        var authorizationToken = "Bearer "   jwtToken;
    }
}
 

Пример КОДА JAVA (на веб-сайте нет КОДА C#)

  public static void main(String[] args) {
        String accessKey = System.getenv("OPEN_API_ACCESS_KEY");
        String secretKey = System.getenv("OPEN_API_SECRET_KEY");
        String serverUrl = System.getenv("OPEN_API_SERVER_URL");

        Algorithm algorithm = Algorithm.HMAC256(secretKey);
        String jwtToken = JWT.create()
                .withClaim("access_key", accessKey)
                .withClaim("nonce", UUID.randomUUID().toString())
                .sign(algorithm);

        String authenticationToken = "Bearer "   jwtToken;

        try {
            HttpClient client = HttpClientBuilder.create().build();
            HttpGet request = new HttpGet(serverUrl   "/v1/accounts");
            request.setHeader("Content-Type", "application/json");
            request.addHeader("Authorization", authenticationToken);

            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();

            System.out.println(EntityUtils.toString(entity, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 

Комментарии:

1. Вы создаете токен в клиентском приложении? Я не понимаю, почему вы вообще этого хотите?

2. Пример кода java предназначен для серверного / настольного приложения. Вы не можете поместить это в СПА-салон, не обнародовав свой секретный ключ.

Ответ №1:

как создать JWT в blazor ?

На сервере создается JWT. И потребляется клиентским приложением.

API-интерфейсы не поддерживаются по техническим причинам, но вы не должны использовать их на клиенте. Ваш клиент не может скрыть какие-либо учетные данные, это даст только ложную безопасность.

Это справедливо и для AES. Ты не можешь спрятать ключ.


они дают мне только ключ доступа и секретный ключ и просят меня сделать jwt

Вы должны сделать это на своем собственном сервере. Ваш клиент SPA вызывает ваш сервер, который вызывает сервер Open API.

Убедитесь, что секретный ключ никогда не окажется в клиенте SPA.

Комментарии:

1. Спасибо вам за ваш ответ. тогда как использовать открытый API с другого сервера? Я должен вызвать api с другого сервера. для запроса я должен задать запрос. Заголовки. Авторизация

2. И как этот «другой сервер» выполняет аутентификацию? Зачем ему принимать JWT, который вы создали?

3. Спасибо вам за ваш ответ. тогда как использовать открытый API на другом сервере, который запрашивает jwt(они дали мне только ключ доступа и секретный ключ и попросили меня создать jwt и отправить его в request.header.authorization)? Я должен вызвать api с другого сервера. для запроса я должен создать jwt и установить его в запросе. Заголовки. Авторизация

4. Я отредактировал qeustion.