.NET Framework 相当于 IApplicationBuilder.UseForwardedHeaders()

问题描述 投票:0回答:2

我正在使用在 .NET Framework 4.7.2 上运行的 ASP.NET WebForms 应用程序,该应用程序位于 Azure 应用程序网关后面。网关执行 SSL 切换,因此添加

X-Forwarded-Proto="https"
标头。

我还有一个 .NET Core API,可以在其中进行配置

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseForwardedHeaders();
    app.UseHsts();
    app. //...
}

这已记录在here,但特定于 .NET Core。

我一直无法找到 .NET Framework 的

UseForwardedHeaders
的等效项 - 有等效项吗?

另外,WebForms应用程序运行在OWIN上,所以我可以做这样的事情,但我不知道如何完成它。

public void Configuration(IAppBuilder app)
{
    app.Use(async (context, next) =>
            {
                var forwardedProto = context.Request.Headers["X-Forwarded-Proto"];

                if (forwardedProto.ToLower() == "https")
                {
                    // what now?
                }

                await next();
            });
}

.NET Framework 是否有开箱即用的解决方案,或者关于如何最好地处理此问题的建议?

asp.net ssl webforms owin owin-middleware
2个回答
11
投票

我最终构建了自己的中间件。

public static class UseForwardedHeadersExtension
{
    private const string ForwardedHeadersAdded = "ForwardedHeadersAdded";

    /// <summary>
    /// Checks for the presence of <c>X-Forwarded-For</c> and <c>X-Forwarded-Proto</c> headers, and if present updates the properties of the request with those headers' details.
    /// </summary>
    /// <remarks>
    /// This extension method is needed for operating our website on an HTTP connection behind a proxy which handles SSL hand-off. Such a proxy adds the <c>X-Forwarded-For</c>
    /// and <c>X-Forwarded-Proto</c> headers to indicate the nature of the client's connection.
    /// </remarks>
    public static IAppBuilder UseForwardedHeaders(this IAppBuilder app)
    {
        if (app == null)
        {
            throw new ArgumentNullException(nameof(app));
        }

        // No need to add more than one instance of this middleware to the pipeline.
        if (!app.Properties.ContainsKey(ForwardedHeadersAdded))
        {
            app.Properties[ForwardedHeadersAdded] = true;

            app.Use(async (context, next) =>
                    {
                        var request = context.Request;

                        if (request.Scheme != Uri.UriSchemeHttps && String.Equals(request.Headers["X-Forwarded-Proto"], Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase))
                        {
                            var httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
                            var serverVars = httpContext.Request.ServerVariables;
                            serverVars["HTTPS"] = "on";
                            serverVars["SERVER_PORT_SECURE"] = "1";
                            serverVars["SERVER_PORT"] = "443";
                            serverVars["HTTP_HOST"] = request.Headers.ContainsKey("X-Forwarded-Host") ? request.Headers["X-Forwarded-Host"] : serverVars["HTTP_HOST"];
                        }

                        await next.Invoke().ConfigureAwait(false);
                    });
        }

        return app;
    }
}

0
投票

使用相同的代码,.NET FW 4.8,我收到此错误

Private Const ForwardedHeadersAdded As String = "ForwardedHeadersAdded"

公共共享函数 UseForwardedHeaders(ByVal app As IAppBuilder) As IAppBuilder 如果应用程序什么都不是那么 抛出新的 ArgumentNullException(NameOf(app)) 结束如果

If Not app.Properties.ContainsKey(ForwardedHeadersAdded) Then
    app.Properties(ForwardedHeadersAdded) = True
    app.Use(Async Function(context, [next])
                Dim request = context.Request

                If request.Scheme <> Uri.UriSchemeHttps AndAlso String.Equals(request.Headers("X-Forwarded-Proto"), Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) Then
                    Dim httpContext = context.[Get](Of HttpContextBase)(GetType(HttpContextBase).FullName)
                    Dim serverVars = httpContext.Request.ServerVariables
                    serverVars("HTTPS") = "on"
                    serverVars("SERVER_PORT_SECURE") = "1"
                    serverVars("SERVER_PORT") = "443"
                    serverVars("HTTP_HOST") = If(request.Headers.ContainsKey("X-Forwarded-Host"), request.Headers("X-Forwarded-Host"), serverVars("HTTP_HOST"))
                End If

                Await [next].Invoke().ConfigureAwait(False)
            End Function)
End If

Return app

结束功能

以及使用时

 UseForwardedHeaders(app)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.