使用 Azure Active Directory 访问 Azure Function 时,Blazor 客户端出现 CORS 错误

2023-12-19

我已经尝试部署 Blazor PWA 两天了,到目前为止没有任何成功,如果有人知道我做错了什么,我将非常感激。 你好 我可以自己解决大部分问题,但现在使用 AAD 遇到了 CORS 问题。

这是我的项目设置:

  • Blazor WebAssembly 客户端托管在静态网站存储上(有效) 太棒了),净 5
  • 连接到 Azure Sql Server 数据库的 AzureFunctions(效果很好 在 Blazor 中使用匿名身份验证)
  • 我想使用 Azure Active Directory 对用户进行身份验证。 (保护 blazor 应用程序和功能)

因此,我创建了一个应用程序注册,将我的静态网站地址添加为 SPA uri,并取消选中两者隐式。 在我的 blazor 客户端 program.cs 中,我添加了以下代码来连接到 AAD:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); //contains clientId, Authority
    options.ProviderOptions.DefaultAccessTokenScopes.Add("https://graph.microsoft.com/User.Read");
    options.ProviderOptions.LoginMode = "redirect";
});

这也很好用,我可以登录,授权查看按预期工作。

问题是当我尝试使用“使用 Azure Active Directory 登录”对 Azure 功能进行身份验证时, 我尝试了快速配置和高级配置(使用 clientId、tenantId),但是当我

可以从来源“https://login.windows.net/tenantid/oauth2/authorize ...(从“https://myfunctionstorage.azurewebsites.net/api/client/list”重定向)获取数据:/ /*****9.web.core.windows.net' 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

当然,我已经在 Azure Functions 配置上为 Blazor 客户端地址启用了 CORS,但问题似乎与登录 Windows uri 相关...

另外,如果我在应用程序注册中启用令牌 id 隐式流并在浏览器中访问登录 url,则它工作得很好。

到目前为止我能找到的所有示例都是关于 msal 1.0 和使用隐式流而不是 SPA 的应用程序注册,因此它没有帮助......

感谢您的时间和帮助。

更新: 从昨天开始我做了更多的研究,我认为这可能与我的 HTTPClient 有关,目前我使用基本的(只有一个基本地址)。

但我在一些示例中看到,当使用 AAD 来使用客户端时,它需要更多参数,例如:

builder.Services.AddHttpClient("companiesAPI", cl => { cl.BaseAddress = new Uri("https://localhost:5001/api/"); }) .AddHttpMessageHandler(sp => { var handler = sp.GetService<AuthorizationMessageHandler>() .ConfigureHandler( authorizedUrls: new[] { "https://localhost:5001" }, scopes: new[] { "companyApi" } ); return handler; });

需要 AuthorizationMessageHandler 吗? 我还看到一些关于需要使用“use_impersonation”范围的参考。

使用 msal2/SPA 应用程序注册时是否也需要进行这些更改(在 HttpClient 和 use_impersonation 范围上)?

谢谢


如果想在 Blazor WebAssembly 客户端中调用 Azure AD 投影的 Azure 函数,请参考以下步骤 如果您想在Angular应用程序中调用Azure AD投影的Azure函数,请参考以下代码

  • 创建 Azure AD 应用程序以保护功能

    1. 注册 Azure AD 应用程序。完成后,请复制应用程序(客户端)ID目录(租户)ID

    2. 配置重定向URI。选择Web并输入<app-url>/.auth/login/aad/callback.

    3. Enable 隐性拨款流程

    4. Define API scope and copy it enter image description here

    5. 创建客户端机密。

  • 在应用服务应用中启用 Azure Active Directory

  • Configure CORS policy in Azure Function enter image description here

  • 创建客户端AD应用程序来访问功能

    1. 注册申请
    2. Enable 隐性拨款流程
    3. 配置API权限。让您的客户端应用程序有权访问函数
  • Code

  1. 创建自定义AuthorizationMessageHandler class
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;

public class CustomAuthorizationMessageHandler : AuthorizationMessageHandler
{
    public CustomAuthorizationMessageHandler(IAccessTokenProvider provider, 
        NavigationManager navigationManager)
        : base(provider, navigationManager)
    {
        ConfigureHandler(
            authorizedUrls: new[] { "<your function app url>" },
            scopes: new[] { "<the function app  API scope your define>" });
    }
}
  1. 在中添加以下代码Program.cs.
 public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");
             // register CustomAuthorizationMessageHandler 
            builder.Services.AddScoped<CustomAuthorizationMessageHandler>();
            // configure httpclient
            // call the following code please add packageMicrosoft.Extensions.Http 3.1.0
            builder.Services.AddHttpClient("ServerAPI", client =>
              client.BaseAddress = new Uri("<your function app url>"))
                    .AddHttpMessageHandler<CustomAuthorizationMessageHandler>();
            // register the httpclient
            builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
             .CreateClient("ServerAPI"));
            // configure Azure AD auth
            builder.Services.AddMsalAuthentication(options =>
            {
                builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
                options.ProviderOptions.DefaultAccessTokenScopes.Add("<the function app  API scope your define>");


            });

            await builder.Build().RunAsync();
        }
  1. 调用API
@page "/fetchdata"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject HttpClient Http

<h1>Call Azure Function</h1>

<p>This component demonstrates fetching data from the server.</p>

<p>Result: @forecasts</p>

<button class="btn btn-primary" @onclick="CallFun">Call Function</button>

@code {
    private string forecasts;

    protected async Task CallFun()
    {
        forecasts = await Http.GetStringAsync("api/http");
    }


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Azure Active Directory 访问 Azure Function 时,Blazor 客户端出现 CORS 错误 的相关文章

随机推荐

  • 圆包作为 D3 力布局的节点

    Here is jsfiddle http jsfiddle net VividD 4eru2 如果您有两个政党 并且您想要呈现多个投票单位的选举结果或类似结构的数据 那么这确实很好 但是 我需要直观地表示这一点 5 个政党而不是 2 个
  • 如何在 ASP.NET Web 窗体中显示变量值?

    我尝试像这样显示变量值 但我知道一开始该值为空 这就是为什么我在页面上看不到任何内容 的价值userTotalCount稍后设置变量Page Load 事件 设置后如何显示该值 错误是您没有渲染该值 要将其呈现在页面上 请使用 注意第一个
  • 代码契约:为什么有些不变量不在类之外考虑?

    考虑这个不可变类型 public class Settings public string Path get private set ContractInvariantMethod private void ObjectInvariants
  • 在Windows中编译Haskell程序:是否可以在不下载诸如Cygwin之类的东西的情况下进行?

    我正在阅读 Learn a Haskell for Great Good 并且已经读到了有关 I O 操作的章节 我使用的是 Windows 并且已经下载了 GHCi 和 WinGHCi 我正在尝试编译一个简单的程序 并在 emacs 上保
  • 如何清除文本文件内容c#

    我想要用这种方法清除文本文件内容 private void writeTextFile string filePath string text if File Exists filePath File Create filePath Clo
  • Promise es6 和 superagent

    我正在尝试将 es6 Promise 与 superagent 一起使用 我正在尝试调用一个包含超级代理请求的函数 Request post buildReq then res gt if res ok process res 这是包装 s
  • NHibernate 中的刷新

    这个问题有点愚蠢 但我仍然不明白处理冲洗的最佳方法 我正在迁移现有的代码库 其中包含很多如下代码 private void btnSave Click SaveForm ReloadList private void SaveForm va
  • 识别 C# 中的操作系统详细信息

    如何在 WPF 应用程序中使用 C 代码获取操作系统详细信息 The 环境 http msdn microsoft com en us library system environment aspx类提供特性 http msdn micro
  • 使用 Maven 执行 Ant 任务

    我正在尝试使用 Maven 执行一些使用 Ant 任务编写的测试 我生成了将任务导入 Maven 所需的文件 但无法执行它们 我的 POM 是这样定义的
  • 由于权限不足导致代码签名无效

    我试图在我的物理设备上运行一个应用程序 它开始在我的设备上构建 然后由于 无效的代码签名 不充分的权利或其配置文件尚未受到用户的明确信任 而崩溃 我已将我的 iPhone 和 Xcode 更新到最新版本 尝试清理构建并将运行方案构建配置编辑
  • 如何在不重新压缩 JPEG 的情况下删除 EXIF 数据? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我想从 JPEG 文件中删除 EXIF 信息 包括缩略图 元数据 相机信息 一切 但我不想重新压缩它 因为重新压缩 JPEG 会降低质
  • 请求 - 无法处理两个具有相同名称、不同域的 cookie

    我正在编写一个 Python 2 7 脚本 使用请求自动访问一个网站 该网站设置两个具有相同名称但不同域的 cookie 例如名称 mycookie 域 www example com 和 subdomain example com 我的客
  • 使用 python/PIL 的图像轮廓

    我有一张苹果的彩色照片 如何用 python PIL 只显示它的轮廓 内部白色 背景黑色 像这样的东西应该有效 from PIL import Image ImageFilter image Image open your image pn
  • user_pseudo_id 的计数与 Firebase 仪表板中显示的数字不同

    我正在使用 Firebase 并希望通过 BigQuery 计算每日活跃用户数 但数字与仪表板中显示的数字不同 我尝试了以下查询 SELECT count distinct user pseudo id as dau FROM xxxx e
  • 是否有不同类型的 NULL?

    这来自
  • 如何将 Java Pojo 转换为 Nashorn Json?

    我有一个 Java 对象 我想将其转换为 json 对象并传递给 Nashorn javascript 引擎 谷歌搜索这个问题的答案是非常困难的 有人可以告诉我该怎么做吗 我试过这个 ObjectMapper mapper new Obje
  • javascript正则表达式删除括号中的尾随数字

    我如何替换 追加something 22 字符串到something 使用某种匹配某物的表达式不是常量 它总是不同的 但部分 整数 总是相同的 干杯 EDIT 我发现这有点令人困惑 对我来说也是如此 这就是我的意思 我有一个字符串 一个词
  • 如何在 Android UI 中设置布局背景

    我是 Android 编程新手 我有一个带有一些的用户界面TextView and Button控制 如何在这些组件后面设置背景 我们称之为background png 在您的父布局元素中 例如线性布局或其他 只需添加android bac
  • 解释如何在 Rails 中利用 order 子句

    我很难理解这一部分是如何从这个网站关于 Rails SQL 注入 http rails sqli org resources works 在 ORDER BY 子句中利用 SQL 注入很棘手 但 CASE 语句可用于测试其他字段 将排序列切
  • 使用 Azure Active Directory 访问 Azure Function 时,Blazor 客户端出现 CORS 错误

    我已经尝试部署 Blazor PWA 两天了 到目前为止没有任何成功 如果有人知道我做错了什么 我将非常感激 你好 我可以自己解决大部分问题 但现在使用 AAD 遇到了 CORS 问题 这是我的项目设置 Blazor WebAssembly