Подтвердить что ты не робот

Сохранение дополнительной информации с помощью FormsAuthentication.SetAuthCookie

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

FormsAuthentication.SetAuthCookie(UserName, True)

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

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

Спасибо, Eden

4b9b3361

Ответ 1

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

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

ИЗМЕНИТЬ

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

UPDATE

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 4

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

FormsAuthentication.SetAuthCookie(userId, True)

Как вы гарантируете свои билеты на аут?

Ответ 5

Вы можете хранить дополнительную информацию в свойстве 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-дополнительный пользователь-данных в-билет

Ответ 6

Вы можете установить таймаут на основе значения в web.config с помощью FormsAuthentication.Timeout.TotalMinutes.