Приложение перестает создавать файлы cookie для входа

Я некоторое время искал ответ на этот вопрос, но проблема кажется довольно сложной, и я изо всех сил пытаюсь найти ответ.

Я начинающий разработчик программного обеспечения, работаю в начинающей компании и только что закончил первую версию системы для использования несколькими пользователями. Локальное тестирование программного обеспечения не вызвало проблем, но после публикации программного обеспечения на сервере Windows 2012 на iis я обнаружил серьезную проблему с системой входа в систему.

Когда программа загружается изначально, несколько пользователей могут войти в систему и использовать программу без проблем, однако (по-видимому) случайным образом система входа полностью перестает работать на всех компьютерах, которые в данный момент вышли из системы. Те, кто вошел в систему, могут выйти из системы и снова войти в нее со своей учетной записью или любой другой, но те, кто вышел из системы в этот момент, полностью теряют доступ к системе.

При использовании инструментов разработчика в Chrome оказывается, что все эти компьютеры полностью перестают создавать файлы cookie, созданные при входе в систему, и просто перенаправляют обратно на экран входа в систему.

Системы по-прежнему распознают неправильные входы в систему, и это происходит с разными компьютерами каждый раз, когда я загружаю программу.

Я понимаю, что это очень расплывчатый вопрос, но я рву на себе волосы!

Как я уже сказал, я новичок и совершенно не знаком с хостингом на бизнес-серверах, и у меня нет большого опыта работы с системами идентификации или входа в систему в целом, поэтому любая помощь очень ценится.

В основном я хочу знать, скорее всего, проблема в iis, если да, то где в iis мне искать? Или настройки безопасности серверов?

Есть ли эффективная причина для отладки этого во время работы на сервере?

Если проблема звучит как проблема с кодированием, когда файлы идентификации были отредактированы, дайте мне знать, какой это может быть класс, и я опубликую код.

Спасибо!

Редактировать:

Global.asax.cs

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //Creates roles and adds an admin on first start
        RoleCreator rc = new RoleCreator();
        rc.CreateRoles();
        rc.AddAdmin();
    }
}

Startup.Auth.cs

public partial class Startup {

    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(UnitContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            CookieName="TrackerCookie",
            LoginPath = new PathString("/Login/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });
        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

        // Enables the application to remember the second login verification factor such as phone or email.
        // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
        // This is similar to the RememberMe option when you log in.
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
    }

person Verno    schedule 30.07.2015    source источник
comment
Используете ли вы проверку подлинности с помощью форм? если да, то есть ли какой-либо код в global.asax, который создает файл cookie и записывает его в ответ?   -  person Nilesh    schedule 30.07.2015
comment
Спасибо за ответ, да, я использую аутентификацию с помощью форм, единственный код в global.asax, отличный от кода по умолчанию, — это создание роли администратора по умолчанию и регистрация пользовательского API. ничего о создании файла cookie и написании ответа... Метод, создающий файл cookie, содержится в Stratup.auth.cs.   -  person Verno    schedule 30.07.2015
comment
Пробовали ли вы отлаживать и проверять, что происходит, когда пользователь возвращается в приложение? Что это за startup.auth.cs? Вы используете Owin Startup?   -  person Nilesh    schedule 30.07.2015
comment
Да, его собственный запуск, система входа в систему - это просто пользовательская версия системы идентификации asp, которая является частью нового приложения веб-форм. На самом деле эту часть системы настраивал другой разработчик, поэтому я изо всех сил пытаюсь понять это!   -  person Verno    schedule 30.07.2015
comment
Насколько я понимаю, запуск Owin вызывается только при первом доступе к приложению. Я считаю, что вам нужно переместить код файла cookie аутентификации из автозагрузки и, возможно, добавить его в запрос Global.asax Application_AuthenticateRequest. Было бы хорошо, если бы вы могли вставить файл запуска, который создает файл cookie.   -  person Nilesh    schedule 30.07.2015
comment
Привет, Нилеш, спасибо, это имеет смысл, я разместил код из Global.asax и запуска, чтобы вы могли взглянуть   -  person Verno    schedule 30.07.2015
comment
Хорошо, мой плохой. это стандартный код, используемый для аутентификации с помощью OWIN. Можете ли вы проверить запрос с помощью fiddler и посмотреть, был ли файл cookie записан клиенту или нет?   -  person Nilesh    schedule 31.07.2015
comment
Эй, Нилеш, я нашел это сегодня утром - ссылка. Я сейчас только тестирую. Если мне не повезет с предложениями, я проверю запрос у скрипача. Спасибо!   -  person Verno    schedule 31.07.2015
comment
Круто дай знать как дела.   -  person Nilesh    schedule 31.07.2015
comment
Снова привет, Нилеш. Моя проблема решена, оказывается, это проблема с уничтожением файлов cookie ASP, которая так и не была решена. Проблема называется ошибкой katana № 197. Существует пакет Nugent под названием «kentor.OwinCookieSaver», который является обходным путем и требует только одной строки кода перед настройкой файла cookie для входа для устранения проблемы. Я обновлю свой вопрос с решением. Большое спасибо за помощь! Ценить это!!!   -  person Verno    schedule 31.07.2015


Ответы (1)


Теперь проблема решена.

Для тех, у кого такая же проблема, проблема вызвана ошибкой под названием «ошибка катаны № 197».

Самое простое решение — загрузить пакет NuGet kentor.OwinCookieSaver. и добавьте app.UseKentorOwinCookieSaver(); над конфигурацией файла cookie вашего приложения при запуске.

https://github.com/KentorIT/owin-cookie-saver

 // kentor.OwinCookieSaver for 'katana bug #197' (login cookies being destroyed on logout!)
            app.UseKentorOwinCookieSaver();
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                CookieName="LoginCookie",
                LoginPath = new PathString("/Login/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

Microsoft знает об этой проблеме, и она будет решена в 2015 году.

person Verno    schedule 31.07.2015
comment
Вместо того, чтобы обновлять вопрос, вы должны были опубликовать здесь свой собственный ответ вместо этого комментария. Теперь я переместил ваш ответ сюда и отменил редактирование вашего вопроса. - person Mark Rotteveel; 31.07.2015