如何删除不需要的WWW-Authenticate标头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何删除不需要的WWW-Authenticate标头相关的知识,希望对你有一定的参考价值。
从一个MVC应用程序,我正在根据这个SO问题的答案采购带有身份验证的iCal订阅:
Serving an iCalendar file in ASPNET MVC with authentication
使用DDay.iCal库从数据库中的事件动态创建iCal流。
此解决方案在本地开发服务器上运行良好:OSX日历和Outlook都可以订阅并从应用程序接收更新。
但是,在我的Web主机的共享服务器上,日历和Outlook的身份验证都失败。也就是说,在(正确的)失败后,他们都不断向我询问用户和密码。
编辑:如果我将浏览器指向日历URL,它也会失败身份验证。
编辑:获取weirder-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
谢谢,埃里克
哈哈,答案在于IIS配置。
我让我主人的管理员关闭了其他身份验证,除了iCal Feed之外,还打破了其他所有身份验证。
现在他们又重新开启了一对,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
我不确定为什么会这样 - 或者还有什么可能会破坏 - 但今天我很高兴。
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
由Windows身份验证使用。由于您最终启用了匿名身份验证,因此不会显示所有WWW-Authenticate
标头。
简单的方法 :
如果您希望从每个新创建的域中删除此“X-Powered-By-Plesk”标头,则可以在“默认主机模板”的“httpdocs”文件夹中创建默认的web.config文件。
此默认网站模板通常位于:“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:如果要删除任何动态标头(如着名的“服务器”标头),则需要使用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)
作为对此的迟来的答案,您还可以通过创建自定义消息处理程序来处理此问题。
消息处理程序将继承自DelegatingHandler
并且必须添加到HttpConfiguration
其MessageHandlers
这看起来可能如下:
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以获取更多解释
以上是关于如何删除不需要的WWW-Authenticate标头的主要内容,如果未能解决你的问题,请参考以下文章
RESTful HTTP API 中的授权,401 WWW-Authenticate
使用passport-http Basic + passport-local组合时如何防止www-authenticate header
无法以角度访问 $http 响应中的“WWW-authenticate”标头