C#实现的自定义IIS认证模块

IIS7以后application pool都支持两种模式:经典模式和集成模式。

所谓经典模式就是与IIS6的application pool运行模式相同,对于asp.net的页面请求处理由单独的asp.net filter完成。

集成模式是IIS7及以上的默认模式,对于各种请求的处理均在一条流水线上由不同的模块完成。

C#实现的自定义IIS认证模块

由于IIS7与.NET的完美结合使很多原本在IIS6中比较麻烦的事情变得简单。比如我们可以通过C#编写托管模块处理网站的所有请求,这在IIS6中需要通过非托管代码写ISAPI filter来完成。

最近就遇到一个小问题,网站因为某种原因需要同时启用匿名和windows集成认证,但是在特定情况下需要将匿名请求变成windows认证过的请求,于是就通过以下几行代码编译成一个IIS扩展dll模块,放在网站相应的bin目录下,然后到IIS Manager - Modules - Add Managed Module添加托管模块。在匿名请求进来的时候判断条件然后返回401 Authentication Challenge, 客户端就弹出认证框开始认证用户了。

 

[csharp]  view plain copy
 
  1. using System;  
  2. using System.Web;  
  3.   
  4. namespace IISModules  
  5. {  
  6.     public class CustomAuthenticationModule : IHttpModule  
  7.     {  
  8.         public const string HttpNtlmSchemeName = "NTLM";  
  9.         public const int HttpNotAuthorizedStatusCode = 401;  
  10.         public const string HttpWWWAuthenticateHeader = "WWW-Authenticate";  
  11.         public const string HttpAuthUserVariable = "AUTH_USER";  
  12.   
  13.         public void IssueAuthenticationChallenge(object source, EventArgs e)  
  14.         {  
  15.             HttpApplication application = (HttpApplication)source;  
  16.             HttpContext context = application.Context;  
  17.   
  18.             //省略其他判断条件  
  19.             if (string.IsNullOrEmpty(context.Request.ServerVariables[HttpAuthUserVariable]))  
  20.             {  
  21.                 context.Response.StatusCode = HttpNotAuthorizedStatusCode;  
  22.                 context.Response.AddHeader(HttpWWWAuthenticateHeader, HttpNtlmSchemeName);  
  23.                 context.Response.AddHeader("Powered By", "CustomAuthenticationModule");  
  24.             }  
  25.         }  
  26.   
  27.         public void Init(HttpApplication context)  
  28.         {  
  29.             context.EndRequest += new EventHandler(this.IssueAuthenticationChallenge);  
  30.         }  
  31.         public void Dispose()  
  32.         {  
  33.         }  
  34.     }  
  35. }  

这种极端的情况只是作为一个事例,但是这也说明了IIS提供了非常方便的扩展功能,在处理一些特殊情况上仍可以做到游刃有余。

你可能感兴趣的:(IIS)