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

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Используйте пользовательский объект 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
0 голосов
/ 11 августа 2011

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

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

Не используйте cache, поскольку оно доступно всем пользователям сайта.

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

0 голосов
/ 11 августа 2011

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

...