authentication - NET Core 反向代理和身份验证中间件

标签 authentication asp.net-core proxy http-headers azure-front-door

我在 Azure 应用服务上托管了 .Net Core 应用程序,并在 Azure Front Door 反向代理中设置了自定义域名。

当我在本地运行应用程序时以及当我使用 [app_name].azurewebsites.net URL 直接访问 Azure 上的应用程序时,外部身份验证 (Facebook) 已实现并有效。

但是,从我的自定义域或通过 [app_name].azurefd.net 访问应用程序时,我在通过 facebook 登录时遇到服务器错误。

问题似乎是,在授权之后,用户被重定向回应用服务域 (.azurewebsites.net/),而不是自定义域。

我已经在应用程序中配置了转发 header ,但这似乎没有帮助。

 services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders =
                    ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedHost;
                options.ForwardedHostHeaderName = "X-Original-Host";
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

我的登录码是NET Core默认生成的:

<form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal">
                        <div>
                            <p>
                                @foreach (var provider in Model.ExternalLogins)
                                {
                                    <button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
                                }
                            </p>
                        </div>
                    </form>

似乎没有我可以在 Facebook 中间件选项中设置的 Redirect_URI 属性。

tldr:即使从自定义域访问应用程序,我的 .net 核心外部身份验证中间件也会重定向到 azure 域而不是我的自定义域。我已经转发了在 NET Core 中配置的 header 。

更新:为清楚起见进行了编辑

Update2:也尝试了以下无济于事:

app.Use(async (context, next) =>
            {
                if (context.Request.Headers.Any(x => x.Value == "X-Original-Host") != false)
                {
                    var originalHost = context.Request.Headers.FirstOrDefault(x => x.Value == "X-Original-Host").Value;
                    context.Request.Headers.Add("Host", originalHost);
                }
                await next.Invoke();
            });

最佳答案

根据以下问题,应用程序网关上的重定向也存在同样的问题: Redirect to absolute URL on timeout in ASP.NET Core 2.0 application

感谢Tratcher他对那个问题的回答。解决方案是在 Startup.cs 的 Configure 方法中添加以下内容:

app.Use((ctx, next) =>
{
    ctx.Request.Host = new HostString(options.Value.CustomDomain);
    return next();
});

关于authentication - NET Core 反向代理和身份验证中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59964071/

相关文章:

authentication - 如何使用 FSharp.Data 的用户名和密码

mysql - 无法在 Mac 上使用 --login-path 登录

visual-studio - 所有 .Net Core 项目显示黄色感叹号/三角形

javascript - 尝试查找元素返回 "Proxy?"

facebook - 使用用户名/密码以编程方式登录 Facebook

安卓 : authentication to php server application

javascript - ASP.NET Core API 中的模型绑定(bind)始终为 null

c# - 如果以docker image身份运行,则找不到证书,而以IISExpress身份运行时,证书会返回

mysql - Node.js + 公共(public) mysql 数据库 : "connect ECONNREFUSED"

php - 我如何检查代理是否处于事件状态