2012-07-24 91 views
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将在Global.asax中Session_Start()方法,但它不在提交“frmMain”时似乎并没有提到这种方法。它似乎间歇性地工作 - 如果我完全关闭IE,请再试一次,然后手动输入URL。

void Session_Start(object sender, EventArgs e) 
{ 
    Log("In Session Start"); 
    AthenticateUser(); 
} 

哪里将是正确的地方,在我的ASP.NET应用程序来验证用户的身份?

这是一个屏幕开发工具的形式认证失败 - Session_Start()不被调用。

enter image description here

编辑

看起来这是行不通的,因为IsAuthenticated属性只在其上造成AUTH失败的索引操作的后续请求设置。

我现在会测试这个,但看到Who sets the IsAuthenticated property of the HttpContext.User.Identity

解决方案:

第一个错误调用SetAuthCookie这是导致指数以失败验证后没有重定向。

我也意识到,没有必要把这个在Global.asax中,但我宁愿重定向到一个登录行动,而不是直接到索引操作:

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

上的登录操作.... – devundef 2012-07-24 09:13:41

+0

'Session_Start'被称为当用户第一次来到你网页。这是新会议的开始。考虑浏览webform应用程序的页面和应用程序生命周期。 =) – 2012-07-24 09:13:43

+0

这看起来不像传统的ASP给我。你的意思是Asp.net的网页表单? – podiluska 2012-07-24 10:16:07

回答

1

我想一个控制器的动作会最好的地方,它是一个好主意,以保持控制器的行动到最低限度,所以它不会臃肿。但是如果这个动作没有触及太多的层次,那看起来很合适。

如果你正在做与会议操纵任何“古怪”的东西,你仍然可以使用Session_Start虽然。但是,如果你能避免它,没有什么神奇般发生各地来迷惑你自己的应用程序执行路径上的地方:d

+0

谢谢约翰,但我更希望ValidateUser只能在每个会话中运行一次,因为它需要数据库命中... – woggles 2012-07-24 10:22:35

+0

@Woggles对不起让我澄清,只运行验证一次(即在行动中),但是如果你需要对会话操作进行任何操作(例如,如果用户来自某个特定域或其他地方,则设置会话标志),这个帽子就是做这件事的地方。 Session_Start也只在每个会话中运行一次(在设置会话cookie时)而不是每次回发。 – 2012-07-24 10:24:02

+0

好的,所以创建一个名为Logon()的控制器动作,或者没有授权的东西,然后在那里验证,然后重定向到索引 - 这比我愚蠢的方式更有意义! – woggles 2012-07-24 10:27:29

相关问题