我在 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 秒内收到错误“无法显示此页面”。但是,如果我手动点击刷新,工作一段时间后,一切都会好起来的。
在我的代码中,怀疑超时,我隐式设置了足够长的时间来运行所有内容:
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 向我展示了这个:
点击这里只是循环片刻然后返回到屏幕。
在这种情况下,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/