我们有一个古老的经典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的正确位置在global.asax的Session_Start()
方法中,但是在提交“frmMain”时似乎没有调用此方法。它似乎间歇性地工作 - 如果我完全关闭IE,再试一次然后手动输入URL。
void Session_Start(object sender, EventArgs e)
{
Log("In Session Start");
AthenticateUser();
}
在我的ASP.NET应用中验证用户的正确位置在哪里?
这是一个来自表单auth失败的开发工具的屏幕 - 不调用Session_Start()。
修改
看起来这不起作用,因为IsAuthenticated属性仅在后续请求上设置,这导致auth在索引操作上失败。
我现在要测试一下,但请看Who sets the IsAuthenticated property of the HttpContext.User.Identity
解决方案:
在调用SetAuthCookie后导致索引视图失败的第一个错误没有重定向。
我也意识到没有必要将它放在global.asax中,但我宁愿重定向到LogOn操作而不是直接转到索引操作:
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");
}
}
答案 0 :(得分:1)
我认为控制器操作将是最佳位置,将控制器操作保持在最低限度是一个好主意,因此它不会变得臃肿。但如果动作没有涉及太多层次,那么它似乎很合适。
如果您使用会话操作做任何“奇怪”的事情,您仍然可以使用Session_Start
。但是,如果可以的话,请避免使用,没有像魔法一样的地方发生在你自己的应用程序exec路径上的混淆:D