5

我有一个 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 标头。

有任何想法吗?

4

2 回答 2

2

我想到了。问题是我将此模块命名为“BasicAuthenticationModule”,它与 IIS 内置的另一个模块冲突。一旦我重命名了模块,一切就正常了!

于 2010-04-18T22:08:16.723 回答
1

即使你让它工作了,这也是需要考虑的事情:

http://wcfrestcontrib.codeplex.com/wikipage?title=Web%20Authentication%20Overview&referringTitle=Home

于 2010-04-19T06:55:15.557 回答