FormsAuthentication.SetAuthCookie не работает в IE9 или Chrome - PullRequest
7 голосов
/ 07 августа 2011

Извините, если это было покрыто, но я собираюсь вырвать мои волосы. Мой сайт использует проверку подлинности с помощью форм и отлично работает, когда я тестирую на // localhost, но когда я публикую в Интернете, он не работает в IE9. Я выполнил все шаги, описанные в руководствах, но при использовании IE9 или Chrome FormsAuthentication.SetAuthCookie никогда не создает cookie. Кикер, когда я использую Firefox, это работает. Ниже приведен код из моего web.config и мой код в C #.

По сути, я собираю имя пользователя и пароль от пользователя и аутентифицируюсь на моем SQL Server с сохраненным процессом. Затем верните временный веб-ключ, который сайт использует для взаимодействия с профилем пользователя. Веб-ключ хранится в файле cookie FormsAuthentication в качестве идентификатора, который я могу получить для подтверждения пользователя, вошедшего в систему.

Кроме того, я знаю, что файл cookie аутентификации никогда не создается, потому что у меня есть элемент управления asp: loginstatus на странице, который никогда не меняется.

web.config:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" 
         protection="All"
         path="/" 
         slidingExpiration="true" 
         timeout="60"  
         cookieless="AutoDetect" />
 </authentication>
 <authorization>
  <deny users="?"/>
  <allow users= "*"/>
 </authorization>

в коде позади:

void LogUserIn(string UserEmail, string Pwd)
{
    conn = new SqlConnection(connstr);
    sql = new SqlCommand("exec usp_AuthLogin @Email, @Pwd", conn);
    sql.Parameters.AddWithValue("@Email", UserEmail);
    sql.Parameters.AddWithValue("@Pwd", Pwd);
    try
    {
        conn.Open();
        reader = sql.ExecuteReader();
        while (reader.Read())
        {
            Result = reader["Result"].ToString();  // value of webkey
        }
    }
    catch (Exception ex)
    {
    }
    finally
    {
        conn.Close();
    }
    // if successful log in and create cookie
    if (Result != "Denied")
    {
        FormsAuthentication.SetAuthCookie(Result, true);  // set cookie with webkey from sql server
        LoggedIn = true;
    }
    else
    {
        LoggedIn = false;
    }
}

Пожалуйста, помогите

1 Ответ

9 голосов
/ 07 августа 2011

Я почти уверен, что вам нужно использовать имя пользователя в качестве первого параметра в SetAuthCookie - это то, как модуль FormsAuthentication знает, кто пользователь.

SetAuthCookie создает авторизационный тикет под капотом. Вы пытались сделать свой собственный билет авторизации? Это позволит вам хранить дополнительные данные.

Это объясняется здесь: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx#Y1368

в основном вы делаете это:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
    username,
    DateTime.Now,
    DateTime.Now.AddMinutes(30),
    isPersistent, //true or false
    webkey, //Custom data like your webkey can go here
    FormsAuthentication.FormsCookiePath);

// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);

// Create the cookie.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

Это объясняет, как вы читаете данные обратно http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.userdata.aspx

FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;

string webkey = ticket.UserData;

Редактировать: Кроме того, cookie-файл аутентификации по умолчанию является httponly. Вы можете использовать плагин Firefox, например, живые заголовки, чтобы убедиться, что он создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...