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

时间:2011-08-11 02:54:36

标签: asp.net-mvc forms-authentication

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

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

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

我需要电子邮件,因此我可以为用户加载一个重力图标,用户名,以便我可以在顶部栏中显示友好的显示名称,以及用户ID,以便我可以定义特定于该用户ID的某些链接(即/用户/编辑/ 2332)。

不仅存储用户名而且还存储用户ID和电子邮件的最简洁方法是什么?

自定义主体/标识对象?缓存?会议?其他一些方式?

3 个答案:

答案 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