c# - Response.Redirect 失败但随后可以在刷新 IIS Express VS2013 上工作

标签 c# asp.net visual-studio-2013 iis-express

我在 Visual Studio 2013 中有一个 ASP.NET 项目,在 IIExpress(版本 8.08418.0)中本地运行以进行测试。

主页 (adminDefault.aspx) 将用户重定向到 Login.aspx 以进行身份​​验证(这是基于作为 url 变量传递给 adminDefault.aspx 的用户 ID 静默完成的)。登录页面在身份验证成功后将其发送回 adminDefault.aspx。 Default 然后将数据加载到 Gridview 中。

整个过程大约需要 15 秒。

当我从 Visual Studio 2013 运行它时,我在大约 4 秒内收到错误“无法显示此页面”。但是,如果我手动点击刷新,工作一段时间后,一切都会好起来的。

Showing Failure

在我的代码中,怀疑超时,我隐式设置了足够长的时间来运行所有内容:

 if (!this.IsPostBack)
            {

                Session.Timeout = 120;  // seconds before timeout
                try
                {
                    // OnUser should have been set from Login.asp. If it is null, send to Login
                    MembershipUser onUser = Membership.GetUser();
                    if (onUser == null)
                    {
                        Response.Redirect("/login.aspx", true);
                    }
                    else
                    {
                        String currentUserName = Membership.GetUser().UserName;
                        userRoles = Roles.GetRolesForUser(Membership.GetUser().UserName);
                    }
                }

即使 Session.Timeout 被忽略,默认值为 20 秒,所以我希望它无论如何都能工作。

所以: 1)为什么第一次运行失败? 2)有什么办法可以预防吗?如果失败,我可以捕获找不到的页面并自动刷新吗?

编辑:这与 Login.aspx 的往返行程有关。如果我删除 Response.Redirect("/login.aspx", true); 然后这按预期工作。问题是,我需要 Login.aspx 进行验证。任何人都知道为什么登录和返回的旅程不起作用......然后在刷新时呢?

当我尝试在 Chrome 中运行它时,我没有得到那么远。 Chrome 向我展示了这个:

enter image description here

点击这里只是循环片刻然后返回到屏幕。

在这种情况下,IE 上的开发人员工具没有帮助(至少我可以看到)。当我在调试器中运行我的项目时,它会启动一个新的 IE session 。在我打开开发者工具并按下“播放”来记录事件之前, session 已经给我“无法显示页面”错误。当然,我可以在工具中点击“播放”然后刷新,但是当然一切都可以正常运行。刷新使一切正常运行。我需要在那之前发现它失败的原因。

编辑:这是 Login.aspx 和 Web.Security 代码。它不是我写的,但它看起来像样板:

  protected void Page_Load(object sender, EventArgs e)
    {
            string userName = "";
            bool authenticated = FormsAuthentication.Authenticate(ref userName);
            if (authenticated)
                {
                    FormsAuthentication.RedirectFromLoginPage(userName, false);
                }
     }

验证码如下所示:

        /// <summary>
    /// Validates a user based on the  session id found in the ReturnURL against credentials stored in the ASP.NET membership.
    /// </summary>
    /// <param name="userName">The user name.</param>
    /// <returns>true if the user name and password are valid; otherwise, false.</returns>
    public static bool Authenticate(ref string userName)
    {
        bool Authenticated = Authenticate(ref userName, GetSessionId());
        return Authenticated;
    }

    /// <summary>
    /// Redirects an authenticated user back to the originally requested URL or the default URL using the specified cookie path for the forms-authentication cookie.
    /// </summary>
    /// <param name="userName">The authenticated user name. </param>
    /// <param name="createPersistentCookie">true to create a durable cookie (one that is saved across browser sessions); otherwise, false. </param>
    /// <param name="strCookiePath">The cookie path for the forms-authentication ticket. </param>
    public static void RedirectFromLoginPage(string userName, bool createPersistentCookie, string strCookiePath)
    {
        System.Web.Security.FormsAuthentication.SetAuthCookie(userName, false, strCookiePath);

        // Redirect back to request page.
        HttpContext.Current.Response.Redirect(GetRedirectUrl());
    }

最佳答案

我认为在您最初的 if 语句中,您假设每个人都已登录或未登录。但未登录的用户和访问者也可以是匿名的(?)。您要做的是保护此 admin.Default 页面并仅允许授权用户。目前,如果用户 = null 或获得角色,您的 2 个条件是将用户发送回 login.aspx 页面(他们当前所在的页面)。 身份验证是关于了解用户是谁,而授权是关于对资源的访问。您只希望授权用户访问该资源。

我会将 admin.Default.aspx、admin.Default.cs 和 admin.Default.designer.cs 放在它们自己的名为 AdminSecure 的文件夹中。然后将它们添加到该文件夹​​中后,右键单击并添加一个 Web.config 文件。在该 Web.config 中,您需要做的是拒绝匿名用户。因此,当他们尝试访问该 AdminDefault 页面时,他们会自动被重定向。

//拒绝未登录的用户? ==匿名

<xml version="1.0"?>
<configuration>
    <system.web>
<authorization>
  <deny users="?"/>
</authorization>
    </system.web>
</configuration>


//this can allow particular users
<allow users="User1@mail.com"/>

//deny everyone but one user:
<allow users="User1@mail.com"/>
<deny users="*"/>

注释掉您当前的代码,希望这对您有所帮助。

关于c# - Response.Redirect 失败但随后可以在刷新 IIS Express VS2013 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47461350/

相关文章:

c# - 我可以内联指定我的显式类型比较器吗?

c# - 不同的值成员,相同的控件

asp.net - 将 ASP.NET MVC 部署到 Windows Server 2003?

c# - 可以分机 : Window be constrained in framelike Master markup?

c# - 是否可以使用 NPOI 和 C# 编辑 .xlsm 文件

c++ - 如何在 Visual C++ 2013 上递归删除二叉树?

c# - Windows 7 坚持文件夹不存在

c# - 除了使用线程之外,监视 C# 中的控件

html - 在表格单元格中插入下拉列表选项

visual-studio-2013 - 在 VS2013 中运行的 resharper 8.0 中的 stylecop 插件在哪里?