ASP.NET 3.5 MVC1 - пользователи случайно не прошли проверку подлинности / требуется войти в систему - PullRequest
3 голосов
/ 01 февраля 2011

Мы используем состояние сеанса SQL вне процесса, ASP.NET 3.5 MVC 1.0 и проверку подлинности с помощью форм с использованием IIS 7.

Сеанс пользователя правильно настроен при входе в систему и истечет время ожидания, перенаправляя ихна специальной странице входа "Тайм-аут".Проблема в том, что некоторые (не все) пользователи входят в систему и (из того, что я могу сказать) сразу же не проходят проверку подлинности и должны войти в систему (т.е. перенаправлены на исходную страницу «Вход в систему»).

Может кто-нибудьу вас есть идея, почему наших пользователей периодически выгнали?

РЕДАКТИРОВАТЬ: с тех пор я добавляю логирование на каждое событие Application_AuthenticateRequest, я могу сказать вам, что до того, как пользователь будет загружен, оба билета Auth аутентифицируются, сохраняютсяи истекает через два дня, и запрос также подтверждается.По прибытии на страницу входа пользователь больше не проходит проверку подлинности.

РЕДАКТИРОВАТЬ # 2: мы добились определенного прогресса, может показаться, что пользователи могут не проходить проверку подлинности, поскольку это веб-приложение ищет сценарии и другой контентв родительском приложении, для которого пользователи не проходят проверку подлинности.Исходный формат для включения этих сценариев следующий:

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>

Я исправил его следующим образом:

<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.js") %>" type="text/javascript"></script>

ОТВЕТ Вышеуказанные изменения в наших ссылках на сценариина наших страницах .master проблема решена.Он явно указывает приложению искать в корневой папке текущего приложения.Спасибо всем, кто помог.Я хотел бы отметить несколько ответов!

Ниже приведено наше действие для входа в систему:

    [AcceptVerbs(HttpVerbs.Post)]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
        Justification = "Needs to take same parameter type as Controller.Redirect()")]
    public virtual ActionResult LogOn(string userName, string password, string returnUrl)
    {
        if ((HttpContext.Current.User == null) || (!HttpContext.User.Identity.IsAuthenticated))
        {
          if (!ValidateLogOn(userName, password))
          {
              try
              {
                return View();
              }
              catch (Exception ex)
              {
                throw new Exception(string.Format("User validation failed at LogOn: {0}", ex.ToString()));
              }
          }
        }

        bool rememberMe = true;

        FormsAuth.SignIn(userName, rememberMe);

        Session["userName"] = userName;

        if (!String.IsNullOrEmpty(returnUrl))
        {
            try
            {
                return Redirect(returnUrl);
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("User redirect to returnUrl ({0}) failed: {1}", returnUrl, ex.ToString()));
            }
        }
        else
        {
            try
            {
                return RedirectToAction("Index", "RodWebUI");
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("User redirect to action: Index, controller: RodWebUi failed: {0}", ex.ToString()));
            }
        }
    }

Ниже приведено действие timeoutlogon:

    public virtual ActionResult TimeOutLogon()
    {
        try
        {
            FormsAuth.SignOut();

            ViewData["TimeoutMsg"] = "Session timed out. Please log back in.";

            return View();
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Error with redirecting to TimeOutLogon: {0}", ex.ToString()));
        }
    }  

IС тех пор мы добавили следующую проверку в наш global.asax для регистрации текущего состояния запроса и заявки на авторизацию.Все проверено и все в порядке, прежде чем вернуться в LogOn.

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;

                    FormsAuthenticationTicket ticket = identity.Ticket;

                    LogFunctionCall(HttpContext.Current.User.Identity.Name, "", "User Authentication Check", "", 
                                        string.Format("Auth ticket is expired: {0}, expiration date: {1}, is persistent: {2}, issued: {3}", 
                                        ticket.Expired, ticket.Expiration, ticket.IsPersistent, ticket.IssueDate), "", 0);

                    LogFunctionCall(HttpContext.Current.User.Identity.Name, "", "User Authentication Check Line #2", "", 
                                        string.Format("Raw URL: {0}, Request is authenticated: {1}", HttpContext.Current.Request.RawUrl, HttpContext.Current.Request.IsAuthenticated), "", 0);
                }
            }
        }
    }

Ответы [ 5 ]

2 голосов
/ 01 февраля 2011

ASP.Net перенаправляет пользователей на страницу входа в систему, если они не прошли проверку подлинности ИЛИ если они не авторизованы для просмотра ресурса, на который они пытаются перейти.

2 голосов
/ 01 февраля 2011

Есть ли у вас веб-сайт с балансировкой нагрузки?

Если да, одинаковые ли ключи машины на всех узлах?Имя Forms Cookie одно и то же?Если в этих значениях есть расхождения, вы можете войти в систему на одном узле, а другой узел не аутентифицироваться.

1 голос
/ 12 марта 2011
public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void signout_Click(object sender, EventArgs e)
    {
      Response.Write("<script language=javascript>var wnd=window.open('','newWin','height=1,width=1,left=900,top=700,status=no,toolbar=no,menubar=no,scrollbars=no,maximize=false,resizable=1');</script>");
      Response.Write("<script language=javascript>wnd.close();</script>");
      Response.Write("<script language=javascript>window.open('login.aspx','_parent',replace=true);</script>");
      Session["name"] = null;
    }
}

Я также добавляю на всю страницу этот код.

protected void Page_Load(object sender, EventArgs e)
    {
      Response.Cache.SetCacheability(HttpCacheability.NoCache);
      Response.Cache.SetAllowResponseInBrowserHistory(false);
    }
}
1 голос
/ 01 февраля 2011

Это может быть глупо, но может ли returnUrl указывать на страницу входа?

Как ведет себя страница входа, когда пользователь уже вошел в систему?

0 голосов
/ 01 февраля 2011

Spidey sense говорит, что процесс ASP.NET или пул приложений перерабатывают на вас.Может случиться по нескольким причинам.Поскольку сеансы вне процесса, они не будут съедены этим событием.

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

...