перенаправление ядра asp.net на https - PullRequest
0 голосов
/ 14 ноября 2018

У нас есть мультитенантное приложение asp.net core 2.

Нам нужно перенаправить на их https запросы на незащищенные URL.Мы должны сделать это с помощью кода, а не с помощью web.config или IIS, поскольку некоторые домены имеют https, а другие нет.Мы проверяем, какой домен нуждается в этом перенаправлении, проверяя базу данных на основе хоста, который делает запрос.

Возможно ли сделать это в промежуточном программном обеспечении?

Заранее спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Я нашел способ сделать то, что нам нужно, и я хотел бы поделиться, если у кого-то есть такая же проблема.

Мы решили это с помощью правил перезаписи 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...