4

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

通过身份验证在 ASPNET MVC 中提供 iCalendar 文件

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

谢谢,埃里克

4

5 回答 5

5

呵呵,答案在于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

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

于 2012-10-24T03:52:15.220 回答
3
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM

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

于 2012-10-24T06:22:10.970 回答
1

简单的方法 :

如果您希望从每个新创建的域中删除此“ 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:如果要删除任何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

于 2017-02-13T12:09:24.340 回答
0

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

消息处理程序将继承自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 上的链接文章以获得更多说明

于 2019-04-29T15:28:44.913 回答
0

我有同样的问题。

响应包括 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
于 2020-04-29T00:36:18.193 回答