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

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

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

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

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

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

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

最新文章

  1. C# Mvc异常处理过滤器
  2. Androidstudio的快捷键
  3. Lake Counting_深度搜索_递归
  4. 【转】Docker 常用命令
  5. 2.2 编程之美--不要被阶乘吓到[zero count of N factorial]
  6. PL/SQL Developer 显示中文乱码问题
  7. 笔记本_thinkpad_e40_FN
  8. python_如何对实例属性进行类型检查?
  9. CSS属性操作/下
  10. PTA 邻接表存储图的广度优先遍历(20 分)
  11. Vue.js 学习笔记 第3章 计算属性
  12. scala的多种集合的使用(3)之遍历集合的方法
  13. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)
  14. laravel5单元测试
  15. 21.Odoo产品分析 (三) – 人力资源板块(2) – 工时表(1)
  16. js函数中写默认值的几种方式(常见的)
  17. 一条SQL语句获取具有父子关系的分类列表(mysql)
  18. HBase二级索引与Join
  19. gith命令行使用之上传和删除
  20. Syncthing源码解析 - 源码目录说明!

热门文章

  1. 使用Git代替FTP进行虚拟主机的代码管理
  2. java 从网络Url中下载文件
  3. Java构造和解析Json数据的两种方法详解一——json-lib
  4. [Linux] Linux命令之pstree - 以树状图显示进程间的关系
  5. 使用weinre调试手机页面
  6. 在MySQL中使用子查询和标量子查询的基本用法
  7. Eclipse通过Spket增加JQuery提示的方法
  8. windows 服务器不能使用剪贴板解决办法
  9. Java实现文件MD5加密
  10. JMS之——ActiveMQ高可用+负载均衡集群