我在哪里可以将电子邮件和userId存储在我的ASP.NET MVC应用程序中,这样我就不必每次请求都检索它?

Vik*_*tor 2 asp.net-mvc forms-authentication

我正在编写一个ASP.NET MVC应用程序,我正在使用默认IPrincipal,IIDentity等表单身份验证.

在我的身份验证票证中,我将用户名存储在name参数中.

但是,我遇到的情况是,在每次请求时,我的主布局不仅需要访问用户名,还需要访问用户的电子邮件和用户ID.

我需要电子邮件,所以我可以为用户加载一个gravitar图标,用户名,这样我可以在顶部栏中显示友好的显示名称,以及用户ID,以便我可以定义特定于该用户ID的某些链接(即/ users/edit/2332).

什么是最简单的方式来存储用户名,还有用户ID和电子邮件?

自定义主体/标识对象?缓存?会议?还有其他方法吗?

Cha*_*ino 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);
    }
}
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)