2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过。

 using System;
using System.Web; using System.Configuration;
using System.Web.Configuration;
using Microsoft.SharePoint;
using System.Net;
using System.Security.Principal; namespace WebApplication1.EventHandlers
{
/// <summary>
/// Windows认证下实现URL重定向,如:
/// 1、未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点;
/// 2、支持SharePoint匿名站点,暂时不支持文档库或列表库断开继承后匿名访问的情况
/// </summary>
public class SSORedirect : IHttpModule
{
public void Dispose()
{
//throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
} /// <summary>
/// 当ASP.NET 运行时准备验证用户身份的时候引发这个事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void context_AuthenticateRequest(object sender, EventArgs e)
{
try
{
// 忽略POSTBack的请求
HttpContext context = HttpContext.Current;
if (context == null || context.Request.HttpMethod.ToUpper() == "POST")
{
return;
} if (IsWindowsAuth())
{
string url = context.Request.Url.AbsolutePath.ToString().ToLower();//"/"
string fullUrl = context.Request.Url.OriginalString.ToString().ToLower();//"http://yxjt.contoso.com:80/" string strSSOUrl = "/Test/Default.aspx";//ConfigurationManager.AppSettings["SSOUrl"];
if (!string.IsNullOrEmpty(strSSOUrl))
{
if (url.IndexOf(strSSOUrl.ToLower()) == -)
{
if (!IsAnonymous(fullUrl))//是否为非匿名访问的页面
{
if (!context.Request.IsAuthenticated && IsValidUrl(url))//是否为未登录用户,并且是需验证的有效的地址
{
context.Response.Redirect(strSSOUrl);
}
}
}
}
}
}
catch (Exception ex)
{ }
} /// <summary>
/// 判断是否为Windows认证
/// </summary>
/// <returns>是否为Windows认证</returns>
private bool IsWindowsAuth()
{
Configuration c = WebConfigurationManager.OpenWebConfiguration("/web.config");
AuthenticationSection auth = (AuthenticationSection)c.GetSection("system.web/authentication");
return auth.Mode == AuthenticationMode.Windows;
} /// <summary>
/// 判断是否为允许匿名访问的站点
/// </summary>
/// <param name="requestFullUrl">请求的地址,例如"http://yxjt.contoso.com:80/"</param>
/// <returns>是否为允许匿名访问的站点</returns>
private bool IsAnonymous(string requestFullUrl)
{
bool isAnonymous = false;
requestFullUrl = requestFullUrl.Split(new char[] { '?' })[]; SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPSite site = new SPSite(requestFullUrl);//这里不要用using自动垃圾回收,否则抛异常
SPWeb web = site.OpenWeb();//关键写法
isAnonymous = web.AllowAnonymousAccess;
});
return isAnonymous;
} /// <summary>
/// 判断是否是有效的地址
/// </summary>
/// <param name="requestUrl">请求的地址,例如"/"</param>
/// <returns>是否是有效的地址</returns>
private bool IsValidUrl(string requestUrl)
{
bool isValidUrl = false;
requestUrl = requestUrl.Split(new char[] { '?' })[];
int index = requestUrl.LastIndexOf(".");
if (index != -)//是否包含.号
{
isValidUrl = requestUrl.EndsWith(".aspx");//是否以.aspx结尾的url
}
else
{
isValidUrl = true;
}
return isValidUrl;
}
}
}

自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点的更多相关文章

  1. Spring Filter过滤器,Spring拦截未登录用户权限限制

    转载自:http://pouyang.iteye.com/blog/695429 实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面.  比较好的做法是不管什 ...

  2. Android定位&地图&导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二. ...

  3. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法

    SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...

  4. c# 定时关闭 MessageBox 或弹出的模态窗口

    我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...

  5. AOPR弹出Order Now窗口怎么办

    当我们忘记了我们自己设置的office密码的时候,需要一款office密码破解软件来帮我们破解,Advanced Office Password Recovery就是这样的一款软件,其简称AOPR.试 ...

  6. Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹

    Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹     unit Unit2; interface uses  Windows, Messages, SysUtils, V ...

  7. QT QDialog如何弹出一个子窗口

    1. 假设已有一个QDialog的父窗口, 想弹出的子窗口为自己实现的myDialog : QDialog. myDialog 设计和平常的QDialog一样, childDialog : publi ...

  8. [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作

    public void clickReportIcon(){ String initialWindowHandle = driver.getWindowHandle(); //保存原始的浏览器窗口 p ...

  9. PyQt(Python+Qt)学习随笔:在一个窗口点击按钮弹出另一个窗口的实现方法及注意事项

    在Qt Designer中定义了两个窗口,一个主窗口一个弹出窗口,需要实现在主窗口点击一个按钮时弹出弹出窗口. 经老猿验证: 1.弹窗的窗口类型无特殊要求,只要是QWidget等窗口部件就可以,也可以 ...

随机推荐

  1. ThinkPHP CURD方法中field方法详解

    导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$M ...

  2. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  3. 在verilog中调用VHDL模块

    习惯了自己发现一些小问题,既然发现了,就记下来吧,不然又要忘了,这是多么悲痛的领悟. 今天在用vivado进行块设计时所生成的顶层模块居然是用VHDL语言描述的,这时郁闷了,表示只看过VHDL语法但没 ...

  4. java playframework

    刚学了java不久就让我们尝试架构,就选择了一个比較简单的架构 play framework直接上图 这里的执行环境是JDK1.7,我试了一下jdk1.8不行出问题了play使用的是play-1.2. ...

  5. MAC下cmake安装

    可以参考网上手动下载cmake的源码包进行安装,http://www.cmake.org/download/ 解压后运行sudo ./bootstrap && sudo make &a ...

  6. 用C++画光(三)——色散

    写在前面 源码:https://github.com/bajdcc/GameFramework/blob/master/CCGameFramework/base/pe2d/Render2DScene5 ...

  7. LeetCode: Multiply Strings 解题报告

    Multiply StringsGiven two numbers represented as strings, return multiplication of the numbers as a ...

  8. 【Java】ParseInt方法

    parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,该方法将返回NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的 测试.这一 ...

  9. awk打印指定列以后的所有内容

    (1)使用awk将文件的前12列替换为空 awk '{for(i=1;i<=12;i++)$i="";print $0}' localhost_access_log //写法 ...

  10. Makefile学习之路——4

    变量的类别有递归扩展变量和简单扩展变量.只用一个“=”符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. .PHONY: all foo=$(bar) bar=$(ugh) ugh ...