CurrentPrincipal.Identity.IsAuthenticated имеет значение true даже после выхода из системы, когда cookie-домен FormsAuth устанавливается вручную

Ссылаясь на совместное использование cookie в поддоменах, я реализовал ответ jro, и это сработало для входа в систему (совместное использование cookie в разных поддоменах).

Однако с этим изменением произошел процесс выхода. Пожалуйста, ознакомьтесь с кодом SignOut и SignIn, которым я поделился ниже.

Проблема в том, что в процессе выхода он выполняет FormsAuthentication.SignOut, а затем перенаправляет на контроллер входа, но "System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated" устанавливается в true, даже если FormsAuthentication.SignOut вызывается в процессе выхода.

Код, который устанавливает cookie для проверки подлинности с помощью форм

 public static HttpCookie GetAuthenticationCookie(CookieData cookieData)
        {
            string userData = PrepareCookieContentFromCookieData(cookieData); //Get a string with User data

            AuthenticationSection section = WebConfigurationManager.GetWebApplicationSection("system.web/authentication") as AuthenticationSection;

            TimeSpan ts = section.Forms.Timeout;
            int timeout = (ts.Minutes != 0) ? timeout = ts.Minutes : 1;

            bool isPersistent = Convert.ToBoolean(HttpContext.Current.Request.Form["isPersistent"] ?? "False");

            if (isPersistent) timeout = 30 * 24 * 60;

            //ticket object is formed based on the above details set. Evry page afer login will use this ticket to get base user data
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, cookieData.userName, DateTime.Now,
                DateTime.Now.AddMinutes(timeout), isPersistent, userData, FormsAuthentication.FormsCookiePath);

            // to encrypt the ticket 
            string encryptedCookieString = FormsAuthentication.Encrypt(ticket);

            // setting the ticket to the cookie.
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookieString);
            cookie.HttpOnly = true;
            cookie.Domain = "parent.com";
            if (isPersistent)
                cookie.Expires = DateTime.Now.AddYears(1);

            return cookie;
        }

Выход

 public ActionResult SignOut()
        {                        

                if (HttpContext != null && HttpContext.Session != null)
                {                      
                    HttpContext.Session.Abandon();
                }    

                FormsAuthentication.SignOut();

            } 
            return RedirectToAction("SignIn", "User");    
        }

Войти в систему

 public ActionResult SignIn(string CompanyCode)
        {           
           //Check if logged in
            if (System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated)
            {
                //return to a specific page
            }
        }

Ценю любую помощь по этому вопросу.

2 ответа

Решение

Решил вопрос. Если вы устанавливаете доменное имя вручную, вы должны установить доменное имя из настроек аутентификации форм webconfig. В противном случае он попытается удалить файлы cookie из домена по умолчанию (в моем случае subapp1.parent.com), где таких файлов cookie нет, поскольку я вручную переопределил домен cookie.

Мои настройки проверки подлинности форм были следующими

<forms cookieless="UseCookies" defaultUrl="~/Applications" loginUrl="~/user/signin"  name="FormAuthentication" path="/"/>

Потом я добавил domain=".parent.com" как домен и он начал работать.

Вот как я диагностировал проблему,

Я попробовал следующий код, чтобы вручную удалить любые куки во время выхода,

 var cookie = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (cookie != null)
            {
                Logger.Log.InfoFormat("Cookies found. Domain:{0} Name:{1}", cookie.Domain, cookie.Name);

                cookie.Expires = DateTime.Now.AddYears(-1);
                Response.Cookies.Add(cookie);
            }

Тем не менее проблема была там. Но я вошел (log4net) cookie. Домен, чтобы получить подробную информацию, когда это произойдет. Удивительно, но домен был пуст, где я ожидал "parent.com". Затем я проверил настройки проверки подлинности с помощью форм и выяснил, что имя домена там не задано

Надеюсь, это поможет сэкономить несколько часов для кого-то!

Вы должны установить CurrentPrincipal и пользователя в null в вашем методе SignOut

public class LogOffController : Controller
{
    public ActionResult Index()
    {
        FormsAuthentication.SignOut();

        HttpContext.User = null;
        Thread.CurrentPrincipal = null;

        return View();
    }
}

Надеюсь, это поможет.

Другие вопросы по тегам