【问题标题】:Blazor webassembly http default header Forge Design AutomationBlazor webassembly http 默认标头 Forge Design Automation
【发布时间】:2021-03-18 09:28:07
【问题描述】:

早上好, 我正在尝试使用 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-designautomation
  • 是的,考虑到在我提到的关于工作项的问题中,该问题确实与包括 DA 在内的不同服务有关。但如果你认为不相关就没有戏剧。谢谢
  • 嗨@Cesare Caoduro,对不起,我忽略了,如果你有oAuth令牌,你可以在标题中传递给DA客户端。 github.com/Autodesk-Forge/forge-api-dotnet-core/blob/… 所有 API 调用都采用带有标头的字典,因此您可以传递自己的 Authorization 标头。见github.com/Autodesk-Forge/forge-api-dotnet-design.automation/…
  • 嗨@Madhukar Moogala,问题有点不同。我知道我可以传递标头和授权令牌,但问题更多与从 Blazor WASM 客户端到应用程序服务器端的可能性有关,然后应用程序将调用 DA api 或数据管理 api。所以避免暴露应用程序的WASM部分中的业务逻辑基本上是双跳。
  • 如果您可以分享minimal-reproducible-example 可能会更好地了解您的查询,但我无法从sn-ps 中理解。它可以帮助整个社区

标签: autodesk-forge autodesk-data-management autodesk-designautomation


【解决方案1】:

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

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

Documentation

Tutorial

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 2020-04-02
    • 2021-09-17
    • 2019-08-07
    • 2020-04-10
    • 2020-08-05
    • 2018-07-06
    • 2020-11-19
    相关资源
    最近更新 更多