我们有一个旧的经典 asp 应用程序,用于管理和启动我们的其他 Web 应用程序。
它启动应用程序的方式如下:
<form name="frmMain" action="http://xxxx/mvc3app/Index" target=_self method=post>
<script language="javascript">
frmMain.submit();
</script>
用户登录名和密码作为请求的一部分传递。
要在 ASP.NET 应用程序中验证用户身份,我调用以下 AuthenticateUser 函数:
public bool AuthenticateUser()
{
var userName = Context.Request["txtName"];
var password = Context.Request["txtPassword"];
if (Membership.ValidateUser(userName, password))
{
FormsAuthentication.SetAuthCookie(userName, true);
}
}
我假设调用 AuthenticateUser 的正确位置Session_Start()
在 global.asax 中的方法中,但提交“frmMain”时似乎没有调用此方法。它似乎间歇性地工作 - 如果我完全关闭 IE,请再试一次,然后手动输入 URL。
void Session_Start(object sender, EventArgs e)
{
Log("In Session Start");
AthenticateUser();
}
在我的 ASP.NET 应用程序中对用户进行身份验证的正确位置在哪里?
这是来自开发工具的验证失败形式的屏幕截图 - 未调用 Session_Start()。
编辑
看起来这不起作用,因为 IsAuthenticated 属性仅在后续请求上设置,这导致身份验证在索引操作上失败。
我现在将对此进行测试,但请参阅谁设置了 HttpContext.User.Identity 的 IsAuthenticated 属性
解决方案:
第一个错误在调用 SetAuthCookie 后没有重定向,这导致索引视图验证失败。
我还意识到没有必要将它放在 global.asax 中,但我宁愿重定向到 LogOn 操作,而不是直接转到 index 操作:
public ActionResult LogOn()
{
var userName = Context.Request["txtName"];
var password = Context.Request["txtPassword"];
if (Membership.ValidateUser(userName, password))
{
FormsAuthentication.SetAuthCookie(userName, false);
return RedirectToAction("Index", "Index");
}
else
{
return RedirectToAction("IncorrectLogin", "Index");
}
}