2015-01-08 1 views
-1

Я создал проект Web Forms Application только для проверки этого случая. Я использую шаблон веб-сайта по умолчанию .NET4 без каких-либо изменений и 3 кнопки и 1 ярлык на странице Default.aspx.Как правильно установить и получить зашифрованный файл FormsAuthentication cookie

Кнопки:btnLogin, btnSetCookie, btnGetCookie

Label:lblCookieInfo

Flow:

  1. Нажмите Войти
  2. Нажмите Set Cookie Кнопка
  3. Нажмите кнопку Get Cookie

Теперь, когда я нажимаю на третью кнопку, чтобы получить печенье, всегда выдает мне ошибку, когда достигает Decrypt метода (Invalid value for 'encryptedTicket' parameter). Когда я пытаюсь восстановить файл cookie в httpCookie, это пустое значение без какой-либо ценности. Что я делаю неправильно?

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
    FormsAuthentication.SetAuthCookie("myUserName", createPersistentCookie: true); 
    Response.Redirect("~/"); 
} 

protected void btnSetCookie_Click(object sender, EventArgs e) 
{ 
    var ticket = new FormsAuthenticationTicket(1, 
     "myUserName", 
     DateTime.Now, 
     DateTime.Now.AddMinutes(10), 
     true, 
     "data value of cookie", 
     FormsAuthentication.FormsCookiePath); 

    string encTicket = FormsAuthentication.Encrypt(ticket); 

    var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) 
    { 
     Expires = ticket.Expiration, 
     HttpOnly = true 
    }; 
    btnGetCookie.Enabled = true; 

    Response.Cookies.Add(authCookie); 
} 

protected void btnGetCookie_Click(object sender, EventArgs e) 
{ 
    var httpCookie = Response.Cookies[FormsAuthentication.FormsCookieName]; 
    lblCookieInfo.Visible = true; 
    if (httpCookie == null) 
    { 
     lblCookieInfo.Text = "Cookie is Null"; 
     return; 
    } 

    //Here throws error! 
    var decryptedCookie = FormsAuthentication.Decrypt(httpCookie.Value); 
    if (decryptedCookie == null) 
    { 
     lblCookieInfo.Text = "Cookie can't be decrypted."; 
     return; 
    } 

    lblCookieInfo.Text = string.Format("Name: {0}, Is Expired: {1}, Is Persistent: {2}, Expiration: {3}, Path: {4}, User data: {5}", 
     decryptedCookie.Name, decryptedCookie.Expired, 
     decryptedCookie.IsPersistent, decryptedCookie.Expiration, 
     decryptedCookie.CookiePath, decryptedCookie.UserData); 
} 
+0

Вы смогли определить, почему это порождает исключение? У меня есть аналогичная проблема, сейчас у меня проблемы с изоляцией. Я заметил, что этот код не проверяет значение пустой cookie, как указано здесь: http://stackoverflow.com/questions/18895746/invalid-value-for-encryptedticket-parameter/24837242#24837242, который может помочь, но я все еще любопытно, почему это было бы пусто? –

+0

@mklinker, я не могу вспомнить прямо сейчас, но я помню, что проблема была смехотворно простой. Вероятно, это то, что вы говорите. – CodeArtist

+0

@mklinker, пожалуйста, взгляните на мой ответ ниже, это может помочь вам ... – CodeArtist

ответ

1

Я действительно не помню, как я его решаю, но создал следующий класс. Я думаю, что проблема была параметром в функции FormsAuthenticationTicket(...).

public static class EncryptedCookie 
{ 
    public static HttpCookie SetEncryptedCookie(string name, DateTime expiration, bool httpOnly, string userData, string cookiePath) 
    { 
     var ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, expiration, false, userData, cookiePath); 
     string encTicket = FormsAuthentication.Encrypt(ticket); 

     var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) 
     { 
      Expires = ticket.Expiration, 
      HttpOnly = httpOnly 
     }; 
     return authCookie; 
    } 

    public static FormsAuthenticationTicket GetEncryptedCookie(HttpCookie cookie) 
    { 
     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) return null; 
     FormsAuthenticationTicket decryptedCookie; 
     try 
     { 
      decryptedCookie = FormsAuthentication.Decrypt(cookie.Value); 
      if (decryptedCookie == null || string.IsNullOrEmpty(decryptedCookie.Name) || decryptedCookie.Expired) return null; 
     } 
     catch 
     { 
      return null; 
     } 
     return decryptedCookie; 
    } 

    public static void RemoveCookie(string cookieName) 
    { 
     HttpContext.Current.Request.Cookies.Remove(cookieName); 
    } 
}