Пользовательский OWIN CookieAuthenticationProvider терпит неудачу при первом/холодном загрузке

У нас есть пользовательский поставщик cookie cookie, который ставит для файла cookie auth имя хоста, такого как .domain.com вместо domain.com или my.domain.com. Мы делаем это, чтобы файлы cookie работали во всех субдоменах и доменах. Это так просто, как показано ниже.

Вопрос

При первой же попытке после холодного запуска приложения cookie STILL несет домен my.domain.com (наши логины находятся на my.domain.com) DESPITE, устанавливая его на .domain.com после выполнения кода SubdomainCookieAuthentication ниже (проверяется с помощью контрольных точек). При последующих попытках входа в систему имя хоста cookie прекрасное.

Вопрос

Как я могу исправить это, чтобы он работал даже с первой попытки?

код

Пользовательский файл cookie

public class SubdomainCookieAuthentication : CookieAuthenticationProvider
{
    public override void ResponseSignIn(CookieResponseSignInContext context)
    {
        // We need to add a "." in front of the domain name to 
        // allow the cookie to be used on all sub-domains too
        var hostname = context.Request.Uri.Host;
        // works for www.google.com => google.com
        // will FAIL for www.google.co.uk (gives co.uk) but doesn't apply to us
        var dotTrimmedHostname = Regex.Replace(hostname, @"^.*(\.\S+\.\S+)", "$1");
        context.Options.CookieDomain = dotTrimmedHostname;            
        base.ResponseSignIn(context);
    }
}

Это инициализируется внутри класса запуска Owin следующим образом

Класс: Startup

Файл: App_start\Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new SubdomainCookieAuthentication()
    });
}

Ответ 1

У меня была та же проблема, что и в домене Cookie, который не был установлен в первой попытке с использованием метода ResponseSignIn. Я смог решить эту проблему, обновив библиотеки Owin до 3.x и используя новый CookieManager для установки домена. Нашел это решение из этого сообщения:

Как Owin может установить cookie аутентификации аутентификации Asp.Net после этапа Application_EndRequest?

public class ChunkingCookieManagerWithSubdomains : ICookieManager
{
    private readonly ChunkingCookieManager _chunkingCookieManager;

    public ChunkingCookieManagerWithSubdomains()
    {
        _chunkingCookieManager = new ChunkingCookieManager();
    }

    public string GetRequestCookie(IOwinContext context, string key)
    {
        return _chunkingCookieManager.GetRequestCookie(context, key);
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        options.Domain = context.Request.Uri.GetHostWithoutSubDomain();
        _chunkingCookieManager.AppendResponseCookie(context, key, value, options);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        options.Domain = context.Request.Uri.GetHostWithoutSubDomain();
        _chunkingCookieManager.DeleteCookie(context, key, options);
    }
}

public static class UriExtensions
{
    public static string GetHostWithoutSubDomain(this Uri url)
    {
        if (url.HostNameType == UriHostNameType.Dns)
        {
            string host = url.Host;
            if (host.Split('.').Length > 2)
            {
                int lastIndex = host.LastIndexOf(".");
                int index = host.LastIndexOf(".", lastIndex - 1);
                return host.Substring(index + 1);
            }
            else
            {
                return host;
            }
        }

        return null;
    }
}

Затем зарегистрируйте его в Startup.Auth.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        ...
        CookieManager = new ChunkingCookieManagerWithSubdomains(), 
        ...
    }
);