Хранение дополнительной информации с использованием FormsAuthentication.SetAuthCookie - PullRequest
43 голосов
/ 19 июля 2009

Я использую aspx и c # для настройки файла cookie аутентификации для входа в систему.

FormsAuthentication.SetAuthCookie(UserName, True)

Я хочу сохранить больше информации в том же файле cookie. Могу ли я добавить значения в этот куки-файл аутентификации или мне нужно использовать второй http-куки?

В основном я ищу для хранения Id пользователя, чтобы я мог получить доступ к базе данных, используя ключ строки таблицы пользователей

Спасибо, Eden

Ответы [ 5 ]

47 голосов
/ 19 июля 2009

Вы можете добавить пользовательские данные в FormsAuthenticationTicket, а затем самостоятельно сгенерировать cookie.

В приведен пример документации MSDN для FormsAuthenticationTicket .

EDIT

Обратите внимание, что при создании заявки вам нужно установить время ожидания, которое, как правило, должно совпадать со значением, настроенным в web.config. К сожалению, в Framework 3.5 или более ранней версии класс FormsAuthentication не предоставляет этот тайм-аут публично. Для обходного пути используйте один из методов, описанных в ответе на этот элемент обратной связи подключения .

UPDATE

Этого элемента обратной связи Connect, к сожалению, больше нет. Хотелось бы, чтобы вы кратко описали, какие техники были.

Да, жаль, что Microsoft отбросила исторические элементы Connect. IIRC, они предложили два метода:

  1. Используйте WebConfigurationManager, чтобы прочитать соответствующий раздел конфигурации и получить значение времени ожидания.

  2. Создайте cookie с помощью FormsAuthentication.GetAuthCookie, расшифруйте его с помощью FormsAuthentication.Decrypt и проверьте сгенерированный FormsAuthenticationTicket.

Или обновите до .NET 4.x, где есть свойство FormsAuthentication.Timeout.

См. этот вопрос для получения дополнительной информации

15 голосов
/ 19 июля 2009

Вы можете помещать все, что хотите, в файл cookie для аутентификации, если это полезно для вас. Тем не менее, если вы размещаете конфиденциальную информацию, вы должны, по крайней мере, зашифровать ее, но я бы рекомендовал не размещать там конфиденциальную информацию. Вы можете сделать что-то вроде:

Forms.SetAuthCookie (UserName + "|" + UserId, true);

Тогда, когда вам нужно имя пользователя или идентификатор пользователя, оно есть. Просто загрузите куки и разберите нужные вам значения.

Опять же, Я бы посоветовал не делать этого, тем более что я представил это выше . Тем не менее, это возможно. Вы должны создать методы доступа, чтобы вытащить данные обратно:

public int CurrentUserId
{
    get
    {
        int userId = 0;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]);
        }

        return userId;
    }
}

public string CurrentUserName
{
    get
    {
        string userName = string.Empty;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userName = HttpContext.Current.User.Identity.Name.Split('|')[0];
        }

        return userName;
    }
}
3 голосов
/ 28 июня 2012

Да, это разумно использовать "|" поставить больше информации. Если у Microsoft есть другой перегруженный метод

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`

Тогда наша жизнь станет намного проще, наш код станет безопаснее.

1 голос
/ 19 июля 2009

Передать этот идентификатор пользователя как параметр userName.

FormsAuthentication.SetAuthCookie(userId, True)

Как вы защищаете свои билеты на аутентификацию?

0 голосов
/ 07 декабря 2018

Вы можете хранить дополнительную информацию в UserData свойстве FormsAuthenticationTicket:

using Newtonsoft.Json;
using System.Web;
using System.Web.Security;

public class LoggedInUser
{
    public string FirstName { get; set; } = null;
    public bool IsAdmin { get; set; } = false;
}

public static class Authentication
{
    static void SignIn(
        HttpContextBase context,
        string emailAddress,
        bool rememberMe,
        LoggedInUser user = null)
    {
        var cookie = FormsAuthentication.GetAuthCookie(
            emailAddress.ToLower(),
            rememberMe);
        var oldTicket = FormsAuthentication.Decrypt(cookie.Value);
        var newTicket = new FormsAuthenticationTicket(
            oldTicket.Version,
            oldTicket.Name,
            oldTicket.IssueDate,
            oldTicket.Expiration,
            oldTicket.IsPersistent,
            JsonConvert.SerializeObject(user ?? new LoggedInUser()));

        cookie.Value = FormsAuthentication.Encrypt(newTicket);

        context.Response.Cookies.Add(cookie);
    }

    static void SignOut(HttpContextBase context)
    {
        FormsAuthentication.SignOut();
    }

    static LoggedInUser GetLoggedInUser()
    {
        if (HttpContext.Current.User?.Identity?.Name != null && HttpContext.Current.User?.Identity is FormsIdentity identity)
            return JsonConvert.DeserializeObject<LoggedInUser>(identity.Ticket.UserData);

        return new LoggedInUser();
    }
}

Дополнительная литература: https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs#step-4-storing-additional-user-data-in-the-ticket

...