自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点
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站点的更多相关文章
- Spring Filter过滤器,Spring拦截未登录用户权限限制
转载自:http://pouyang.iteye.com/blog/695429 实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面. 比较好的做法是不管什 ...
- Android定位&地图&导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡
一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二. ...
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...
- c# 定时关闭 MessageBox 或弹出的模态窗口
我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...
- AOPR弹出Order Now窗口怎么办
当我们忘记了我们自己设置的office密码的时候,需要一款office密码破解软件来帮我们破解,Advanced Office Password Recovery就是这样的一款软件,其简称AOPR.试 ...
- Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹
Delphi 弹出Windows风格的选择文件夹对话框, 还可以新建文件夹 unit Unit2; interface uses Windows, Messages, SysUtils, V ...
- QT QDialog如何弹出一个子窗口
1. 假设已有一个QDialog的父窗口, 想弹出的子窗口为自己实现的myDialog : QDialog. myDialog 设计和平常的QDialog一样, childDialog : publi ...
- [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作
public void clickReportIcon(){ String initialWindowHandle = driver.getWindowHandle(); //保存原始的浏览器窗口 p ...
- PyQt(Python+Qt)学习随笔:在一个窗口点击按钮弹出另一个窗口的实现方法及注意事项
在Qt Designer中定义了两个窗口,一个主窗口一个弹出窗口,需要实现在主窗口点击一个按钮时弹出弹出窗口. 经老猿验证: 1.弹窗的窗口类型无特殊要求,只要是QWidget等窗口部件就可以,也可以 ...
随机推荐
- vim利用插件管理工具-管理配置文件
目前被广泛应用的2各插件管理工具Pathogen和Vunble,我先说Pathogen Pathogen Pathogen完全用vim脚本编写,不用其他的代码(Vunble就用了python),所以安 ...
- 用Visual Studio Code写Node和调试代码
介绍 vsc的宣传语是: 一个运行于 Mac OS X.Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器. 按它说的,vsc特别适合来作为前端开发编辑器. 内 ...
- 如何在 Ubuntu 和 CentOS 上启用 Nginx 的 HTTP/2 协议支持
HTTP/2 是 HTTP 网络协议的主要修订版本,其专注于 HTTP 协议的性能改进.HTTP/2 协议的目标是减少延迟,并且允许在 Web 浏览器和服务器之间的一个连接上并行发起多个请求,因此 W ...
- C++11 long long使用及输出
相比于C++98标准,C++11整型的最大改变就是多了 long long.分为两种:long long 和unsigned long long.在C++11中,标准要求long long 整型可以在 ...
- ny36 最长公共子序列
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- c++之—— lambda表达式(有个未能解决的问题等待大佬解答)——(在stack overflow找到了答案)
谓词: 谓词是一个可调用的表达式,其返回结果是一个能用作条件的值.标准库算法所使用的谓词分为两类:一元谓词,意味着它只接受单一参数:二元谓词,意味着它有两个参数.接受谓词参数的算法对输入序列中的元素调 ...
- redis未授权
redis描述: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...
- thymeleaf 的hello world
在研究一个模板引擎,选了这个thymeleaf .中间遇到很多的问题.现在在这里记录一下. 第一步:导入jar包.这里使用maven导入jar包 <!-- thymeleaf 核心包 begin ...
- 在centos中安装mangodb
1.下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_6 ...
- win8.1 win10存储设备和驱动器分开显示
win10同理如下: Windows 8.1不仅将资源管理器重命名为文件管理器,还将用户熟悉的“计算机/我的电脑”改名为“这台电脑”,同时还将原先的布局进行了重构,于是用户最终看到的是这样一个界面: ...