IIS身份验证。同时具有匿名和Windows身份验证会导致额外的标头

时间:2011-09-14 20:37:04

标签: iis authentication httpwebrequest anonymous

我正在尝试使用HttpWebRequest解决身份验证问题。

因此,我们有一个负载均衡的SOA解决方案。部分解决方案是必须对所有请求进行身份验证(使用Windows身份验证)。解决方案的另一部分是负载均衡器必须具有对保持活动页面的匿名访问权限。所以我们已经完成了适当的web.config部分,如下所示

<location path="hello.aspx" allowOverride="false">
  <system.web>
    <authorization>
      <allow users="?" />
    </authorization>
  </system.web>
</location>
<system.web>
  <authentication mode="Windows" />
  <authorization>
     <deny users="?" />
  </authorization>
  ...
</system.web>

我们正确设置了httpRequest,如下所示

httpRequest.UseDefaultCredentials = true;
httpRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);

所以这就是问题所在。仅启用集成身份验证时,一切都很有效。但是,当启用匿名和集成身份验证时(使用上面定义的web.config),我们会收到一个额外的标头回来

Cache-Control: private

这导致我们的客户关注。我们可以将CachePolicy设置为NoCacheNoStore但这并不理想,因为其他请求可以而且应该被缓存。设置clientCache DisableCache无效。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

从来没有找到解决方案,但无论如何,对于那些感兴趣的人来说,这是解决方法

public Foo ExecuteRequest(RequestCachePolicy cachePolicy, ...)
{
    return ExecuteRequest(new RequestCachePolicy(RequestCacheLevel.Default), ...);
}

private Foo ExecuteRequest(RequestCachePolicy cachePolicy, ...)
{
    ...
    try
    {
        ...
        // Make call using HttpWebRequest
        ...
    }
    catch (WebException ex)
    {
        var webResponse = ex.Response as HttpWebResponse;
        if ((ex.Status == WebExceptionStatus.ProtocolError) &&
            (null != webResponse) &&
            (webResponse.StatusCode == HttpStatusCode.Unauthorized) &&
            (cachePolicy.Level != RequestCacheLevel.NoCacheNoStore))
        {
            return ExecuteRequest(new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore), ...);
        }
        ...
    }
    ...
}