asp.net 核心重定向到 https
asp.net core redirect to https
我们有一个多租户 asp.net 核心 2 应用程序。
我们需要将请求重定向到他们的 https 到非安全 url。我们必须通过代码而不是使用 web.config 或 IIS 来做到这一点,因为有些域有 https 而有些没有。我们通过检查基于发出请求的主机的数据库来检查哪个域需要此重定向。
是否可以在中间件中执行此操作?
提前致谢。
我找到了一种方法来满足我们的需求,我想分享一下,以防其他人遇到同样的问题。
我们已经解决了 URL 使用 Microsoft.AspNetCore.Rewrite 库重写规则。
在startup.cs中我们添加如下代码
app.UseRewriter(new RewriteOptions().Add(new RedirectToSecureRule()));
然后我们添加 class RedirectToSecureRule
public class RedirectToSecureRule : IRule
{
public virtual void ApplyRule(RewriteContext context)
{
var currentRequest = context.HttpContext.Request;
if (currentRequest.IsHttps)
{
context.Result = RuleResult.ContinueRules;
return;
}
if (currentRequest.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
context.Result = RuleResult.ContinueRules;
return;
}
if (context.HttpContext.Items["TenantSsl"] == null || !Convert.ToBoolean(context.HttpContext.Items["TenantSsl"]))
{
context.Result = RuleResult.ContinueRules;
return;
}
var httpsUrl = UriHelper.BuildAbsolute("https", new HostString(currentRequest.Host.Value), currentRequest.PathBase, currentRequest.Path, currentRequest.QueryString);
var response = context.HttpContext.Response;
response.StatusCode = 301;
response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Location] = httpsUrl;
context.Result = RuleResult.EndResponse;
}
}
如您所见,如果请求已经是 https,我们什么都不做。对于 localhost 也是如此,尽管这个条件不是必需的,因为我们也可以在 localhost 中使用 https。
然后我们检查 HttpContext.Items["TenantSsl"] 是否为真。这是因为我们的应用程序是一个多租户应用程序,我们在其中共享代码和 IIS 池,但每个租户都有自己的数据库。
可能一个租户有 SSL 证书而其他租户没有,这就是我们必须在租户的数据库中添加一个字段来检查这一点的原因。
在执行此规则之前,我们执行租户选择器,我们向 HttpContext.Items 添加一个 bool 变量,指示当前租户是否具有 SSL 证书-
最后,如果租户有SSL证书且请求不是https,我们重定向到https页面。
感谢 Ray Huang,我们基于他的一篇帖子提出了这个解决方案:
https://blog.discountasp.net/3-ways-to-redirect-http-to-https-and-non-www-to-www-in-asp-net-core/
我们有一个多租户 asp.net 核心 2 应用程序。
我们需要将请求重定向到他们的 https 到非安全 url。我们必须通过代码而不是使用 web.config 或 IIS 来做到这一点,因为有些域有 https 而有些没有。我们通过检查基于发出请求的主机的数据库来检查哪个域需要此重定向。
是否可以在中间件中执行此操作?
提前致谢。
我找到了一种方法来满足我们的需求,我想分享一下,以防其他人遇到同样的问题。
我们已经解决了 URL 使用 Microsoft.AspNetCore.Rewrite 库重写规则。
在startup.cs中我们添加如下代码
app.UseRewriter(new RewriteOptions().Add(new RedirectToSecureRule()));
然后我们添加 class RedirectToSecureRule
public class RedirectToSecureRule : IRule
{
public virtual void ApplyRule(RewriteContext context)
{
var currentRequest = context.HttpContext.Request;
if (currentRequest.IsHttps)
{
context.Result = RuleResult.ContinueRules;
return;
}
if (currentRequest.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
context.Result = RuleResult.ContinueRules;
return;
}
if (context.HttpContext.Items["TenantSsl"] == null || !Convert.ToBoolean(context.HttpContext.Items["TenantSsl"]))
{
context.Result = RuleResult.ContinueRules;
return;
}
var httpsUrl = UriHelper.BuildAbsolute("https", new HostString(currentRequest.Host.Value), currentRequest.PathBase, currentRequest.Path, currentRequest.QueryString);
var response = context.HttpContext.Response;
response.StatusCode = 301;
response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Location] = httpsUrl;
context.Result = RuleResult.EndResponse;
}
}
如您所见,如果请求已经是 https,我们什么都不做。对于 localhost 也是如此,尽管这个条件不是必需的,因为我们也可以在 localhost 中使用 https。
然后我们检查 HttpContext.Items["TenantSsl"] 是否为真。这是因为我们的应用程序是一个多租户应用程序,我们在其中共享代码和 IIS 池,但每个租户都有自己的数据库。
可能一个租户有 SSL 证书而其他租户没有,这就是我们必须在租户的数据库中添加一个字段来检查这一点的原因。
在执行此规则之前,我们执行租户选择器,我们向 HttpContext.Items 添加一个 bool 变量,指示当前租户是否具有 SSL 证书-
最后,如果租户有SSL证书且请求不是https,我们重定向到https页面。
感谢 Ray Huang,我们基于他的一篇帖子提出了这个解决方案: https://blog.discountasp.net/3-ways-to-redirect-http-to-https-and-non-www-to-www-in-asp-net-core/