gpt4 book ai didi

azure - 如何从 azure 函数连接到 blob 存储中的托管站点?

转载 作者:行者123 更新时间:2023-12-03 06:58:09 24 4
gpt4 key购买 nike

我有一个存储 HTML 文件的 Blob 存储容器。通过公共(public)访问级别,我可以看到 HTML,但想法是将其设置为私有(private)。我想让用户验证并访问 HTML 文件。

为此,我创建了一个 Azure 函数,其代码中最相关的部分是:

    #r "Newtonsoft.Json"

using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log, string version, string route)
{
var blobUri = "https://mybloburi.blob.core.windows.net/" + route;

var expiresOn = req.Headers.FirstOrDefault(p => p.Key.Equals("x-ms-token-aad-expires-on",
StringComparison.OrdinalIgnoreCase)).Value.FirstOrDefault();

log.LogInformation($"expires On : {expiresOn}");
log.LogInformation($"blob uri : {blobUri}");

var isTokenExpired = (DateTime.Parse(expiresOn, styles: DateTimeStyles.AdjustToUniversal) - DateTime.UtcNow).TotalMinutes < 5;

var bearerToken = isTokenExpired? await RefreshToken(req, log) : req.Headers.
FirstOrDefault(p => p.Key.Equals("x-ms-token-aad-access-token", StringComparison.OrdinalIgnoreCase)).
Value.FirstOrDefault();

log.LogInformation($"bearer token: {bearerToken}");

using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
client.DefaultRequestHeaders.Add("Accept", "*/*");
client.DefaultRequestHeaders.Add("x-ms-version", "2017-11-09");

var response = await client.GetAsync(blobUri);

log.LogInformation($"response: {response}");

var contentType = response.Content.Headers.FirstOrDefault(p => p.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase));
var byteArray = await response.Content.ReadAsByteArrayAsync();

const string defaultContentType = "application/octet-stream";

return new FileContentResult(byteArray, contentType.Value.Any() ? contentType.Value.First() : defaultContentType);
}
}

在 Azure 函数的集成部分中,我添加了以下配置:

enter image description here

然后我创建了一个应用程序注册。在Azure功能的授权选项下,我启用了应用服务身份验证。在那里,我添加了一个新的身份提供商作为 Microsoft,并作为提供商添加了创建的应用程序注册。我创建了一个有权访问 Blob 存储容器的角色组,并将其应用程序 ID 设置为“允许的 token 受众”。

当我测试时,我能够向 AAD 进行身份验证。但是,HTTP 客户端获取函数失败并显示

<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

我不知道要做什么其他配置,而且我似乎在文档中找不到任何可以提供帮助的内容

最佳答案

按照@Thomas 的建议。是的,我们确实有一个静态网站,我们可以在其中简化身份验证。为此,您将默认访问一系列预配置的提供程序,或者您甚至可以注册自定义提供程序。

enter image description here

要配置静态 Web 应用程序以将其用作角色分配的 API 函数,您需要将 rolesSource 属性添加到 auth,这就是 API 的路径函数。

{
"auth": {
"rolesSource": "/api/GetRoles",
"identityProviders": {
// ...
}
}
}

有关更多信息,您可以查看此 document .

关于azure - 如何从 azure 函数连接到 blob 存储中的托管站点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72722913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com