//----------------------------------------------------------------------- // // Copyright (c) Microsoft. All rights reserved. // //----------------------------------------------------------------------- namespace DotNetOpenAuth.AspNet { using System; using System.Diagnostics; using System.Web; using System.Web.Security; using Validation; /// /// 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 = "OAuth"; #endregion #region Public Methods and Operators /// /// Checks whether the specified HTTP request comes from an authenticated user. /// /// /// The context. /// /// True if the reuest is authenticated; false otherwise. 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; } } /// /// Adds an authentication cookie to the user agent in the next HTTP response. /// /// /// The context. /// /// /// The user name. /// /// /// A value indicating whether the cookie should persist across sessions. /// 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 /// /// Creates an HTTP authentication cookie. /// /// /// The user name. /// /// /// A value indicating whether the cookie should last across sessions. /// /// An authentication cookie. private static HttpCookie GetAuthCookie(string userName, bool createPersistentCookie) { Requires.NotNullOrEmpty(userName, "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 }; // only set Secure if FormsAuthentication requires SSL. // otherwise, leave it to default value if (FormsAuthentication.RequireSSL) { cookie.Secure = true; } if (FormsAuthentication.CookieDomain != null) { cookie.Domain = FormsAuthentication.CookieDomain; } if (ticket.IsPersistent) { cookie.Expires = ticket.Expiration; } return cookie; } #endregion } }