Asp.net core 无限重定向循环到https

Asp.net core 无限重定向循环到https,asp.net-core,azure-web-app-service,Asp.net Core,Azure Web App Service,我在我的asp.net核心web应用程序中添加了以下简单的中间件: if(!env.IsLocalhost()) { 应用程序使用(异步(上下文,下一步)=> { if(context.Request.IsHttps) { 等待下一个(); } 其他的 { var withHttps=“https://”+context.Request.Host+context.Request.Path; context.Response.Redirect(使用HTTPS); } }); app.UseMidd

我在我的asp.net核心web应用程序中添加了以下简单的中间件:

if(!env.IsLocalhost())
{
应用程序使用(异步(上下文,下一步)=>
{
if(context.Request.IsHttps)
{
等待下一个();
}
其他的
{
var withHttps=“https://”+context.Request.Host+context.Request.Path;
context.Response.Redirect(使用HTTPS);
}
});
app.UseMiddleware();
} 
部署到Azure后,我有一个无限重定向循环

我已经验证了中间件导致了无限循环(如果我把它注释掉,循环就会消失),并且IsHttps确实是真的


有人对为什么会发生这种情况有什么建议吗?

在azure中运行时,这是一个已知的问题

您可以通过在ConfigureSerivces中添加以下内容来解决此问题:

        services.Configure<ForwardedHeadersOptions>(options =>
        {
          options.ForwardedHeaders = ForwardedHeaders.XForwardedProto
        });
services.Configure(选项=>
{
options.ForwardedHeaders=ForwardedHeaders.XForwardedProto
});

在azure中运行时,这是一个已知问题

您可以通过在ConfigureSerivces中添加以下内容来解决此问题:

        services.Configure<ForwardedHeadersOptions>(options =>
        {
          options.ForwardedHeaders = ForwardedHeaders.XForwardedProto
        });
services.Configure(选项=>
{
options.ForwardedHeaders=ForwardedHeaders.XForwardedProto
});

我用这段代码设法解决了RC1的问题:

app.Use(async (context, next) =>
            {
                String protoHeader = context.Request.Headers["X-Forwarded-Proto"];
                if (protoHeader.ToLower().Equals("https"))
                {
                    await next();
                }
                else
                {
                    var withHttps = "https://" + context.Request.Host + context.Request.Path;
                    context.Response.Redirect(withHttps);
                }
            });

我使用以下代码块成功地解决了RC1的问题:

app.Use(async (context, next) =>
            {
                String protoHeader = context.Request.Headers["X-Forwarded-Proto"];
                if (protoHeader.ToLower().Equals("https"))
                {
                    await next();
                }
                else
                {
                    var withHttps = "https://" + context.Request.Host + context.Request.Path;
                    context.Response.Redirect(withHttps);
                }
            });

我可以确认,这确实解决了问题。重要的是要注意,这个问题已经在RTM中修复,预计2016年6月27日。@Tratcher尽管我相信这是正确的答案,但我仍然无法验证它,因为上面显示的代码基于RC2,我们使用的是RC1。有人能建议在使用RC1时该怎么做吗?RC1不受影响。在重定向中间件之前,您的管道中是否有
app.useisintegration()
?这是RC1所必需的,但RC2不需要。@Tratcher好的,上面的代码根本不编译。在我看来,隐含的类(如ForwardedHeadersOptions)仅在RC2程序集中可用。我在project.json中添加了“Microsoft.AspNet.HttpOverrides”:“1.0.0-rc1-final”,但即使这样,也无法解析ForwardedHeaders选项。无论如何,我设法用一些简单的代码块解决了这个问题,参见我自己发布的答案。我可以确认,这确实解决了这个问题。重要的是要注意,这个问题已经在RTM中修复,预计2016年6月27日。@Tratcher尽管我相信这是正确的答案,但我仍然无法验证它,因为上面显示的代码基于RC2,我们使用的是RC1。有人能建议在使用RC1时该怎么做吗?RC1不受影响。在重定向中间件之前,您的管道中是否有
app.useisintegration()
?这是RC1所必需的,但RC2不需要。@Tratcher好的,上面的代码根本不编译。在我看来,隐含的类(如ForwardedHeadersOptions)仅在RC2程序集中可用。我在project.json中添加了“Microsoft.AspNet.HttpOverrides”:“1.0.0-rc1-final”,但即使这样,也无法解析ForwardedHeaders选项。无论如何,我设法用一些简单的代码块解决了这个问题,请参阅我自己发布的答案。
app.useisintegration()
应该在RC1中为您完成这项工作。好的,我感谢您的提示。下次我有机会改进时,我将尝试使用它。
app.useisintegration()
应该可以在RC1中为您做到这一点。好的,我感谢您的提示。下次我有机会提高时,我会尝试一下。