//----------------------------------------------------------------------- // // Copyright (c) Microsoft. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOpenAuth.AspNet { using System; using System.Diagnostics; using System.Web; using System.Web.Security; /// /// Helper methods for setting and retrieving a custom forms authentication ticket for delegation protocols. /// internal static class OpenAuthAuthenticationTicketHelper { #region Constants and Fields /// /// The open auth cookie token. /// private const string OpenAuthCookieToken = "OpenAuth"; #endregion #region Public Methods and Operators /// /// The is valid authentication ticket. /// /// /// The context. /// /// /// The is valid authentication ticket. /// public static bool IsValidAuthenticationTicket(HttpContextBase context) { HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName]; if (cookie == null) { return false; } string encryptedCookieData = cookie.Value; if (string.IsNullOrEmpty(encryptedCookieData)) { return false; } try { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(encryptedCookieData); return authTicket != null && !authTicket.Expired && authTicket.UserData == OpenAuthCookieToken; } catch (ArgumentException) { return false; } } /// /// The set authentication ticket. /// /// /// The context. /// /// /// The user name. /// /// /// The create persistent cookie. /// /// /// public static void SetAuthenticationTicket(HttpContextBase context, string userName, bool createPersistentCookie) { if (!context.Request.IsSecureConnection && FormsAuthentication.RequireSSL) { throw new HttpException(WebResources.ConnectionNotSecure); } HttpCookie cookie = GetAuthCookie(userName, createPersistentCookie); context.Response.Cookies.Add(cookie); } #endregion #region Methods /// /// The get auth cookie. /// /// /// The user name. /// /// /// The create persistent cookie. /// /// /// /// /// private static HttpCookie GetAuthCookie(string userName, bool createPersistentCookie) { Debug.Assert(!string.IsNullOrEmpty(userName)); var ticket = new FormsAuthenticationTicket( /* version */ 2, userName, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), createPersistentCookie, OpenAuthCookieToken, FormsAuthentication.FormsCookiePath); string encryptedTicket = FormsAuthentication.Encrypt(ticket); if (encryptedTicket == null || encryptedTicket.Length < 1) { throw new HttpException(WebResources.FailedToEncryptTicket); } var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { HttpOnly = true, Path = FormsAuthentication.FormsCookiePath, Secure = FormsAuthentication.RequireSSL }; if (FormsAuthentication.CookieDomain != null) { cookie.Domain = FormsAuthentication.CookieDomain; } if (ticket.IsPersistent) { cookie.Expires = ticket.Expiration; } return cookie; } #endregion } }