我正在复制Social Sample但尝试使用其中未显示的其他OAuth提供程序,因此我有一些代码如下:
app.UseOAuthAuthentication("test", options =>
{
options.ClientId = "xxx";
options.ClientSecret = "xxx";
options.AuthorizationEndpoint = "xxx";
options.TokenEndpoint = "xxx";
options.CallbackPath = new PathString("/signin-test");
});
我的应用程序在反向代理后运行,终止SSL。当我需要http://myapp.com/signin-test时,我的redirect_uri会变成https://myapp.com/signin-test。
所有应用程序都知道X-Forwarded-Proto HTTP标头是否设置为" http"或" https"但这似乎没有被发现。
有没有办法强制CallbackPath使用HTTPS,无论请求是否这样做?或者其他一些方法来实现这个目标?
我尝试将所有请求重定向到HTTPS,但这没有帮助:
app.Use(async (context, next) =>
{
if ("https".Equals(context.Request.Headers["x-forwarded-proto"]))
{
await next();
}
else
{
var withHttps = "https://" + context.Request.Host + context.Request.Path;
context.Response.Redirect(withHttps);
}
});
答案 0 :(得分:3)
建议的方法是在调用管道的其余部分(context.Request.Scheme
)之前手动更改https
以返回http
而不是await next()
:
app.Use(next => context => {
if (string.Equals(context.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.OrdinalIgnoreCase)) {
context.Request.Scheme = "https";
}
return next(context);
});
仅供参考,ASP.NET团队目前正在开发一种可自动执行此任务的中间件:https://github.com/aspnet/BasicMiddleware/pull/1/files