Используйте пользовательский объект IPrincipal
с вашим собственным управлением файлами cookie.
Я бы предложил сериализовать пользовательский объект IPrinicipal в JSON и установить для вашего cookie.UserData сериализованную строку.Это было легко десериализовать, когда cookie возвращается.
РЕДАКТИРОВАТЬ: Пример настраиваемого объекта IPrincipal и управления cookie аутентификации
Объект IPrincipal
(обратите внимание, я использую Json.NET для сериализации)
public class SimplePrincipal : IPrincipal
{
private IIdentity _identity;
[JsonIgnore]
public IIdentity Identity
{
get { return _identity ?? (_identity = new GenericIdentity(Name)); }
}
public string Name { get; set; }
public int WebUserId { get; set; }
public string Email { get; set; }
public long FacebookUserId { get; set; }
public IEnumerable<string> Roles { get; set; }
public bool IsInRole(string role)
{
return Roles.Contains(role);
}
/// <summary>
/// Get's a JSON serialized string of a SimplePrincipal object
/// </summary>
public static string GetCookieUserData(SimplePrincipal principal)
{
return JsonConvert.SerializeObject(principal);
}
/// <summary>
/// Creates a SimplePrincipal object using a JSON string from the asp.net auth cookie
/// </summary>
public static SimplePrincipal CreatePrincipalFromCookieData(string userData)
{
return JsonConvert.DeserializeObject<SimplePrincipal>(userData);
}
}
Способ входа
private void LoginUser(SimplePrincipal principal, bool isPersistent)
{
var userData = SimplePrincipal.GetCookieUserData(principal);
var authCookie = FormsAuthService.GetAuthCookie(principal.Name, userData, isPersistent);
Response.Cookies.Add(authCookie);
}
Модуль аутентификации
public class AuthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += Application_AuthenticateRequest;
}
private void Application_AuthenticateRequest(Object source, EventArgs e)
{
var application = (HttpApplication)source;
var context = application.Context;
// Get the authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = context.Request.Cookies[cookieName];
if (authCookie == null)
return;
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
context.User = SimplePrincipal.CreatePrincipalFromCookieData(authTicket.UserData);
}
public void Dispose()
{
//Don't do anything
}
}
После того, как все это правильно подключено, вы можете просто получить объект что-то вроде:
var principal = HttpContext.Current.User as SimplePrincipal