Vik*_*tor 2 asp.net-mvc forms-authentication
我正在编写一个ASP.NET MVC应用程序,我正在使用默认IPrincipal,IIDentity等表单身份验证.
在我的身份验证票证中,我将用户名存储在name参数中.
但是,我遇到的情况是,在每次请求时,我的主布局不仅需要访问用户名,还需要访问用户的电子邮件和用户ID.
我需要电子邮件,所以我可以为用户加载一个gravitar图标,用户名,这样我可以在顶部栏中显示友好的显示名称,以及用户ID,以便我可以定义特定于该用户ID的某些链接(即/ users/edit/2332).
什么是最简单的方式来存储用户名,还有用户ID和电子邮件?
自定义主体/标识对象?缓存?会议?还有其他方法吗?
使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
登录方式
private void LoginUser(SimplePrincipal principal, bool isPersistent)
{
var userData = SimplePrincipal.GetCookieUserData(principal);
var authCookie = FormsAuthService.GetAuthCookie(principal.Name, userData, isPersistent);
Response.Cookies.Add(authCookie);
}
Run Code Online (Sandbox Code Playgroud)
验证模块
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
}
}
Run Code Online (Sandbox Code Playgroud)
在完成所有这些连接之后,您可以简单地获取对象:
var principal = HttpContext.Current.User as SimplePrincipal
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2260 次 |
| 最近记录: |