放置此身份验证逻辑的适当位置在哪里?

时间:2012-07-24 08:51:57

标签: c# asp.net asp.net-mvc-3 authentication global-asax

我们有一个古老的经典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()。

enter image description here

修改

看起来这不起作用,因为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");
            }
    }

1 个答案:

答案 0 :(得分:1)

我认为控制器操作将是最佳位置,将控制器操作保持在最低限度是一个好主意,因此它不会变得臃肿。但如果动作没有涉及太多层次,那么它似乎很合适。

如果您使用会话操作做任何“奇怪”的事情,您仍然可以使用Session_Start。但是,如果可以的话,请避免使用,没有像魔法一样的地方发生在你自己的应用程序exec路径上的混淆:D