我有一个MVC 5应用程序,其[authorize]属性位于我的控制器的类顶部,我不希望未经授权的用户访问。我的Web.config文件中的设置中包含以下内容
<location path="">
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authorization>
<deny users="?"/>
</authorization>
<authentication mode="Forms">
<forms loginUrl="~/Login" timeout="15" />
</authentication>
</system.web>
</location>
当我运行应用程序时,我被重定向到登录页面,但是,如果我知道我想要的Controller / Action的名称,我可以绕过登录页面而不输入任何凭据,例如上面相同的控制器我在类级别放置了[Authorize]属性。这不应该发生。我意识到这可能与我的路径=&#34;&#34;但是我试图拒绝所有访问权限,直到用户登录并且我尝试了#34; *&#34;和&#34;〜&#34;但他们没有工作。
答案 0 :(得分:2)
首先,MVC5默认不使用FormsAuthentication。它使用ASP.NET身份。因此,将身份验证格式设置为“表单”将导致问题,除非您实际使用的是Windows窗体。实际上,您可能会在web.config中找到它,它会完全禁用它:
<system.webServer>
<modules>
<remove name="FormsAuthenticationModule" />
</modules>
</system.webServer>
其次,微软的官方立场是你无法通过web.config位置配置来保护MVC应用程序。
您无法使用路由或web.config文件来保护您的MVC应用程序。保护MVC应用程序唯一受支持的方法是将Authorize属性应用于每个控制器,并在登录和注册操作上使用新的AllowAnonymous属性。根据当前区域做出安全决策是非常糟糕的事情,并会将您的应用程序打开到漏洞中。
永远不应在MVC应用程序中使用基于Web.config的安全性。这样做的原因是多个URL可能会触及控制器,并且将这些检查放在Web.config中总是会遗漏某些内容。