我正在编写一个ASP.NET MVC应用程序,我正在使用默认IPrincipal,IIDentity等的表单身份验证。
在我的身份验证票证中,我将用户名存储在name参数中。
但是,我遇到的情况是,在每次请求时,我的主布局不仅需要访问用户名,还需要访问用户的电子邮件和用户ID。
我需要电子邮件,因此我可以为用户加载一个重力图标,用户名,以便我可以在顶部栏中显示友好的显示名称,以及用户ID,以便我可以定义特定于该用户ID的某些链接(即/用户/编辑/ 2332)。
不仅存储用户名而且还存储用户ID和电子邮件的最简洁方法是什么?
自定义主体/标识对象?缓存?会议?其他一些方式?
答案 0 :(得分:6)
将自定义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
答案 1 :(得分:0)
我建议使用Session对象来存储这种信息。
答案 2 :(得分:0)
如果您希望为会话保持活动状态(也是最直接的方法),请使用Session
。如果您想在单个请求之间保持它(或直到它被读出),请使用TempData
。
您也可以使用查询字符串或URL参数,但在这种情况下,我不建议使用。
请勿使用cache
,因为该网站的所有用户都共享。{/ p>
理想情况下,它应该是Custom Identity object