User.Identity.IsAuthenticated иногда возвращает false

Я использую asp.net 4.0 и аутентификацию формы. Чтобы проверить, аутентифицирован ли пользователь, я использую User.Identity.IsAuthenticated. В большинстве случаев он работает идеально, но я не знаю, как это сделать, иногда он возвращает false, даже если у пользователя есть авторизация. Мой web.config:

<authentication mode="Forms">
    <forms name=".xyz" loginUrl="~/" timeout="120" protection="All" path="/" slidingexpiration=true/>
</authentication>

В global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    if (authCookie == null)
    {
        return;
    }
    FormsAuthenticationTicket authTicket = null;
    try
    {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    }
    catch
    {
        return;
    }
    if (authTicket == null)
    {
        return;
    }
    string[] roles = authTicket.UserData.Split(new char[] { '|' });
    FormsIdentity id = new FormsIdentity(authTicket);
    GenericPrincipal principal = new GenericPrincipal(id, roles);

    Context.User = principal;
}

и на странице входа:

FormsAuthenticationTicket authTick = new FormsAuthenticationTicket(1, email.Text, DateTime.Now, DateTime.Now.AddDays(360), true, password.Text, FormsAuthentication.FormsCookiePath);
string encriptTicket = FormsAuthentication.Encrypt(authTick);

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encriptTicket);
authCookie.Expires = DateTime.Now.AddDays(360);
Response.Cookies.Add(authCookie);

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


person genesistr    schedule 10.08.2011    source источник
comment
Вы пробовали Context.Request.IsAuthenticated?   -  person VJAI    schedule 10.08.2011
comment
нет. он надежнее?   -  person genesistr    schedule 10.08.2011


Ответы (1)


я нашел проблему. Проблема заключалась в разнице между www.address.com и address.com. www-версия притворяется поддоменом и создает новый сеанс и авторизацию. Если сервер перенаправляет на адрес www, когда пользователь зашел без префикса www, происходит ошибка. Я попробую переписать URL, чтобы решить эту проблему.

person genesistr    schedule 11.08.2011
comment
Для меня это было преобразование Web.config, о котором я забыл. - person David d C e Freitas; 19.03.2014
comment
@DaviddCeFreitas, не могли бы вы предоставить более подробную информацию о своем решении? - person ebram khalil; 27.11.2014
comment
@ebramtharwat, у меня был один из тех файлов преобразования web.config.debug для производства/разработки, которые меняли значения после сборки. Попробуйте развернуть файл web.config в браузере Visual Studio или проверьте в папке проекта наличие других файлов web.config.*, которые могут преобразовывать или изменять ваши значения при сборке. - person David d C e Freitas; 28.11.2014