【发布时间】:2011-06-04 17:31:20
【问题描述】:
我有一个包含 WebForms 和 MVC 页面的大型企业应用程序。它具有我不想更改的现有身份验证和授权设置。
WebForms 身份验证在 web.config 中配置:
<authentication mode="Forms">
<forms blah... blah... blah />
</authentication>
<authorization>
<deny users="?" />
</authorization>
到目前为止相当标准。我有一个 REST 服务,它是这个大型应用程序的一部分,我想对这个服务使用 HTTP 身份验证。
因此,当用户尝试从 REST 服务获取 JSON 数据时,它会返回 HTTP 401 状态和 WWW-Authenticate 标头。如果他们以正确格式的 HTTP Authorization 响应进行响应,它将允许他们进入。
问题是 WebForms 在低级别覆盖了这个 - 如果你返回 401(未经授权),它会用 302(重定向到登录页面)覆盖它。这在浏览器中很好,但对 REST 服务无用。
我想关闭 web.config 中的身份验证设置,覆盖“rest”文件夹:
<location path="rest">
<system.web>
<authentication mode="None" />
<authorization><allow users="?" /></authorization>
</system.web>
</location>
authorisation 位工作正常,但 authentication 行 (<authentication mode="None" />) 会导致异常:
在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的部分是错误的。
我在应用程序级别配置它 - 它位于根 web.config 中 - 并且该错误是针对子目录中的 web.configs 的。
如何覆盖身份验证,以便站点的所有其余部分都使用 WebForms 身份验证,而这个目录不使用?
这类似于另一个问题:401 response code for json requests with ASP.NET MVC,但我不是在寻找相同的解决方案 - 我不想只是删除 WebForms 身份验证并在全球范围内添加新的自定义代码,风险和工作量都很大涉及。我只想更改配置中的一个目录。
更新
我想设置一个 Web 应用程序,并且我希望所有 WebForms 页面和 MVC 视图都使用 WebForms 身份验证。我希望一个目录使用基本的 HTTP 身份验证。
请注意,我说的是身份验证,而不是授权。我希望 REST 调用在 HTTP 标头中带有用户名和密码,并且我希望 WebForm 和 MVC 页面带有来自 .Net 的身份验证 cookie - 在任何一种情况下,授权都是针对我们的数据库进行的。
我不想重写 WebForms 身份验证并滚动我自己的 cookie - 将 HTTP 授权的 REST 服务添加到应用程序的唯一方法似乎很荒谬。
我无法添加额外的应用程序或虚拟目录 - 它必须作为一个应用程序。
【问题讨论】:
-
嗨 Keith - 我遇到了类似的问题,并在下面使用了您的部分解决方案。您会推荐一种不同的回顾方法吗?我的情况:stackoverflow.com/questions/27785561/…
标签: asp.net http authentication web-config http-status-code-401