Session_Start中的Request.RedirectToRoute导致会话重启

时间:2016-01-14 00:12:22

标签: asp.net-mvc

在Session_Start事件中,它调用authenticate_authorize类以返回AuthResult对象。



public AuthResult
{
  public enumAuthResult Result {get;set;}
  public string Controller {get;set;}
  public string Action {get;set;}
}



 如果结果不是enumAuthorized,则控制器和操作将返回到Session_Start。然后,如果使用Request.RedirectToRoute()路由到控制器的动作,则Session_Start将处于无限循环中。似乎RedirectToRoute()总是重新启动会话。相反,如果使用Request.Redirect(),那么正常的控制器动作会正常启动。

  1. 在Session_Start事件中不使用重定向来调用控制器操作的正确方法是什么?

  2. 我应该分别在Application_AuthenticateRequest和Application_AuthorizeRequest事件中拆分身份验证和授权吗?

  3. 如果身份验证和授权是在不同的事件中完成的,我如何将AuthResult对象传递给Session_Start事件,以使其正确重定向或路由到控制器?

  4. 
    
    Response.RedirectToRoute(AuthResult.Controller, AuthResult.Action);
    Response.Redirect(string.Format("{0}/{1}",AuthResult.Controller, AuthResult.Action));
    
    
    

1 个答案:

答案 0 :(得分:1)

  

在Session_Start事件中不使用重定向来调用控制器操作的正确方法是什么?

正确的方法是使用Authorization Filter,它在选择动作后运行。 Microsoft已经包含了一个默认实现AuthorizeAttribute,它可以满足大多数人对用户/角色的需求,但如果您需要制定自定义方案,则可以继承。

AuthorizeAttribute使用<msg time='2016-01-14T09:21:53.324+03:00' org_id='oracle' comp_id='tnslsnr' type='UNKNOWN' level='16' host_id='SERVERNAME' host_addr='::1'> <txt>14-JAN-2016 09:21:53 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=__jdbc__)(USER=SERVERNAME$))(SERVICE_NAME=TESTLD.DOMAIN)) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.29.17.141)(PORT=62670)) * establish * TESTLD.DOMAIN * 12571 </txt> </msg> <msg time='2016-01-14T09:22:03.324+03:00' org_id='oracle' comp_id='tnslsnr' type='UNKNOWN' level='16' host_id='SERVERNAME' host_addr='::1'> <txt>TNS-12571: TNS:packet writer failure TNS-12560: TNS:protocol adapter error TNS-00530: Protocol adapter error 64-bit Windows Error: 54: Unknown error TNS-12514: TNS:listener does not currently know of service requested in connect descriptor </txt> </msg> IPrincipal接口,这些接口可以由任何自定义安全方案实现,并使用ASP.NET成员身份和ASP.NET身份实现。

如果您尝试将安全性建立在URL上,则几乎不可能确保每个到某个操作的路由都将通过您的安全方案。例如,默认情况下,可以通过IUser//Home访问主页,因此,如果您的基于网址的授权仅占/Home/Index,则用户将会能够通过//Home来规避您的安全并访问您的主页操作。

我建议您不要创建自己的安全方案 - 这样做需要您根据自己的问题获得的经验。相反,您应该查看MVC security overview以找到适合您应用程序的最佳选项,然后阅读解释如何实现它的教程。请注意,ASP.NET标识取代了ASP.NET成员身份。