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

  • 相关阅读:
    .net core webapi发布到linux中
    封装EF,使用仓储模式所遇到的问题
    oracle取分组的前N条数据
    20141124
    搭建discuz论坛(2)
    安装apache mysql 论坛(一)
    L13 DNS
    L10 PUtty+SSH 访问vncviewer
    L12 samba服务器搭建
    L10 数据入站、转发、出站流程
  • 原文地址:https://www.cnblogs.com/wangchuang/p/4488272.html
Copyright © 2020-2023  润新知