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. 如何把scratch转成一个swf文件或者exe执行文件

    scratch作为一款启蒙用的积木式编程软件,非常受人欢迎,但是,现在有一个问题就是,无法将之转变成一个可执行文件,以便和周边的人们分享. 我个人认为把scratch转变为一个可执行的exe文件,并不 ...

  2. 代码二次封装-xUtils(android)

    通常我们会引用很多lib 而且会出现lib 与我们的功能仅仅差一点点 这种情况我们最好不要去改动源代码 而是进行二次封装 举例我使用 xUtils的二次封装 此处说明我是搞ios的 这个是androi ...

  3. (一)jQuery EasyUI 的EasyLoader载入原理

    1.第一次看了官网的demo.引用的是EasyLoader.js文件,而不是引用jquery.easyui.min.js文件,我就有疑问了,百度一下. jQuery EasyUI是一款基于JQuery ...

  4. Azure Redis

    https://azure.microsoft.com/en-us/blog/mvc-movie-app-with-azure-redis-cache-in-15-minutes/ https://a ...

  5. angular学习笔记(十六) -- 过滤器(1)

    本篇主要介绍过滤器的基本用法: 过滤器用来对数据进行格式的转换,数据格式的转化与逻辑无关,因此,我们使用过滤器来进行这些操作: {{... | filter2: 参数1,参数2... }} expre ...

  6. Xcode真机调试iOS10中Nslog 打印不出东西

    Xcode真机调试iOS10中Nslog 打印不出东西 解决方案 通过以下途径找到 Product->Scheme->EditScheme ios9以前的 如果不加 1 的那句 在xcod ...

  7. js+php实现文件上传显示文件上传进度条的插件

    文件上传利器SWFUpload使用指南(swfupload官网) 上传文件显示进度条效果的插件swfupload.js

  8. 过滤4字节及以上的字符c++实现

    这个是根据php的一个版本改的,用来处理utf-8编码的多字节字符,比如中文,俄文等等. #include <iostream> #include <string> int s ...

  9. js JSON对象与字符串相互转换

    从服务器接收到数据一般是字符串的形式.如果是JSON格式的字符串,就需要先将其转换成JSON对象.JSON对象在浏览器输出为objcet,我们看不到具体的数据.所以将JSON对象转换成字符串. 下面将 ...

  10. 1U是什么意思

    U(unit的缩写)是服务器尺寸的单位规定的尺寸是服务器的宽度和高度,48.26cm=19英寸,高度4.445cm的倍数. 所谓“1U的PC服务器”,就是外形满足EIA规格.厚度为4.445cm的产品 ...