我有一个 Web 服务需要在请求中出现 BASIC 身份验证标头,否则该服务将返回 HTTP 401(未经授权)。这有效 - 当挑战回来时,浏览器(在本例中为 Chrome)会弹出并询问凭据。然后将它们保存以供将来请求。
我的问题是,现在对服务的每个后续请求都发出两个请求 - 一个没有身份验证(收到 401),然后浏览器立即在标头中回复正确的身份验证。
有没有办法强制浏览器(可能通过特殊的标头)提供凭据,而不必每次都被 Web 服务明确询问?
我有一个 Web 服务需要在请求中出现 BASIC 身份验证标头,否则该服务将返回 HTTP 401(未经授权)。这有效 - 当挑战回来时,浏览器(在本例中为 Chrome)会弹出并询问凭据。然后将它们保存以供将来请求。
我的问题是,现在对服务的每个后续请求都发出两个请求 - 一个没有身份验证(收到 401),然后浏览器立即在标头中回复正确的身份验证。
有没有办法强制浏览器(可能通过特殊的标头)提供凭据,而不必每次都被 Web 服务明确询问?
我不相信强制浏览器抢占 401 是可能的。当对您的服务提出请求时,服务会以 HTTP 401 响应并添加 WWW-Authenticate Basic 标头以及我猜的领域(您可以定义)。
有必要看一下基本身份验证的 RFC,其中详细介绍了如何实施基本身份验证标准。 http://www.ietf.org/rfc/rfc2617.txt
您还可以考虑实现自己的 HTTP 模块,它应该为您的应用程序提供更大的灵活性以及如何处理基本身份验证。这允许您为 Authenticate 和 End Request 事件注册事件处理程序,并更清楚地指示您的服务将如何处理基本身份验证。asp.net 网站上提供了这方面的入门指南。 http://www.asp.net/web-api/overview/security/basic-authentication
如果您的服务根据您的应用程序身份验证使用不同的身份验证(例如,当应用程序配置为表单身份验证时,该服务将仅使用基本身份验证)而不是使用 HTTP 模块将允许您有条件地使用基本身份验证。我通常在这种情况下注册我的处理程序,如下所示:
AuthenticationSection config = (AuthenticationSection)WebConfigurationManager.GetSection("system.web/authentication");
if(config.Mode == AuthenticationMode.Forms)
{
module.Authenticate += OnEnter;
context.EndRequest += OnLeave;
}