【发布时间】:2017-02-03 17:30:46
【问题描述】:
我正在开发一个 ASP.Net MVC 应用程序。我想拒绝所有未经身份验证或不在 AD 组中的用户访问。只有这个 AD 组应该有访问权限。例外是“你不能通过!”页。任何人都可以访问它。
在项目根目录中,我的 web.config 中有这个(为简洁起见,对文件的其余部分进行了修剪):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<customErrors mode="On">
<error statusCode="401" redirect="/ui/Other/YouShallNotPass.html" />
</customErrors>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Windows" />
<authorization>
<allow roles="allowedrole"/>
<deny users="*"/>
</authorization>
</system.web>
<system.webServer>
<httpErrors>
<remove statusCode="401" />
<error statusCode="401"
subStatusCode="2"
responseMode="ExecuteURL"
path="/ui/Other/YouShallNotPass.html" />
</httpErrors>
</system.webServer>
</configuration>
我在ui/Other/YouShallNotPass.html 旁边还有第二个 web.config。我希望这允许任何人访问此页面,无论是否经过身份验证:
<configuration>
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</configuration>
我可以通过将 AD 组设置为不存在的组来测试这一点。我不属于不存在的组,所以我应该期待看到YouShallNotPass.html 页面。
它没有按预期工作。我的浏览器出现以下错误:
错误消息 401.2.:未经授权:由于服务器配置,登录失败。根据您提供的凭据和 Web 服务器上启用的身份验证方法,验证您是否有权查看此目录或页面。
如果我直接请求YouShallNotPass.html,我可以在提示输入用户/密码后访问它。
我做错了什么?用户未授权时为什么不提供401页面?
【问题讨论】:
-
尝试在您的
YouShallNotPass.html的web.config 中插入<authentication mode="None" />,看看会发生什么。由于浏览器仍在提示用户/通过,这意味着该页面仍需要 Windows 身份验证(因为您将其放在主 web.config 中并且没有覆盖它)。 -
当我直接请求
YouShallNotPass.html时,它不再要求用户/通行证。但任何其他页面,我仍然得到原来的错误。 -
您的访问池用户是否可能无权访问您正在对其进行身份验证的数据库?
-
身份验证工作正常,我没有针对数据库进行身份验证。
标签: c# asp.net asp.net-mvc web-config authorization