Где я могу хранить электронную почту и идентификатор пользователя в моем приложении ASP.NET MVC, чтобы мне не приходилось получать его при каждом запросе?

Я пишу приложение ASP.NET MVC и использую проверку подлинности на основе форм по умолчанию IPrincipal, IIDentity и т. Д.

В моем билете аутентификации я сохраняю имя пользователя в параметре name.

Тем не менее, я сталкиваюсь с ситуациями, когда при каждом запросе моему мастер-макету требуется доступ не только к имени пользователя, но также к электронной почте и идентификатору пользователя.

Мне нужно электронное письмо, чтобы я мог загрузить значок gravitar для пользователя, имя пользователя, чтобы у меня было понятное отображаемое имя в верхней панели, и идентификатор пользователя, чтобы я мог определить определенные ссылки, относящиеся к этому идентификатору пользователя (например, /users/edit/2332).

Какой самый простой способ сохранить не только имя пользователя, но и идентификатор пользователя и адрес электронной почты?

Пользовательские объекты Принципал / Личность? Cache? Сессия? Как-то иначе?

3 ответа

Используйте кастом IPrincipal Объект с вашим собственным управлением куки.

Я бы предложил сериализовать пользовательский объект IPrinicipal в JSON и установить для вашего cookie.UserData сериализованную строку. Это было легко десериализовать, когда печенье возвращается.

РЕДАКТИРОВАТЬ: Пример пользовательского объекта 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

Я бы предложил использовать объект Session для хранения такого рода информации.

Использование Session если вы хотите сохранить его для сеанса (также самый прямой подход). использование TempData если вы хотите сохранить его между отдельными запросами (или пока он не будет считан).

Вы также можете использовать строку запроса или параметры URL, но в этом случае я бы не советовал.

Не использовать cache как это распространяется на всех пользователей сайта.

Хотя в идеале это должно быть Custom Identity object

Другие вопросы по тегам