1

我们有一个旧的经典 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");
            }
    }
4

1 回答 1

1

我认为控制器动作将是最好的地方,将控制器动作保持在最低限度是个好主意,这样它就不会变得臃肿。但如果动作不涉及太多层,它似乎很合适。

如果您正在使用会话操作做任何“奇怪”的事情,您仍然可以使用Session_Start。但是,如果可以的话,请避免它,没有什么能像魔术一样在你自己的应用程序执行路径上迷惑你:D

于 2012-07-24T10:18:33.853 回答