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

using System;
using System.Web;

namespace IISModules
{
    public class CustomAuthenticationModule : IHttpModule
    {
        public const string HttpNtlmSchemeName = "NTLM";
        public const int HttpNotAuthorizedStatusCode = 401;
        public const string HttpWWWAuthenticateHeader = "WWW-Authenticate";
        public const string HttpAuthUserVariable = "AUTH_USER";

        public void IssueAuthenticationChallenge(object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            //省略其他判断条件
            if (string.IsNullOrEmpty(context.Request.ServerVariables[HttpAuthUserVariable]))
            {
                context.Response.StatusCode = HttpNotAuthorizedStatusCode;
                context.Response.AddHeader(HttpWWWAuthenticateHeader, HttpNtlmSchemeName);
                context.Response.AddHeader("Powered By", "CustomAuthenticationModule");
            }
        }

        public void Init(HttpApplication context)
        {
            context.EndRequest += new EventHandler(this.IssueAuthenticationChallenge);
        }
        public void Dispose()
        {
        }
    }
}
这种极端的情况只是作为一个事例,但是这也说明了IIS提供了非常方便的扩展功能,在处理一些特殊情况上仍可以做到游刃有余。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值