Сохранение дополнительной информации с помощью FormsAuthentication.SetAuthCookie
Я использую aspx и С# для настройки cookie аутентификации для входа.
FormsAuthentication.SetAuthCookie(UserName, True)
Я хочу хранить больше информации в том же файле cookie. Могу ли я добавить значения в этот файл cookie для проверки подлинности или мне нужно использовать второй файл cookie http?
В основном я ищу для хранения пользователя Id
, поэтому я могу получить доступ к базе данных с помощью строки строки таблицы пользователей
Спасибо,
Eden
Ответы
Ответ 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
.