Asp.net mvc 3 IIS 7.5 Windows+;匿名身份验证间歇性工作
我有一个MVC 3站点,其中一些控制器/操作需要Windows身份验证,其他则不需要,即匿名 该网站运行了一段时间,我可以访问匿名操作和经过身份验证的操作(无需提示,凭据会在Chrome/IE/FireFox中自动传递),但是身份验证停止工作,我开始收到提示,要求提供从未被接受的凭据 我必须重新启动整个服务器,或者更改站点到另一个应用程序的物理路径,发出一个经过身份验证的请求,当返回到原始站点时,该请求可以工作。这种情况是然后冲洗和重复,但我找不到它的模式。如果我什么也不做,身份验证就会被破坏 我将IIS 7.5配置如下: 应用程序池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中自动传递),但是身份验证停止工作,我开始收到提示,要求提供从未被接受的凭据 我必须重新启动整个服务器,或者更改站点到另一个应用程序的物理路径,发出一个经过身份验证的请求,当返回到原始站点时,该请求可以工作。这种情况是然后冲洗和重复,但我找不到它的模式。如果我什么也不做,身份验证就会被破坏
- .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.应该发生什么请求、质询(请重新提交凭据)响应。实际上发生了什么请求、响应。挑战从未发出
正确的方法是完全删除此部分,在我的错误中,控制器操作使用扩展方法