实现基于 ASP.NET Forms 身份验证的跨子域单点登录
对于跨应用程序的 ASP.NET Forms 身份验证,相信大家应该都不陌生,几年前很多文章都介绍了如何实现,比如 MSDN 的 跨应用程序进行 Forms 身份验证,唐朝程序员 的 ASP.NET站点跨子域名单点登陆(SSO)的实现,dudu 的 关于二级域名Cookie的问题及解决方法。这个方案实际上利用了 cookie 可以跨子域共享,当前几乎所有主流器包括 IE6+/FF3/Opera9/Chrome 都支持此特性。但这些文章所介绍的都仅仅是“共享身份票据 cookie ”,而没有“共享登录中心”,也就是说,每个应用程序(站点)都具有自己的 login 实现,只是实现过程确保身份票据 cookie 具有相同的 domain 等属性。如此似乎没有实现完全意义上的 SSO,而且每个站点需要维护自己的登录验证代码,当然对于 跨应用程序进行 Forms 身份验证 提到的“网络场”这个问题不大,因为这些站点其实都是一份程序的副本而已。那么,假如我们希望实现像 Windows Live 一样只有一个统一的登录验证中心呢?比如我们规划了以下四个个站点:
http://www.ssolab01.leoworks.net | 主站站点 |
http://news.ssolab01.leoworks.net | 新闻频道 |
http://forum.ssolab01.leoworks.net | 论坛社区 |
http://passport.ssolab01.leoworks.net | 通行证中心 |
其中 http://passport.ssolab01.leoworks.net 作为通行证中心,只在该站点中的 http://passport.ssolab01.leoworks.net/login.aspx 实现登录验证逻辑。假如需要身份验证,其他站点则跳转这个站点进行验证,验证通过之后再跳转到原始请求连接。
大家肯定会觉得很简单,认为只要在子站点中的 web.config 将 forms 元素的 login 设置为 http://passport.ssolab01.leoworks.net/login.aspx 应就可以了,其实不然。没错,如果不用内置缺省 ASP.NET Forms 验证(通过 FormsAuthenticationModule),就像在 ASP/JSP/PHP 中,完全手动实现,逻辑上很清晰只是代码量问题。但是,一经 FormsAuthenticationModule 以及实用类 FormsAuthentication 包装与过滤,两个大问题就来了:
1. 支持重定向的 returnUrl 参数包含的是原始请求的相对路径,而不是包含站点主机的完整路径。这在同一个站点内没问题,但是跨站点的时候,登录成功就回不去了。
2. 当手动将 returnUrl 补上完整的主机路径,虽然登录成功,但竟然直接重定向到 http://passport.ssolab01.leoworks.net 。
搜索了半天终于发现解决方案:
对于问题2,比较容易,ASP.NET 2.0 已支持,只要在 forms 元素内设置 enableCrossAppRedirects="true" 。注意这只要在 passport 站点内设置即可,因为 passport 负责跳回原始请求。
passport 的 web.config
www 或 forum 的 web.config
对于问题1,需要手动检查用户是否有权限访问目标资源,如果没有重定向到 http://passport.ssolab01.leoworks.net/login.aspx 页面,并带上完整的原始请求地址作为 returnUrl 参数。检查的时机选择在 PostAuthenticateRequest 事件内。检查逻辑可使用 UrlAuthorizationModule.CheckUrlAccessForPrincipal 方法(注意 ASP.NET 2.0+ 支持)。可以单独写一个 HttpModule 或者直接放入 Global.asax 中。注意这只要在子站点中实现,passport 站点不需要,因为 passport 是站内跳转。
<%@ Application Language="C#" %>
附件是完整的测试示例,注意使用说明:
1. 建立 IIS 网站
在 IIS 中建立三个网站,主机头分别设为:
http://www.ssolab01.leoworks.net
http://forum.ssolab01.leoworks.net
http://passport.ssolab01.leoworks.net
目录分别指向:
Central
Forum
Passport
2. 解析 DNS
用记事本打开 C:\Windows\System32\drivers\etc\hosts 文件
添加三条记录
127.0.0.1 passport.ssolab01.leoworks.net
127.0.0.1 www.ssolab01.leoworks.net
127.0.0.1 forum.ssolab01.leoworks.net
本机使用 127.0.0.1 即可,若是局域网其他客户端的 hosts 则使用安装以上三网站的主机 IP 地址
下载
LeoLab.SSO.FormsAuthCrossSubdomain.zip (15.46 kb)
原文镜像:实现基于 ASP.NET Forms 身份验证的跨子域单点登录
实现基于 ASP.NET Forms 身份验证的跨子域单点登录相关推荐
- [转][.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证
在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数. 2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确. 2. 创建身份 ...
- asp.net Forms身份验证
Web.config中的配置 <system.web> <authentication mode="Forms"> <forms name=" ...
- ASP.NET Forms权限验证
安全性是 ASP.NET Web 应用程序中一个非常重要的方面.它涉及内容非常广泛,不能在一篇文章内说明所有的安全规范,本文讲述如何利用Forms 身份验证构建安全的 ASP.NET 应用程序,它是目 ...
- .NET Forms身份验证
.NET表单身份验证 ASP.NET Forms 身份验证的简单实现:1)在Web.config文件中配置应用程序使用 Forms 身份验证:2)创建登陆页面,将用户身份验证票证添加到Cookie集合 ...
- ASP.NET MVC 4 (十三) 基于表单的身份验证
在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...
- ASP.NET 完成基于表单的身份验证
实现:验证用户身份成功,并登陆后台Admin文件夹里的index.aspx后台管理首页面,否则禁止匿名用户访问项目中的Admin文件夹里的任何一个文件. 步骤一: 在根目录下的web.config ...
- 傻瓜教程:asp.net(c#) 如何配置authentication,完成基于表单的身份验证
傻瓜老师又来了,本讲座报以学以致用,师傅带进门 修行靠个人的精神,不深入探讨,还请多指教~ 这堂课将的是基于表单的身份验证,其实某些时候,用于验证身份的账户和密码并不需要存在数据库或配置文件里,这时 ...
- 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...
- Asp.Net MVC 身份验证-Forms
Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...
最新文章
- jvm八:接口初始化规则
- 【无标题】RestHighLevelClient工具类
- 解决docker报错: ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
- Spark官方调优文档翻译(转载)
- 四则运算2+psp0
- Oracle利用序列实现自动增长列
- 微软私有云解决方案_毕马威 AI 工厂携手微软云技术 | 共创人工智能发展,共建创新解决方案...
- ddr4服务器内存和普通内存_买主板送DDR4内存!微星日联合大促开幕
- 【报告分享】2021年中国新锐品牌增长潜力报告.pdf(附下载链接)
- 尴尬的风险管理如何深入下去-某公司为例
- 手机浏览器和pc浏览器下载文件方法
- Spring Framework灰度发布
- swiper 切换时间_改变Swiper切换和animate.js动画的时间曲线
- 飞秋在同一局域网内刷新不到好友
- Linux中的基础I/O
- DS1302时钟(电子钟)
- 问题:现有12个外形相同的小球,只有其中一个小球质量不同(不能确定较重还是较轻),请用天平找出是哪个小球不同,而且还要找出究竟是轻是重?条件:只能称三次
- Zabbix 监控之项目类型-Trapper
- 已解决At least Windows 8.1 or Windows Server 2012 are required to install Python 3.9.4(64-bit)
- 电商项目之收货地址理解
热门文章
- 大数据之-Hadoop源码编译_源码编译的意义---大数据之hadoop工作笔记0044
- 大数据之-Hadoop伪分布式_Log日志查看和NN格式化前强调---大数据之hadoop工作笔记0024
- Netty工作笔记0032---零拷贝AIO内容梳理
- 安卓异常总结---WARNING: Application does not specify an API level requirement!
- basler 相机使用出现的问题
- Bezier曲线扫盲
- poj2349:Arctic Network(最小生成树)
- 无人驾驶(pid算法)
- win32开发(鼠标)
- java复选框如何显示在文本雨_java – 在复选框的itemStatechanged事件上显示文本字段...