我有一个 ASP.NET MVC 应用程序,其中包含一些 RESTful 服务,我正在尝试使用自定义基本身份验证来保护这些服务(它们是针对我自己的数据库进行身份验证的)。我通过编写 HTTPModule 实现了这一点。
我有一个附加到 HttpApplication.AuthenticateRequest 事件的方法,它在身份验证失败的情况下调用此方法:
private static void RejectWith401(HttpApplication app)
{
app.Response.StatusCode = 401;
app.Response.StatusDescription = "Access Denied";
app.CompleteRequest();
}
此方法附加到 HttpApplication.EndRequest 事件:
public void OnEndRequest(object source, EventArgs eventArgs)
{
var app = (HttpApplication) source;
if (app.Response.StatusCode == 401)
{
string val = String.Format("Basic Realm=\"{0}\"", "MyCustomBasicAuthentication");
app.Response.AppendHeader("WWW-Authenticate", val);
}
}
此代码添加了“WWW-Authenticate”标头,告诉浏览器抛出登录对话框。当我使用 Visual Studio 的 Web 服务器进行本地调试时,这非常有效。但是当我在 IIS7 中运行它时它失败了。
对于 IIS7,我将所有内置身份验证模块都关闭了,匿名除外。它仍然返回 HTTP 401 响应,但似乎正在删除 WWW-Authenticate 标头。
有任何想法吗?