Хранение дополнительной информации с использованием FormsAuthentication.SetAuthCookie
Я использую aspx и C# для установки файла cookie аутентификации для входа в систему.
FormsAuthentication.SetAuthCookie(UserName, True)
Я хочу хранить больше информации в том же файле cookie. Могу ли я добавить значения в этот куки-файл аутентификации или мне нужно использовать второй http-куки?
В основном я ищу прочь, чтобы сохранить пользователя Id
так что я могу получить доступ к базе данных, используя ключ строки таблицы пользователей
Спасибо, Иден
5 ответов
Вы можете добавить пользовательские данные в FormsAuthenticationTicket, а затем создать файл cookie самостоятельно.
В документации MSDN есть пример для FormsAuthenticationTicket.
РЕДАКТИРОВАТЬ
Обратите внимание, что при создании заявки вам нужно установить время ожидания, которое, как правило, должно совпадать со значением, настроенным в web.config. К сожалению, в Framework 3.5 или более ранней версии FormsAuthentication
класс не раскрывает этот тайм-аут публично. Для обходного пути используйте один из методов, описанных в ответе на этот элемент обратной связи подключения.
ОБНОВИТЬ
К сожалению, этого элемента обратной связи Connect больше нет. Хотелось бы, чтобы вы кратко описали, какие были методы
Да, жаль, что Microsoft отбросила исторические элементы Connect. IIRC, они предложили два метода:
Используйте WebConfigurationManager, чтобы прочитать соответствующий раздел конфигурации и получить значение времени ожидания.
Создать куки с помощью
FormsAuthentication.GetAuthCookie
расшифруйте его, используяFormsAuthentication.Decrypt
и осмотреть сгенерированныйFormsAuthenticationTicket
,
Или обновите до.NET 4.x, где есть FormsAuthentication.Timeout
имущество.
Смотрите этот вопрос для получения дополнительной информации
Вы можете поместить все, что хотите, в файл 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;
}
}
Да, это разумно использовать "|" поставить больше информации. Если у Microsoft есть другой перегруженный метод
public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`
Тогда наша жизнь станет намного проще, наш код станет безопаснее.
Передайте этот идентификатор пользователя в качестве параметра userName.
FormsAuthentication.SetAuthCookie(userId, True)
Как вы защищаете свои билеты?
Вы можете хранить дополнительную информацию в 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
Вы можете установить тайм-аут на основе значения в web.config
с помощью FormsAuthentication.Timeout.TotalMinutes
,