在ASP.NET MVC项目中,一般都要使用身份验证和权限控制,但总有部分网页是可以匿名访问的。使用AllowAnonymous属性就可以指定需要匿名访问的控制器,从而跳过身份验证。
但是今天却遇到一个AllowAnonymous属性失效的问题,导致声明了该属性控制器的操作方法无法匿名访问,需要登陆后才可访问。后经过排查,是由于配置文件属性设置的问题。
一般是这样声明这个属性的:
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
声明了允许匿名访问后,用户访问该控制器下的Index操作方法时,就无需进行身份验证了
(PS:匿名属性启用的前提是网站启用了form身份验证)。
但是如果有发现声明了该属性后,却无法访问属性设置下的Action操作方法,反而跳转到身份验证的登陆页面。这个时候可以按下面步骤排除问题:
- 首先检查下网站的应用程序文件Global.asax是否有做过身份验证和跳转操作,要注意每个事件里所做的特殊处理
- 如果Global.asax没有做任何处理的话,那么接下来检测控制器的构造函数是否有做过身份验证和跳转处理,控制器所继承的类是不是有做过相关处理。
- 最后就是检查Web.config这个网站配置文件了。我的问题是因为在Web.config中,设置了authorization元素,并且设置deny users="?"(拒绝所有匿名用户访问)。由于authorization的优先级大于AllowAnonymous属性,所以程序先判断deny user="?" 拒绝掉匿名用户后,就会跳过Action操作方法中的所有身份验证属性,导致网站自动跳转到身份验证的登陆页面。具体配置文件代码:
<authorization> <deny users="?" /> </authorization>
将配置文件的此段配置删除后,就可以正常的匿名访问有声明允许匿名访问属性的Action操作方法了。
另外要说的一点,如果在ASP.NET MVC中已经使用了form身份验证,那么最好不要在配置文件中设置authorization元素,身份验证控制应该使用Authorize属性和AllowAnonymous属性。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98322.html