authCookie在global.asax中不安全

时间:2010-08-06 23:48:21

标签: c# asp.net ssl cookies login

我有登录问题。

首先我在登录时使用SSL。

当我登录时,我正在创建一个像这样的cookie。当我检查它是否安全时答案是肯定的。

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,                          // version
                                                   UserName.Text,           // user name
                                                   DateTime.Now,               // creation
                                                   DateTime.Now.AddMinutes(60),// Expiration
                                                   false,                      // Persistent 
                                                   role);         // User data

                    // Now encrypt the ticket.
                    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

                    // Create a cookie and add the encrypted ticket to the
                    // cookie as data.
                    HttpCookie authCookie =
                                 new HttpCookie(FormsAuthentication.FormsCookieName,
                                                encryptedTicket);

                    if (authCookie.Secure)
                    {
                        new GUIUtility().LogMessageToFile("The cookie is secure with SSL.");
                        // Add other required code here.
                    }

                    authCookie.Secure = FormsAuthentication.RequireSSL;

                    // Add the cookie to the outgoing cookies collection.
                    HttpContext.Current.Response.Cookies.Add(authCookie);

                    // Redirect the user to the originally requested page 
                    Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text,false));

然后将其重定向到具有以下代码的global.asax页面:

string cookieName = FormsAuthentication.FormsCookieName.ToString();
        HttpCookie authCookie = Context.Request.Cookies[cookieName];

        try
        {
            new GUIUtility().LogMessageToFile(cookieName + authCookie.Secure);
        }
        catch (Exception)
        {
            //
        }

这里我得到cookieName为“.ASPXAUTH”,authCookie.Secure值为False。 为什么会发生这种情况我希望authCookie.Secure值在这里为真。

有什么建议吗?感谢

我的网络配置包含:

<authentication mode="Forms">
        <forms loginUrl="Login.aspx" defaultUrl="~/Default.aspx" slidingExpiration="true" timeout="120" path="/" requireSSL="true" protection="All">
        </forms>
    </authentication>
<httpCookies requireSSL="true"/>
    <authorization>
        <deny users="?"/>
        <!--<allow users="*"/>-->
    </authorization>

2 个答案:

答案 0 :(得分:1)

您是否在登录时重定向到非SSL资源?如果是这种情况,则不应使用您在第一段代码中创建的cookie,因为它是一个安全的cookie,因此仅适用于SSL连接(即您明确表示不应将其发送到非SSL)请求,这就是.Secure所做的事情,因此会创建一个新的cookie。我希望它也不包括票价值。

在这种情况下,你会想要:

  1. 从登录点开始使用SSL。
  2. 忍受会话窃取的风险(还有其他方法可以减轻这种风险)。
  3. 使用Digest或NTLM之类的身份验证协议,允许质询 - 响应,并让您更快地使登录失效,而不会让用户受到攻击(因为浏览器会为您进行第二次登录)。

答案 1 :(得分:1)

限制身份验证Cookie到HTTPS连接

Cookie支持“安全”属性,用于确定浏览器是否应将cookie发送回服务器。使用安全属性集,浏览器仅将cookie发送到使用HTTPS URL请求的安全页面。

如果您使用的是.NET Framework 1.1版,请在元素上使用requireSSL =“true”设置secure属性,如下所示:

<forms loginUrl="Secure\Login.aspx"
   requireSSL="true" . . . />

如果您使用的是.NET Framework 1.0版,请使用以下代码在Global.asax的Application_EndRequest事件处理程序中手动设置secure属性:

protected void Application_EndRequest(Object sender, EventArgs e) 
 {
string authCookie = FormsAuthentication.FormsCookieName;

foreach (string sCookie in Response.Cookies) 
 {
if (sCookie.Equals(authCookie))
{ 
  // Set the cookie to be secure. Browsers will send the cookie
  // only to pages requested with https
  Response.Cookies[sCookie].Secure = true;
}

} }

所以根据我的说法,第一个选项不能在web配置中工作,所以我手动完成它 这是代码中的第二个选项..

请建议。