Как получить недавно авторизованного пользователя? - PullRequest
1 голос
/ 23 сентября 2011

Я работаю с MVC 3, и я только что реализовал оболочку для FormsAuthenticationService.

Что-то похожее на следующее.

public void SignIn(string username, bool createPersistantCookie)
{
    if (string.IsNullOrEmpty(username)) 
        throw new ArgumentException("Value Cannot be null or empty", "username");

    FormsAuthentication.SetAuthCookie(username, createPersistantCookie);
}

Неохотно, я заставил это работать,но сейчас я не совсем уверен, как получить информацию, которую я хранил.

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

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

На основании предоставленной дополнительной информации вы хотите сохранить дополнительные данные с билетом FormsAuthentication. Для этого вам нужно сначала создать собственный билет FormsAuthentication:

Хранение данных

Получить текущий HttpContext (не беспокоясь о тестируемости)

var httpContext = HttpContext.Current;

Определите, когда должен истечь срок действия билета:

var expires = isPersistent 
                ? DateTime.Now.Add(FormsAuthentication.Timeout) 
                : NoPersistenceExpiryDate; // NoPersistenceExpiryDate = DateTime.MinValue

Создайте новый билет FormsAuthentication для хранения ваших пользовательских данных.

var authenticationTicket = new FormsAuthenticationTicket(
                             1, 
                             username, 
                             DateTime.Now, 
                             DateTime.Now.Add(FormsAuthentication.Timeout), 
                             isPersistent, 
                             "My Custom Data String"); //Limit to about 1200 bytes max

Создайте свой HTTP cookie

new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authenticationTicket))
  {
    Path = FormsAuthentication.FormsCookiePath,
    Domain = FormsAuthentication.CookieDomain,
    Secure = FormsAuthentication.RequireSSL,
    Expires = expires,
    HttpOnly = true
  };

И, наконец, добавить к ответу

httpContext.Response.Cookies.Add(cookie);

Получение данных

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

Опять захватить текущий HttpContext

var httpContext = HttpContext.Current

Проверьте, аутентифицирован ли запрос (вызовите Application_AuthenticateRequest или OnAuthorize)

if (!httpContext.Request.IsAuthenticated)
    return false;

Проверьте, есть ли у вас доступный билет FormsAuthentication и что он не истек:

var formsCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
if (formsCookie == null)
  return false;

Получить билет FormsAuthentication:

var authenticationTicket = FormsAuthentication.Decrypt(formsCookie.Value);
if (authenticationTicket.Expired)
  return false;

И, наконец, получить ваши данные:

var data = authenticationTicket.UserData;
1 голос
/ 23 сентября 2011

Вы фактически не сохранили идентификатор пользователя в базе данных. Весь код, который вы написали, хранит cookie-файл аутентификации на компьютере пользователя, либо как cookie-файл сеанса (не постоянный), либо как постоянный.

Когда ваша страница обновляется, она автоматически получает cookie, декодирует его и заполняет объект IPrincipal, к которому вы обращаетесь из свойства User.Current вашего контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...