FormsAuthentication.SetAuthCookie无法在IE9或Chrome中运行

时间:2011-08-07 02:42:34

标签: c# asp.net forms-authentication

对不起,如果这已被覆盖,但我要拔掉头发。 我的网站正在使用表单身份验证,并且当我在// localhost上进行测试时工作正常,但是当我发布到Web时,它在IE9中不起作用。我已经按照教程中概述的所有步骤进行了操作,但是当使用IE9或Chrome FormsAuthentication.SetAuthCookie时,从不创建cookie。踢球者是我使用Firefox时的工作原理。下面是我的web.config中的代码和我在C#中的代码。

基本上,我从用户那里收集用户名和密码,并使用存储过程对我的SQL Server进行身份验证。然后返回一个临时Web密钥,该网站用于与用户的配置文件进行交互。 Web密钥作为标识存储在FormsAuthentication cookie中,我可以检索该标识以对正在登录的用户进行保护。

另外,我知道永远不会创建身份验证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 个答案:

答案 0 :(得分:9)

我很确定你需要使用用户名作为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;

编辑:此外,默认情况下,auth cookie为httponly。您可以使用firefox插件(如实时标头)来验证它是否已创建。