【问题标题】:How to remove unwanted WWW-Authenticate headers如何删除不需要的 WWW-Authenticate 标头
【发布时间】:2012-10-12 23:25:55
【问题描述】:

从一个 MVC 应用程序,我正在采购一个 iCal 订阅,并按照这个 SO 问题的答案进行身份验证:

Serving an iCalendar file in ASPNET MVC with authentication

iCal 流是使用 DDay.iCal 库从数据库中的事件动态创建的。

此解决方案在本地开发服务器上运行良好:OSX 日历和 Outlook 都可以订阅和接收来自应用程序的更新。

但是,在我的 Web 主机的共享服务器上,日历和 Outlook 的身份验证都失败了。也就是说,在(正确的)失败后,他们都一直要求我输入用户名和密码。

编辑:如果我将浏览器指向日历 URL,它也会无法通过身份验证。

编辑:越来越奇怪——Firefox 验证并获取 iCal 文件。 Safari、Chrome 和 IE 验证失败。

如果我使用相同的凭据将 curl 指向日历 URL,我就成功了(即我得到了所需的 iCal 文件)。当然,同样的凭据也可用于登录 MVC 应用程序。

编辑——我想我知道发生了什么,但我不知道如何解决它。在我的OnAuthorization() 中,我只添加了WWW-Authentication Basic,但使用 Fiddler 我可以看到提供了三种类型的身份验证:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Secure Calendar"
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
... etc ...

此时只有 Firefox 响应基本授权,成功。

GET <<URL>> HTTP/1.1
...
Authorization: Basic <<encoded credentials>>

IE 以 Negotiate 响应,但失败

GET <<URL>> HTTP/1.1
...
Authorization Negotiate <<encoded stuff>>

谁在添加另外两个,我怎样才能让它停止?以下是来自服务器响应的更多详细信息:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
WWW-Authenticate: Basic realm="Secure Calendar"
X-AspNet-Version: 4.0.30319
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
X-Powered-By-Plesk: PleskWin
Date: Tue, 23 Oct 2012 13:27:48 GMT

谢谢, 埃里克

【问题讨论】:

    标签: asp.net-mvc-3 iis-7 icalendar plesk


    【解决方案1】:

    呵呵,答案在于IIS配置。

    我要求主机的管理员关闭其他身份验证,这会破坏除 iCal 提要之外的所有内容。

    现在他们又重新打开了一对,MVC 网站和带有身份验证的日历提要一样工作......哇!非常非常灿烂的笑容。

    这是我们最终得到的 IIS 配置:

    Name                        Status         Response Type
    Anonymous Authentication    Enabled
    ASP.NET Impersonation       Disabled
    Basic Authentication        Disabled       HTTP 401 Challenge
    Digest Authentication       Disabled       HTTP 401 Challenge
    Forms Authentication        Enabled        HTTP 302 Login/Redirect
    Windows Authentication      Enabled        HTTP 401 Challenge
    

    我不确定为什么这行得通——或者还有什么可能会破坏——但今天我很高兴。

    【讨论】:

      【解决方案2】:
      WWW-Authenticate: Negotiate
      WWW-Authenticate: NTLM
      

      由 Windows 身份验证使用。由于您最终启用了匿名身份验证,因此所有WWW-Authenticate 标头都不会出现。

      【讨论】:

        【解决方案3】:

        简单的方法:

        如果您希望从每个新创建的域中删除此“X-Powered-By-Plesk”标头,您可以在其中创建一个默认的 web.config 文件“默认主机模板”的“httpdocs”文件夹。

        此默认网站模板通常位于:“C:\inetpub\vhosts.skel\0\httpdocs”下。 当您创建新网站时,将默认使用该 web.config 文件。

        <?xml version="1.0" encoding="UTF-8"?>
          <configuration>
            <system.webServer>
              <httpProtocol>
                <customHeaders>
                  <remove name="X-Powered-By-Plesk" />
                </customHeaders>
              </httpProtocol>
            </system.webServer>
          </configuration>
        

        提示 1:您可以使用此方法删除任何不需要的 自定义标头(以免向坏人透露太多有关您的服务器的信息):

        <remove name="X-Powered-By"/>
        <remove name="X-Powered-By-Plesk"/>
        <remove name="X-AspNet-Version"/>
        <remove name="X-AspNetMvc-Version"/>
        

        提示 2:如果您想删除任何 Dynamic 标头(如著名的 "Server" 标头),则需要使用 outboundRules强>:

          <configuration>
            <system.webServer>
              <rewrite>
                <outboundRules>
                  <rule name="StripHeader_Server" patternSyntax="Wildcard">
                    <match serverVariable="RESPONSE_SERVER" pattern="*"/>
                    <action type="Rewrite" value=""></action>
                  </rule>
                  <rule name="StripHeader_ETag">
                    <match serverVariable="RESPONSE_ETag" pattern=".+" />
                    <action type="Rewrite" value="" />
                  </rule>
                </outboundRules>
              </rewrite>
            </system.webServer>
          </configuration>
        

        提示 3:此外,您可以使用此默认 web.config 文件来设置您希望用于每个新网站的所有配置参数(例如:为您的网站定义默认文档列表)网站,如本 Plesk 帮助文章中所述:https://support.plesk.com/hc/en-us/articles/213364049-How-to-configure-global-default-document-settings-in-Parallels-Plesk)

        【讨论】:

          【解决方案4】:

          作为对此的迟来的回答,您还可以通过创建自定义消息处理程序来处理此问题。

          消息处理程序将从DelegatingHandler 继承,并且必须添加到HttpConfigurationMessageHandlers

          这可能看起来如下:

          public class EnsureNoAuthenticationHeaderHandler : DelegatingHandler 
          {
              async protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken ) 
              {
                  var response = await base.SendAsync( request, cancellationToken );
                  if ( response.StatusCode == System.Net.HttpStatusCode.Unauthorized ) 
                  {
                      response.Headers.Remove( "WWW-Authenticate" );
                  }
                  return response;
              }
          }
          

          然后在 HttpConfiguration 中注册,有点像下面

          private void Register( HttpConfiguration configuration ) 
          {
              configuration.MessageHandlers.Add( new EnsureNoAuthenticationHeaderHandler() );
          }
          

          您可能会从全局配置中调用它。消息处理程序也可以直接附加到路由,因此如果您不希望它在任何地方都可用,只需查看 MSDN 上的 linked article 以获得更多说明

          【讨论】:

            【解决方案5】:

            我遇到了同样的问题。

            响应包括 3 个 WWW-Authenticate 标头,只有 Firefox 正常工作。 Chrome、Bing 和 IE 提示输入用户名和密码,但之后它们没有将 Authenticate Header 发送到服务器。

            我刚刚更改了 IIS 身份验证设置并解决了:

            Anonymous Authentication  Enabled
            ASP.NET Impersonation     Disabled
            Basic Authentication      Disabled          HTTP 401 Challenge
            Forms Authentication      Disabled          HTTP 302 Login/Redirect
            Windows Authentication    Disabled          HTTP 401 Challenge
            

            【讨论】:

              猜你喜欢
              • 2018-10-19
              • 1970-01-01
              • 2016-06-02
              • 1970-01-01
              • 2016-03-21
              • 1970-01-01
              • 2021-06-07
              • 1970-01-01
              • 2022-08-12
              相关资源
              最近更新 更多