我有一个包含 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
标头。如果他们以正确格式的 HTTPAuthorization
响应进行响应,它将允许他们进入。
问题是 WebForms 在低级别覆盖了它 - 如果您返回 401(未经授权),它会用 302(重定向到登录页面)覆盖它。这在浏览器中很好,但对 REST 服务无用。
我想关闭 web.config 中的身份验证设置,覆盖“rest”文件夹:
<location path="rest">
<system.web>
<authentication mode="None" />
<authorization><allow users="?" /></authorization>
</system.web>
</location>
授权位工作正常,但身份验证行 ( <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 服务添加到应用程序的唯一方法似乎很荒谬。
我不能添加额外的应用程序或虚拟目录 - 它必须作为一个应用程序。