Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 IIS 7.5 Windows+;匿名身份验证间歇性工作_Asp.net Mvc 3_C# 4.0_Iis 7.5_Windows Authentication - Fatal编程技术网

Asp.net mvc 3 IIS 7.5 Windows+;匿名身份验证间歇性工作

Asp.net mvc 3 IIS 7.5 Windows+;匿名身份验证间歇性工作,asp.net-mvc-3,c#-4.0,iis-7.5,windows-authentication,Asp.net Mvc 3,C# 4.0,Iis 7.5,Windows Authentication,我有一个MVC 3站点,其中一些控制器/操作需要Windows身份验证,其他则不需要,即匿名 该网站运行了一段时间,我可以访问匿名操作和经过身份验证的操作(无需提示,凭据会在Chrome/IE/FireFox中自动传递),但是身份验证停止工作,我开始收到提示,要求提供从未被接受的凭据 我必须重新启动整个服务器,或者更改站点到另一个应用程序的物理路径,发出一个经过身份验证的请求,当返回到原始站点时,该请求可以工作。这种情况是然后冲洗和重复,但我找不到它的模式。如果我什么也不做,身份验证就会被破坏

我有一个MVC 3站点,其中一些控制器/操作需要Windows身份验证,其他则不需要,即匿名

该网站运行了一段时间,我可以访问匿名操作和经过身份验证的操作(无需提示,凭据会在Chrome/IE/FireFox中自动传递),但是身份验证停止工作,我开始收到提示,要求提供从未被接受的凭据

我必须重新启动整个服务器,或者更改站点到另一个应用程序的物理路径,发出一个经过身份验证的请求,当返回到原始站点时,该请求可以工作。这种情况是然后冲洗和重复,但我找不到它的模式。如果我什么也不做,身份验证就会被破坏

我将IIS 7.5配置如下:

应用程序池

  • .NET Framework版本-v4.0
  • 托管管道模式-集成
  • 应用程序池标识-ApplicationPoolIdentity
场地

  • 启用匿名身份验证
  • 匿名用户身份-IUSR[我相信这是默认设置]
  • ASP.NET模拟-已禁用
  • 表单身份验证-已禁用
  • Windows身份验证-已启用
  • Windows身份验证扩展保护-关闭
  • Windows身份验证启用内核模式身份验证-打开
  • Windows身份验证提供程序-协商,NTLM
控制器

// Anonymous Controller
    public class HomeController : Controller
    {
       public ActionResult Index()
       {
          return this.View();
       }
    }

// Authenticated Controller
    [Authorize]
    public class AnotherController : Controller
    {
       public ActionResult Index()
       {
          var viewModel = // create view model;
          return this.View(viewModel);
       }
    }
在任何时候,无论身份验证是否有效,GET-to/home/index都会返回200。一如所料。 身份验证工作时,对/other/索引的GET请求如下所示:

> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Header: WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==

 > GET /another/index
   Request Headers: Authorization: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==
   Response: 200
> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate
当身份验证中断对/other/索引的GET请求时,如下所示:

> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Header: WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==

 > GET /another/index
   Request Headers: Authorization: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==
   Response: 200
> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate
此时,系统会提示我输入凭据,并重新发送相同的请求和响应:

> GET /another/index
      Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
      Response: 401
      Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate
有人知道我是否有配置错误的东西(我很确定我没有或根本不希望它工作),为什么身份验证会中断,或者我如何阻止它


非常感谢大家。

所以这是由于web.config的httpErrors部分使用不当造成的

<httpErrors errorMode="Custom">
      <remove statusCode="401" subStatusCode="-1"/>
      <error statusCode="401" path="/Unauthorized" responseMode="ExecuteURL"/>
      <remove statusCode="403" subStatusCode="-1"/>
      <error statusCode="403" path="/Unauthorized" responseMode="ExecuteURL"/>
      <remove statusCode="404" subStatusCode="-1"/>
      <error statusCode="404" path="/NotFound" responseMode="ExecuteURL"/>
      <remove statusCode="500" subStatusCode="-1"/>
      <error statusCode="500" path="/ServerError" responseMode="ExecuteURL"/>
    </httpErrors>

这导致NTLM要求在需要身份验证时重新提交未从服务器发送的凭据。i、 e.应该发生什么请求、质询(请重新提交凭据)响应。实际上发生了什么请求、响应。挑战从未发出

正确的方法是完全删除此部分,在我的错误中,控制器操作使用扩展方法