2015-06-19 2 views
0

ссылаюсь на sharing cookie in subdomains я реализовал ответ JRO и он работал на входе в систему. (Совместное использование куки в различных поддоменов)CurrentPrincipal.Identity.IsAuthenticated верно даже после SignOut когда FormsAuth домен куки установлен вручную

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

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

код, который устанавливает формы Authentication 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 
      } 
     } 

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

+0

Когда я удаляю домен cookie (установлен в ""), вывод работает нормально. Поэтому проблема заключается в настройке домена вручную. Есть ли еще что-то еще? – Dhanuka777

ответ

0

Решил проблему. Если вы установили имя домена вручную, вы должны установить имя домена из параметров проверки подлинности форм 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». Затем я проверил параметры проверки подлинности форм и выяснил, что доменное имя не было установлено.

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

0

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

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

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

     return View(); 
    } 
} 

Надежда эта помощь.

+0

Пробовал это, все еще System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated - это правда. – Dhanuka777

Смежные вопросы