zoukankan      html  css  js  c++  java
  • C#实现的自定义IIS认证模块 转载

    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, 客户端就弹出认证框开始认证用户了。

    [csharp] view plaincopy
     
    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提供了非常方便的扩展功能,在处理一些特殊情况上仍可以做到游刃有余。

  • 相关阅读:
    GridControl 选择列、复选框全选(上)
    iOS开发隐藏键盘方法总结
    Leetcode:remove_duplicates_from_sorted_list
    新版的Spring4X怎样下载
    leetcode 242: Valid Anagram
    最简单的基于FFMPEG的Helloworld程序
    电子商务系统的设计与实现(十):DWZ框架与第三方分页组件整合
    电子商务系统的设计与实现(十):DWZ框架与第三方分页组件整合
    电子商务系统的设计与实现(九):后端管理系统功能细化
    电子商务系统的设计与实现(九):后端管理系统功能细化
  • 原文地址:https://www.cnblogs.com/wangchuang/p/4488272.html
Copyright © 2011-2022 走看看