在Session_Start事件中,它调用authenticate_authorize类以返回AuthResult对象。
public AuthResult
{
public enumAuthResult Result {get;set;}
public string Controller {get;set;}
public string Action {get;set;}
}

在Session_Start事件中不使用重定向来调用控制器操作的正确方法是什么?
我应该分别在Application_AuthenticateRequest和Application_AuthorizeRequest事件中拆分身份验证和授权吗?
如果身份验证和授权是在不同的事件中完成的,我如何将AuthResult对象传递给Session_Start事件,以使其正确重定向或路由到控制器?
Response.RedirectToRoute(AuthResult.Controller, AuthResult.Action);
Response.Redirect(string.Format("{0}/{1}",AuthResult.Controller, AuthResult.Action));

答案 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成员身份。