首页 > 解决方案 > Blazor webassembly http 默认标头 Forge Design Automation

问题描述

早上好,我正在尝试使用 Blazor 和 Net5 开发一个 webapp。我已经成功实现了 3 腿身份验证系统,并将令牌附加到默认标头以供进一步请求。我还在同一进程中实现了 2 条腿身份验证请求,并将两者都保存在本地存储中。

现在我需要开始调用一些数据管理服务来存储和检索模型,并将工作项提交给设计自动化。所有这些都需要将承载令牌与请求一起发送。我想在服务器端管理这部分应用程序,问题是:有没有办法在服务器端使用令牌,然后尝试从本地存储中检索它?

此外,是否可以在客户端应用程序中设置两个不同的 HttpClient 以便能够附加两个不同的令牌,然后在服务器端 Blazor 中使用相同的 http 客户端?我假设我无法从客户端向服务器注入服务。我可以使用 DI 在客户端轻松完成

public async Task<string> PostSignedUrlAsync(string bucketKey, string objectKey)
        {
            using (var client = new HttpClient())
            {
                var token = await tokenManager.GetTwoFactorAsync();
                using (var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    $"https://{configurationManager.Host}/oss/v2/buckets/{bucketKey}/objects/{objectKey}/signed"
                    )
                    )
                {

                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
                    using (var response = await client.SendAsync(request))
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var json = await response.Content.ReadAsStringAsync();
                            return JsonConvert.DeserializeObject<PostObjectSigned>(json).SignedUrl;
                        }
                    }
                    return null;
                }
            }
        }
public async Task PostTwoFactorAsync()
        {
            using (var client = new HttpClient())
            {

                using (var request = new HttpRequestMessage(
                    HttpMethod.Post,
                    $"https://{configurationManager.Host}/authentication/v1/authenticate"
                    )
                    )
                {
                    var body = $"client_id={configurationManager.ClientId}&client_secret={configurationManager.ClientSecret}&grant_type=client_credentials&scope={configurationManager.ScopesInternal}";
                    request.Content = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded");
                    using (var response = await client.SendAsync(request))
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var json = await response.Content.ReadAsStringAsync();
                            TokenInternal = JsonConvert.DeserializeObject<Token>(json);
                            TokenInternal.ExpiresOn = DateTime.UtcNow.AddSeconds(TokenInternal.ExpiresIn) - TimeSpan.FromMinutes(10);
                            await localStorage.SetItemAsync(configurationManager.LocalStorageKeyInternal, TokenInternal);
                        }
                    }
                }
            }


        }

也许是一个简单的问题,但我找不到任何可以解释如何解决此“连接”的示例,现在 Forge 文档中围绕 Blazor 实现的示例适用于此任务。

提前致谢

标签: autodesk-forgeautodesk-data-managementautodesk-designautomation

解决方案


首先,请不要从客户端调用 API,发送仅作用域的令牌:viewables:read 以便在 forge viewer 中查看。除此之外,从服务器端调用所有的伪造 API。这是出于安全原因。因为如果您将令牌发送和存储到客户端,任何客户端都可以轻松访问您的资源。

关于令牌范围,请参考以下链接:

文档

教程


推荐阅读