使用 FrontDoor 通过 Azure AD redirect_uri 进行身份验证不正确

2023-12-09

我有一个 Azure FrontDoor 设置作为在端口 5443 上运行的容器和自定义域之间的反向代理/负载均衡器。这样做的目的是为用户提供一个标准的地址。 IE。 container.azurecontainer.io:3443 被指向https://oursite3.example.com.

同一个 aci 正在运行多个容器:


    container.azurecontainer.io:443
    container.azurecontainer.io:2443
    container.azurecontainer.io:3443


    https://oursite1.example.com
    https://oursite2.example.com
    https://oursite3.example.com 

(line 116: BuildRedirectUri

然后,我们在全球不同区域部署了多个 aci(因此使用 Frontdoor 在不同实例之间进行负载平衡)。

在此示例中,container.azurecontainer.io:3443 安装了 MS AD 身份验证。单击链接后,用户会重定向到登录,并生成一个链接并将浏览器重定向到该链接。该链接中包含redirect_uri。就像是:alskdjflkjalksdfjalkjA&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0

但是,登录后,用户会在网站上看到以下内容:

AADSTS50011:请求中指定的回复 URL 与为应用程序配置的回复 URL 不匹配:“00000000-0000-0000-0000-000000000003”

原因是 AD 应用程序的回复 url 设置为:

https://oursite3.example.com/signin-oidc

然而,仔细检查后,用户登录时重定向到的 url 包含以下作为 redirect_uri:

https://oursite3.example.com:5443/signin-oidc

即端口 5443 已添加到主机名的末尾。

本质上,它包括了redirect_uri 中的底层原始端口,这是我不希望看到的。

我尝试在我们的网站中使用 ForwardedOptions 。例如,我们的startup.cs文件包含以下内容(ConfigureServices):

            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
                                           ForwardedHeaders.XForwardedProto;
                // Only loopback proxies are allowed by default.
                // Clear that restriction because forwarders are enabled by explicit 
                // configuration.
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

接下来是(配置):

             app.UseForwardedHeaders();

这并不能解决问题。

我查看了是否可以通过查看此处来覆盖设置为redirect_uri 的值:https://github.com/dotnet/aspnetcore/blob/b7e122fbac4207b003dc07f6101e50218be8ff21/src/Security/Authentication/Core/src/AuthenticationHandler.cs

我也尝试过这个:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1#troubleshoot

和这个:

https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1#nginx-configuration

有人知道还有什么可能是错的吗?

thanks


当Web应用程序位于Azure Front Door后面时,我们需要将/authorize请求中的redirect_uri配置为Front Door的地址。

在下面的代码中,我们重写“OnRedirectToIdentityProvider”事件并注入前门的地址。当我尝试这个时,我只是对地址进行了硬编码,但理想情况下,您可以从 Front Door 注入请求的标头中提取它。

这是我在尝试对在 Azure 应用服务上运行、受 Azure AD 保护、在 Azure Front Door 后面运行的 Blazor Server 应用程序 (.net 6) 进行身份验证时使用的代码。

public void ConfigureServices(IServiceCollection services)
{
    // ... existing code

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
                .EnableTokenAcquisitionToCallDownstreamApi(new[] { "User.Read" })
                .AddInMemoryTokenCaches();

    services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
    {
        options.Events = new OpenIdConnectEvents
        {
            OnRedirectToIdentityProvider = (context) =>
            {   
                // Override the redirect_uri
                //  Ideally extract this from config 
                //  Or context.Request.Headers["X-Forwarded-Host"]
                //  see: https://learn.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol#front-door-to-backend

                context.ProtocolMessage.RedirectUri 
                    = "https://YOUR-FRONT-DOOR-or-APP-GATEWAY/signin-oidc";
                return Task.FromResult(0);
            }
        };
    });

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
                        ForwardedHeaders.XForwardedProto;
        options.KnownNetworks.Clear();
        options.KnownProxies.Clear();
    });

    // ... existing code
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ... existing code
    
    // Don't forget to add this ...
    app.UseForwardedHeaders();
    
    // ... existing code
}

当代码运行时,“redirect_uri”参数应指向您的前门/网关,如下所示。

enter image description here

希望有帮助。 ❤️

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

使用 FrontDoor 通过 Azure AD redirect_uri 进行身份验证不正确 的相关文章

  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route
  • aspnetcore web项目导入另一个项目的控制器

    两个项目的csproj和版本 AspNetCore Web 项目
  • ASP.NET Core Web 应用程序和 Razor 类库项目之间的路由

    我创建了一个 ASP NET Core 3 0 MVC 项目 它运行良好 在同一个解决方案中 我添加了 3 个 或更多 项目 Razor 类库 每个这样的项目都有一个控制器 如何配置路由以便可以访问这些项目的控制器方法 我的解决方案如下所示
  • MVC Core使用ajax发布数据并刷新页面上的某个部分

    我正在开发 AspNet Core 2 0 MVC 网站 问题是 我在一个页面中有 2 个表单 第一个表单用于提交模型 这是通过以下操作完成的 HttpPost public IActionResult AddProductToSale F
  • 如何仅更新实体框架中的特定字段(核心)

    我正在编写一个应用程序 它从外部 API 提取数据并使用实体框架将其存储到我的 SQL Server 数据库中 我每天从这个 API 中提取数据 因此如果一行已经存在 记录将被更新 否则将创建一条新记录 这是通过检查 Id 来完成的 现在我
  • 如何让“dnu”命令在 OS X 上运行?

    刚刚下载并安装视觉工作室代码 https code visualstudio com 在 OS X 10 10 3 上 我已经设法部分遵循ASP NET 5 安装说明 https code visualstudio com docs ASP
  • AWS DynamoDB 与 ASP .Net Core 3.1.0 Identity 2.2.0

    我必须将 Asp net core Identity 2 2 0 与 AWS DynamoDB 集成 我正在使用 net core 版本 3 1 我搜索了参考资料 但没有找到任何好的参考资料 请帮我 我得到了一份参考资料https gith
  • 如何更改.net core的URL后缀?

    我怎样才能有以下路线 http localhost 4413 abc 以及以下路线 http localhost 4413 abc html 两者都返回相同的控制器方法 使用 NET Core MVC 听起来您想要两个后缀来达到相同的控制器
  • 使用 DI 将参数传递给 DbContext

    我想向 DBContext 传递一个附加参数 如下所示 string myParam xx string con connenctionstring services AddDbContext
  • 从 ASP.NET Core 2.2 迁移到 3.1

    我们目前有一个ASP NET 核心 2 2我们想要迁移到的网络应用程序3 1 因为它较新并且包含一些增强功能 有关于迁移的文章2 2 to 3 0但不是2 2 to 3 1 是升级到的首选迁移途径3 0先升级到3 1 之间似乎有很多不兼容的
  • 我们需要依赖注入的接口吗?

    我有一个 ASP NET Core 应用程序 该应用程序有一些帮助程序类可以完成一些工作 每个类都有不同的签名方法 我在网上看到很多 net core 示例 它们为每个类创建接口 然后向 DI 框架注册类型 例如 public interf
  • ASP.NET Core MVC防伪

    尝试在核心 mvc 项目中打开防伪功能 但没有成功 做了什么 添加过滤器以自动检查每个 POST 请求的防伪令牌 services AddMvc o gt o Filters Add new AutoValidateAntiforgeryT
  • index.g.cshtml 在哪里

    我正在尝试完成本教程 但是 通常 当我构建解决方案时 我会得到一个CS0234错误指出文件中缺少命名空间Index g cshtml cd 但是这个文件存在于哪里呢 我努力了 所有构建 清理 重建解决方案选项 我已重新启动 Visual S
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 如何将 SPA 嵌入 ASP.NET Core 库并从路径提供服务

    Szenario 我想构建一个 aspnetcore 库 模块includes一个小的SPA前端 IE html js css 文件应与 dll 一起提供 SPA 应从特定路径提供服务 即 some module does not需要可配置
  • 如何使用 IdentityServer 4 实施 Windows 身份验证

    如何使用Identity Server 4正确实现Windows身份验证 有没有样本可以做到这一点 我查看了 IdentityServer 4 的源代码 在 AccountController 的 Host 项目中 我注意到有 Window
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id

随机推荐

  • 为什么结构体不能成为其自身的成员?

    我有一个结构foo 声明类型成员foo works typedef struct foo struct foo children 26 foo 但是如果我尝试声明类型的成员foo我收到错误 typedef struct foo struct
  • Jvm 使用的内存比本机内存跟踪显示的要多,我如何找到额外的 meeory 的去向? [复制]

    这个问题在这里已经有答案了 我在我的网络服务器上运行 jetty 我当前的jvm设置 Xmx4g Xms2g 但是jetty使用了更多的内存 我不知道这些额外的内存去了哪里 Jetty总共使用4 547g内存 堆使用情况显示堆内存使用量为
  • ActiveRecord 在日期字段上按年、日或月查找

    我有一个具有日期属性的 ActiveRecord 模型 是否可以利用该日期属性按年 日和月查找 Model find by year 2012 Model find by month 12 Model find by day 1 或者是否可
  • 如何禁用 Kubernetes pod 的交互式会话 (kubectl exec)

    我需要禁用对 Kubernetes pod 的交互式会话 ssh 访问 它通过 RBAC 系统和 pods exec 子资源进行控制 您可以根据需要设置策略
  • 什么是合成构造函数?

    它是什么 我有一个模糊的理解 合成构造函数是由编译器隐式创建的构造函数 它也初始化其成员类对象 但可能会也可能不会满足程序实现的需要 这个定义正确吗 在什么情况下它会被合成 什么情况下不会 下面的文章比我以前能更好地回答你的问题 我引用了这
  • 在armv8架构中将半字值存储到堆栈内存中时出现总线错误?

    我有两个寄存器 w1 和 w2 我想将它们存储在堆栈上 我想将完整的单词w1和w2的一半存储到堆栈中 这是我的实现 STR w1 sp 8 STRH w2 sp 8 编译时 第一条指令运行良好 但第二条指令引发总线错误 我知道这是一些对齐问
  • Sed 和重命名文件

    我的目录中有大量文件 每个文件都有不同的名称和长度 类似的医生 218 级 1080p 30fps H264 128kbit AAC mp4另一种类型 Class 223 1080p 30fps H264 128kbit AAC mp4 e
  • 在解析大写月份名称的日期时,我得到 java.time.format.DateTimeParseException [重复]

    这个问题在这里已经有答案了 我有几行代码 如下所示 DateTimeFormatter formatter DateTimeFormatter ofPattern dd MMM yy formatter formatter withLoca
  • 替换 dask 数据框分区

    我可以将 dask 数据帧分区替换为我单独创建的另一个具有相同行数和相同结构的 dask 数据帧分区吗 如果是 怎么办 是否可以使用不同的行数 您可以使用以下命令将分区添加到 Dask 数据帧的开头或结尾dd concat功能 您可以通过切
  • 仅返回匹配的多值字段

    假设一个具有名称的多值 存储和索引字段comment 执行搜索时 我只想返回以下值comment其中包含匹配项 例如 当搜索 gold 而不是得到这个结果时
  • Django异步更新单页模板

    我有一个带有此函数的 django 视图来获取模板的数据 def get context data self kwargs context super MyView self get context data kwargs context
  • Chrome 问题 - 嵌入 Windows 媒体播放器

    我遇到问题了 我在页面中嵌入了 WMP 并且需要对播放器隐藏按钮 我可以在 IE 和 FF 中隐藏它们 但在 Google Chrome 中却做不到 这是代码
  • Google Sheets - 使用 UNIQUE 函数并显示为一行

    在 Google 表格中 在列上使用 UNIQUE 会导致所有唯一值显示在列中 有没有办法让所有值显示在行而不是列中 尝试这个 UNIQUE FLATTEN A1 D1
  • CakePHP 发送电子邮件

    我在使用 CakePHP 发送邮件时遇到问题 一切都很顺利 但我没有收到任何一封邮件 我厌倦了发送到两封不同的电子邮件 WebsitesController php App uses AppController Controller App
  • 仅返回字符串中的数字 0-9

    我需要一个可以在 VBScript 和 NET 中使用的正则表达式 它仅返回在字符串中找到的数字 例如 以下任何 字符串 应仅返回1231231234 123 123 1234 123 123 1234 123 123 1234 123 1
  • 当充气之前充气的片段时应用程序崩溃

    应用程序加载和查看EventFragment java显示地图 当您单击另一个选项卡片段时 它会很好地加载该片段 当您返回到第一个选项卡 地图 时 它会崩溃并出现以下错误 07 03 14 13 54 640 E AndroidRuntim
  • 取消异步httpweb请求

    我正在制作一个应用程序 它将制作多个 HttpWebRequest 对象并通过下载我的 htmlhttpRequest BeginGetResponse方法 我回来了IAsyncResult并将其存储在本地 以便我可以随时取消请求 但我不确
  • 安装重新缩进Python

    我在使用 Notepad 进行 Python 缩进时遇到很多问题 为了解决这个问题 我尝试安装Python redent模块 但我不知道如何使用它 如果有人成功了请告诉我 这是我尝试过的步骤 1 使用简易安装我尝试安装该软件包 C Pyth
  • Java - 每秒重新绘制组件?

    我想每秒重新绘制组件 但它不起作用 我正在尝试的是 try while true Thread currentThread sleep 1000 gc cb next gc repaint catch Exception ie 我建议使用j
  • 使用 FrontDoor 通过 Azure AD redirect_uri 进行身份验证不正确

    我有一个 Azure FrontDoor 设置作为在端口 5443 上运行的容器和自定义域之间的反向代理 负载均衡器 这样做的目的是为用户提供一个标准的地址 IE container azurecontainer io 3443 被指向ht