Я нашел способ сделать то, что нам нужно, и я хотел бы поделиться, если у кого-то есть такая же проблема.
Мы решили это с помощью правил перезаписи URL, используя библиотеку Microsoft.AspNetCore.Rewrite.
В файле startup.cs добавляем следующий код
app.UseRewriter(new RewriteOptions().Add(new RedirectToSecureRule()));
Затем мы добавляем класс 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, хотя это условие не является обязательным, поскольку мы также можем работать с https в localhost.
Затем мы проверяем, является ли HttpContext.Items ["TenantSsl"] истинным. Это связано с тем, что наше приложение является мультитенантным приложением, в котором мы совместно используем коды и пул IIS, но у каждого арендатора есть своя собственная база данных.
Может случиться, что у одного арендатора есть сертификат SSL, а у других - нет, поэтому мы должны добавить поле в базу данных нашего арендатора, чтобы проверить это.
Перед выполнением этого правила мы запускаем селектор арендатора, где добавляем в HttpContext.Items переменную bool, указывающую, что текущий арендатор имеет сертификат SSL-
Наконец, если у арендатора есть сертификат SSL, а запрос не https, мы перенаправляем на страницу https.
Может, благодаря Рэю Хуангу, мы основали это решение на одном из его постов:
https://blog.discountasp.net/3-ways-to-redirect-http-to-https-and-non-www-to-www-in-asp-net-core/