原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000

单点登录,这种在网络非常常见,在这里讨论的是实现同一主域下的子站间的单点登录,同样也适用于使用负载均衡后站点的登录识别。

.net,讨论基于MVC环境下的,假设域名为 wlm.so。

基础条件:

1.cookie共享

2.FormsAuthentication加密

3.服务器端处理

还是一样,从原理开始:

原理非常简单,所有登录后,将用户的标识放在客户端的cookie里面,通过cookie共享,每次请求服务器端将客户端发送的cookie直接当成标识来识别用户。

这个过程中安全就非常重要了,怎么做到安全呢?

FormsAuthentication认证,FormsAuthenticationTicket票据加密。

1.cookie共享

假设主域为wlm.so,子域为a.wlm.so以及b.wlm.so。

那么在服务器端写入cookie时必须为cookie指定主域。代码如下:

那么当cookie未过期时,打开a.wlm.so或者打开b.wlm.so时该cookie就会相应的被提交。

2.FormsAuthentication加密

假设,我们在cookie写上用户名的话,那将是非常的不安全,因此使用FormsAuthentication验证方式,通过FormsAuthentication创建验证票据,将票据保存在客户端。

首先上代码:

webconfig配置票据代码:

票据创建与写入代码,login.LoginName是登录名,也是用户标识:

通过创建票据后,写入客户端cookie,如果需要记录登录信息,请加上cookie过期时间即可。

通过上述创建的票据将被写在cookie中,访问主域下的二级网站时均会被提交。但是不同IIS该票据加密密钥是不一样的,因此无法识别,需要配置密钥让不同服务器上的IIS都能识别验证票据。

3.FormsAuthentication密钥生成与配置

只需要在webconfig中增加配置即可:

该配置中附带着加密密钥与解密密钥以及加密方式,密钥不是随意生成的,附带生成代码:

点击下载生成代码

4.服务器识别到用户标识后,需要进行session记录,或者其他记录方式即可通过通常代码实现,这里不做讨论。服务器端获取用户登录名如下:

a)判断用户是否已经登录

if(httpContext.User.Identity.IsAuthenticated){

//已经登录

}

b)获取登录名

string name=HttpContext.Current.User.Identity.Name;//即前文中的login.loginName

附上代码:

HttpCookie cookie = new System.Web.HttpCookie("cookiename", "cookievalue");
cookie.Domain = "wlm.so";
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,// 版本号。
u.Id,// 与身份验证票关联的用户名。 
DateTime.Now,// Cookie 的发出时间。
DateTime.Now.AddMinutes(1000),// Cookie 的到期日期。 
login.Persistent != 0,// 如果 Cookie 是持久的,为 true;否则为 false。 
login.LoginName//写入用户名称
);
HttpCookie cookie = 
new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, 
FormsAuthentication.Encrypt(ticket));
cookie.Domain = "wlm.so";
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
return LoginState.Success;

<authentication mode="Forms">
  <forms name="FormsAuthCookie" 
 path="/" loginUrl="~/Login" 
 domain="wlm.so" />
</authentication>
<machineKey validationKey="****" 
decryptionKey="***" 
validation="SHA1"/>

FormsAuthentication实现单点登录的更多相关文章

  1. 【CAS单点登录视频教程】 第06集【完】 -- Cas认证 学习 票据认证FormsAuthentication

    目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...

  2. 偷懒小工具 - SSO单点登录通用类(可跨域)

    写在前面的话 上次发布过一篇同样标题的文章.但是因为跨域方面做得不太理想.我进行了修改,并重新分享给大家. 如果这篇文章对您有所帮助,请您点击一下推荐.以便有动力分享出更多的"偷懒小工具&q ...

  3. 使用WIF实现单点登录Part III —— 正式实战

    我们接下来的demo将包括以下的工程: SiteA —— 基于.net framework 4.5的MVC 4程序,使用WIF 4.5的SDK,第一个RP SiteB —— 基于.net framew ...

  4. 使用WIF实现单点登录Part III —— 正式实战 -摘自网络

    经过前两篇文章,估计大家对WIF已经有比较充分的认识了,估计大家在经过了枯燥的理论以后,肯定是摩拳擦掌赶紧付诸于行动了.没办法,咱们程序员就是这个毛病.那好吧,我也不那么多废话了,直接进入正题吧. 我 ...

  5. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络

    上个月有一个星期的时间都在研究asp.net mvc统一身份验证及单点登录的实现.经过了一番的探索,最终决定使用微软的Windows Identity Foundation.但是这东西用的人貌似不多, ...

  6. asp.net 真正实现完全跨域单点登录

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. asp.ne ...

  7. .NET 单点登录

    <appSettings>     <!--是否启用单点登录接口-->     <add key="IsStartCas" value="f ...

  8. 基于CAS在.NET中实现SSO单点登录

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 单点登录原理 ...

  9. 【CAS单点登录视频教程】 第05集 -- CAS服务器安装

    第一步: 下载cas 服务器 cas-server-3.5.2-release.zip 目录 ----------------------------------------- [CAS单点登录视频教 ...

随机推荐

  1. (转载)SQL语句,纵列转横列

    SQL语句,纵列转横列 Feed: 大富翁笔记 Title: SQL语句,纵列转横列 Author: wzmbox Comments sTable.db库位 货物编号 库存数1 0101 501 01 ...

  2. DB2中循环日期跑数据

    1.数据库版本: 2.具体实现方式: ),)) /*************************************************************************** ...

  3. 遍历字典时用与不用iter的区别

    遍历字典时用与不用iter的区别 遍历字典的时候一般会用这三个方法:keys(),values(),items() 同时,它们各自都有升级版的方法:iterkeys(),itervalues(),it ...

  4. 2016 Multi-University Training Contest 1 GCD RMQ+二分(预处理)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 题意:有N(N <= 100,000),之后有Q(Q <= 100,000)个区间查询[ ...

  5. hdu 3518 Boring counting 后缀数组LCP

    题目链接 题意:给定长度为n(n <= 1000)的只含小写字母的字符串,问字符串子串不重叠出现最少两次的不同子串个数; input: aaaa ababcabb aaaaaa # output ...

  6. Java类加载器加载类顺序

    java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执 行,.class字节码文 ...

  7. (转载)Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  8. 【BZOJ 1934】 [Shoi2007]Vote 善意的投票

    Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可 ...

  9. sql中的inner join, left join, right join的区别

    下面介绍一下 inner join, left join, right join这者之间的区别 现在我假设有A表和B表 left join select * from A a left join B ...

  10. iOS视频压缩存储至本地并上传至服务器-b

    最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下. 这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的. 1.该方法没有对视频进行压缩,只是将视 ...