.net формирует вопрос аутентификации - PullRequest
1 голос
/ 14 января 2011

Я работаю над пользовательской страницей входа в mvc.net.Я проверяю логины следующим образом:

public bool Login(string login, string password, bool persistent)
{
  var loginEntity = this.AdminRepository.GetLogin(login, password);
  if (loginEntity != null)
  {
    FormsAuthentication.SetAuthCookie(login, persistent);

    HttpContext.Current.Session["AdminId"] = loginEntity.AdminId;
    HttpContext.Current.Session["AdminUsername"] = loginEntity.Username;

  return true;
  }

, затем я украшаю любой контроллер, которому необходим доступ администратора, с атрибутом фильтра:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
  var ctx = HttpContext.Current;

  // check if session is supported
  if (ctx.Session != null)
  {
    var redirectTargetDictionary = new RouteValueDictionary();

    // check if a new session id was generated
    if (ctx.Session.IsNewSession)
    {
        // If it says it is a new session, but an existing cookie exists, then it must
        // have timed out
        string sessionCookie = ctx.Request.Headers["Cookie"];
        if (((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) || null == sessionCookie)
        {
          redirectTargetDictionary = new RouteValueDictionary();
          redirectTargetDictionary.Add("area", "Admin");
          redirectTargetDictionary.Add("action", "LogOn");
          redirectTargetDictionary.Add("controller", "Home");

          filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
        }
      } else if (SessionContext.AdminId == null) {
        redirectTargetDictionary = new RouteValueDictionary();
        redirectTargetDictionary.Add("area", "Admin");
        redirectTargetDictionary.Add("action", "LogOn");
        redirectTargetDictionary.Add("controller", "Home");

        filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
      }
    }
    base.OnActionExecuting(filterContext);
}

Я вижу, что после входа в систему у меня есть два куки:

  1. ASPXAUTH (с датой истечения срока действия, установленной на «В конце сеанса» (когда постоянное значение равно false) ИЛИ (через 30 минут (если постоянное значение установлено на true)
  2. и ASP.NET_SessionId, время истечения которого всегда равно «В конце сеанса»

Вопрос: Проблема в том, что, хотя я установил для TRUE значение «persists» (которое установит ASPXAUTH, срок действия истекает через 30 минут с этого момента, чтоэто хорошо) моя Сессия ["AdminId"] всегда равна нулю после того, как я закрываю и снова открываю браузер. Как мне убедиться, что мои Сессии (Session ["AdminId"] и Session ["AdminUsername"]) извлекаются из cookie, когдаСначала я устанавливаю «persists» на true и закрываю, а затем снова открываю окно браузера. Спасибо

Ответы [ 2 ]

0 голосов
/ 14 января 2011

Я нашел свое решение здесь: Можно ли использовать .ASPXAUTH для моей собственной системы регистрации?

и вот что я сделал:

    public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Controller action filter is used to check whether the session is still active. If the session has expired filter redirects to the login screen.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {
            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                var identity = ctx.User.Identity;

                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if (((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) || null == sessionCookie)
                {
                    var redirectTargetDictionary = new RouteValueDictionary();
                    redirectTargetDictionary.Add("area", string.Empty);
                    redirectTargetDictionary.Add("action", "LogOn");
                    redirectTargetDictionary.Add("controller", "User");

                    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
                }

                // Authenticated user, load session info
                else if (identity.IsAuthenticated)
                {
                    var loginRepository = new LoginRepository(InversionOfControl.Container.Resolve<IDbContext>());
                    IAuthenticationService authenticationService = new AuthenticationService(loginRepository);
                    authenticationService.SetLoginSession(identity.Name);
                }
            }
            else if (SessionContext.LoginId == null)
            {
                var redirectTargetDictionary = new RouteValueDictionary();
                redirectTargetDictionary.Add("area", string.Empty);
                redirectTargetDictionary.Add("action", "LogOn");
                redirectTargetDictionary.Add("controller", "User");

                filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
            }
        }
        base.OnActionExecuting(filterContext);
    }
}
0 голосов
/ 14 января 2011

На диск записывается файл cookie со сроком действия. Поэтому пользователь все равно будет авторизован при следующем открытии браузера при условии, что срок действия файла cookie не истек.

Файл cookie сеанса сохраняется только в памяти и теряется, как только браузер закрывается.

Сеансовый файл cookie - это файл cookie без даты истечения срока действия.

...