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();
}
}
Надеюсь, это поможет.