对于跨应用程序的 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 身份验证的跨子域单点登录相关推荐

  1. [转][.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

    在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数. 2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确. 2. 创建身份 ...

  2. asp.net Forms身份验证

    Web.config中的配置 <system.web> <authentication mode="Forms"> <forms name=" ...

  3. ASP.NET Forms权限验证

    安全性是 ASP.NET Web 应用程序中一个非常重要的方面.它涉及内容非常广泛,不能在一篇文章内说明所有的安全规范,本文讲述如何利用Forms 身份验证构建安全的 ASP.NET 应用程序,它是目 ...

  4. .NET Forms身份验证

    .NET表单身份验证 ASP.NET Forms 身份验证的简单实现:1)在Web.config文件中配置应用程序使用 Forms 身份验证:2)创建登陆页面,将用户身份验证票证添加到Cookie集合 ...

  5. ASP.NET MVC 4 (十三) 基于表单的身份验证

    在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...

  6. ASP.NET 完成基于表单的身份验证

    实现:验证用户身份成功,并登陆后台Admin文件夹里的index.aspx后台管理首页面,否则禁止匿名用户访问项目中的Admin文件夹里的任何一个文件.   步骤一: 在根目录下的web.config ...

  7. 傻瓜教程:asp.net(c#) 如何配置authentication,完成基于表单的身份验证

    傻瓜老师又来了,本讲座报以学以致用,师傅带进门 修行靠个人的精神,不深入探讨,还请多指教~ 这堂课将的是基于表单的身份验证,其实某些时候,用于验证身份的账户和密码并不需要存在数据库或配置文件里,这时 ...

  8. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...

  9. Asp.Net MVC 身份验证-Forms

    Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...

最新文章

  1. jvm八:接口初始化规则
  2. 【无标题】RestHighLevelClient工具类
  3. 解决docker报错: ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
  4. Spark官方调优文档翻译(转载)
  5. 四则运算2+psp0
  6. Oracle利用序列实现自动增长列
  7. 微软私有云解决方案_毕马威 AI 工厂携手微软云技术 | 共创人工智能发展,共建创新解决方案...
  8. ddr4服务器内存和普通内存_买主板送DDR4内存!微星日联合大促开幕
  9. 【报告分享】2021年中国新锐品牌增长潜力报告.pdf(附下载链接)
  10. 尴尬的风险管理如何深入下去-某公司为例
  11. 手机浏览器和pc浏览器下载文件方法
  12. Spring Framework灰度发布
  13. swiper 切换时间_改变Swiper切换和animate.js动画的时间曲线
  14. 飞秋在同一局域网内刷新不到好友
  15. Linux中的基础I/O
  16. DS1302时钟(电子钟)
  17. 问题:现有12个外形相同的小球,只有其中一个小球质量不同(不能确定较重还是较轻),请用天平找出是哪个小球不同,而且还要找出究竟是轻是重?条件:只能称三次
  18. Zabbix 监控之项目类型-Trapper
  19. 已解决At least Windows 8.1 or Windows Server 2012 are required to install Python 3.9.4(64-bit)
  20. 电商项目之收货地址理解

热门文章

  1. 大数据之-Hadoop源码编译_源码编译的意义---大数据之hadoop工作笔记0044
  2. 大数据之-Hadoop伪分布式_Log日志查看和NN格式化前强调---大数据之hadoop工作笔记0024
  3. Netty工作笔记0032---零拷贝AIO内容梳理
  4. 安卓异常总结---WARNING: Application does not specify an API level requirement!
  5. basler 相机使用出现的问题
  6. Bezier曲线扫盲
  7. poj2349:Arctic Network(最小生成树)
  8. 无人驾驶(pid算法)
  9. win32开发(鼠标)
  10. java复选框如何显示在文本雨_java – 在复选框的itemStatechanged事件上显示文本字段...