Как установить политику CORS для триггера HTTP-функции Azure "WithExposedHeaders("*")?

avatar
Richard
8 августа 2021 в 21:40
413
2
0

Я пытаюсь получить значения заголовка из триггера HTTP функции Azure.

У меня есть клиент Blazor Wasm.

Когда я использую клиент, коллекция заголовков пуста.

У меня есть та же версия кода, которая работает с моим клиентом Blazor Wasm, вызывающим REST API. Когда я устанавливал эту версию, мне пришлось настроить политику CORS, как показано ниже, в моем файле Startup.cs.

.

После того как я добавил этот код, мой клиент Blazor Wasm получил значения заголовков из моего API.

            services.AddCors(options =>
            {
                options.AddPolicy(StringConstant.AllowedSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins(origins)
                            .AllowAnyHeader()
                            .AllowAnyMethod()
                            .WithExposedHeaders("*");
                    });
            });

Похоже, мне нужно сделать то же самое из моей Функции Azure, поскольку коллекция заголовков пуста в моем объекте Response.

Есть идеи, как это настроить?

Мой клиент Blazor Wasm использует метод httpClient.GetAsync.

Источник
stuartd
8 августа 2021 в 22:11
0

Вы пытались установить его на портале Azure?

Richard
8 августа 2021 в 22:22
0

Спасибо за ответ. Нет, я работаю локально. Можно ли это сделать на портале?

stuartd
9 августа 2021 в 00:02
0

По приведенной выше ссылке да, вы можете настроить CORS на портале - imgur.com/a/5ic2RRq - хотя я не уверен насчет WithExposedHeaders. Хотя локально - чего мне не приходилось сделать на время - возможно, нет ..

Walter Lockhart
4 декабря 2021 в 17:53
0

Привет Ричард. Я точно в такой же ситуации, как и вы. Удалось решить?

Richard
22 декабря 2021 в 21:26
0

@WalterLockhart Нет, я так и не решил эту проблему. Было приложение PIC, так что это не критично. Таким образом, я действительно не тратил намного больше времени на этот вопрос. Если вы найдете решение, пожалуйста, дайте мне знать. ТЮ

Bandook
11 февраля 2022 в 13:18
0

@WalterLockhart см. coderhelper.com/a/71080645/9276081

Ответы (2)

avatar
Bandook
11 февраля 2022 в 13:09
0

Нашел решение - https://coderhelper.com/a/71080532/9276081, я также вставил сюда свой ответ -

Проблема связана не с Blazor WASM, а с тем, что этот заголовок был открыт на стороне вашего API. В вашей лазурной функции добавьте следующее -

Примечание: Postman по-прежнему будет показывать заголовки, даже если вы не открываете заголовки, как показано ниже. Это потому, что Postman не заботится о заголовках CORS. CORS — это просто концепция браузера, а не сильный механизм безопасности. Он позволяет вам ограничить, какие другие веб-приложения могут использовать ваши серверные ресурсы, и все.

Сначала создайте файл запуска для внедрения HttpContextAccessor

Необходимый пакет: Microsoft.Azure.Functions.Extensions

[assembly: FunctionsStartup(typeof(FuncAppName.Startup))]

namespace FuncAppName
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddScoped<HttpContextAccessor>();
        }
    }
}

Далее вставьте его в свою основную функцию -

using Microsoft.AspNetCore.Http;
namespace FuncAppName
{
    public class SomeFunction
    {
        private readonly HttpContext _httpContext;
        public SomeFunction(HttpContextAccessor contextAccessor)
        {
             _httpContext = contextAccessor.HttpContext;
        }

        [FunctionName("SomeFunc")]
        public override Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, new[] { "post" }, Route = "run")] HttpRequest req)
        {
            var response = "Some Response"
            _httpContext.Response.Headers.Add("my-custom-header", "some-custom-value");
            _httpContext.Response.Headers.Add("my-other-header", "some-other-value");
            _httpContext.Response.Headers.Add("Access-Control-Expose-Headers", "my-custom-header, my-other-header");
            return new OkObjectResult(response)
        }

Если вы хотите разрешить все заголовки, вы можете использовать подстановочный знак (я думаю, не проверено) -

_httpContext.Response.Headers.Add("Access-Control-Expose-Headers", "*");

Вам по-прежнему необходимо добавить URL-адрес веб-приложения в CORS платформы Azure. Вы можете добавить подстановочный знак *, подробнее здесь — https://iotespresso.com/allowing-all-cross-origin-requests-azure-functions/

для включения CORS для локальных приложений во время разработки — https://coderhelper.com/a/60109518/9276081

Теперь, чтобы получить доступ к этим заголовкам в Blazor WASM, например. можно -

protected override async Task OnInitializedAsync()
{
    var content = JsonContent.Create(new { query = "" });
    using (var client = new HttpClient())
    {
        var result = await client.PostAsync("https://func-app-name.azurewebsites.net/api/run", content);
        var headers = result.Headers.ToList();
    }
}
avatar
SaiKarri-MT
3 сентября 2021 в 12:06
0

Мы можем добавить CORS в наше приложение-функцию с портала Azure.

Ниже показано место, куда мы можем добавить с портала Azure:

enter image description here

Добавьте *, если мы хотим разрешить все источники, иначе мы можем добавить URL-адреса, включающие их конкретно.

См. несколько связанных документации от Microsoft о CORS в Portal, с кодом<11495768144857>>>