5

我有一个ASP.NET MVC应用程序,我尝试使用自定义基本身份验证(他们通过我自己的数据库进行身份验证)尝试保护一些RESTful服务。我通过编写HTTPModule实现了这一点。自定义基本身份验证在IIS7中失败

我已经一种方法附接到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标头。

任何想法?

回答

2

我想通了。问题在于我将这个模块命名为“BasicAuthenticationModule”,它与IIS内置的另一个模块冲突。一旦我将模块重命名,事情就可以正常工作了!