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. 【Android】6.4 DatePickerDialog和TimePickerDialog

    分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 在Android应用中,日期选择对话框和时间选择对话框是分别提供的. 日期选择对话框(DatePickerDial ...

  2. 特效effects(二)

    CCActionInterval* createEffect(int nIndex, float t) { CCDirector::sharedDirector()->setDepthTest( ...

  3. linux命令(26):Bash Shell 获取进程 PID

    转载地址:http://weyo.me/pages/techs/linux-get-pid/ 根据pid,kill该进程:http://www.cnblogs.com/lovychen/p/54113 ...

  4. centos7 nginx安装 及MySQL-python

    1.pip install MySQL-python 出错问题 pip install -r requirement.txt 发现安装MySQL-python 出错,更新setuptools也没用 解 ...

  5. Java – Convert IP address to Decimal Number

    In this tutorial, we show you how to convert an IP address to its decimal equivalent in Java, and vi ...

  6. bash deploy.sh 通过bash命令 执行scp -r 命令将本地文件拷贝到服务器

    deploy.sh 文件内容如下 #!/bin/bash #scp -r ./* root@XXXXX:/root/sunSH/xadserver/ function getdir(){ for el ...

  7. weblogic检查项

    日常维护中,weblogic检查的几个项: 1.JVM: 如最大堆内存.最小堆内存. 2.GC回收: 查看jvm空闲内存变化情况,每次GC的回收情况:控制台可以强制垃圾回收,看看回收内存是否太小,如果 ...

  8. shadowshocks下载地址

    https://github.com/shadowsocks/shadowsocks-windows/releases

  9. hdu26道动态规划总结

    前言:我们队的dp一直是我在做,说不上做的很顺,有些可以做,有些不能做.到现在为止,做dp题目也有七八十道了,除了背包问题的题目我可以说有百分之七八十的把握ac的话,其他类型的dp,还真没有多大把握. ...

  10. ajax的datatype选项的值

    jquery ajax方法 1."xml":返回 XML 文档,可用 jQuery 处理. 2."html"::返回纯文本 HTML 信息:包含的 script ...