FormsAuthentication实现单点登录
原文地址: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实现单点登录的更多相关文章
- 【CAS单点登录视频教程】 第06集【完】 -- Cas认证 学习 票据认证FormsAuthentication
目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...
- 偷懒小工具 - SSO单点登录通用类(可跨域)
写在前面的话 上次发布过一篇同样标题的文章.但是因为跨域方面做得不太理想.我进行了修改,并重新分享给大家. 如果这篇文章对您有所帮助,请您点击一下推荐.以便有动力分享出更多的"偷懒小工具&q ...
- 使用WIF实现单点登录Part III —— 正式实战
我们接下来的demo将包括以下的工程: SiteA —— 基于.net framework 4.5的MVC 4程序,使用WIF 4.5的SDK,第一个RP SiteB —— 基于.net framew ...
- 使用WIF实现单点登录Part III —— 正式实战 -摘自网络
经过前两篇文章,估计大家对WIF已经有比较充分的认识了,估计大家在经过了枯燥的理论以后,肯定是摩拳擦掌赶紧付诸于行动了.没办法,咱们程序员就是这个毛病.那好吧,我也不那么多废话了,直接进入正题吧. 我 ...
- 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络
上个月有一个星期的时间都在研究asp.net mvc统一身份验证及单点登录的实现.经过了一番的探索,最终决定使用微软的Windows Identity Foundation.但是这东西用的人貌似不多, ...
- asp.net 真正实现完全跨域单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. asp.ne ...
- .NET 单点登录
<appSettings> <!--是否启用单点登录接口--> <add key="IsStartCas" value="f ...
- 基于CAS在.NET中实现SSO单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 单点登录原理 ...
- 【CAS单点登录视频教程】 第05集 -- CAS服务器安装
第一步: 下载cas 服务器 cas-server-3.5.2-release.zip 目录 ----------------------------------------- [CAS单点登录视频教 ...
随机推荐
- 浏览器内核-Webkit
关键字:浏览器内核,浏览器引擎,Browser,Webkit,Blink,Chromium. 本文简单介绍一下各种浏览器内核.着种介绍一下Webkit.顾名思义,浏览器内核就是浏览器的核心部分,也可以 ...
- JavaScript之this,new,delete,call,apply
OS:Window 8.1 关键字:JavaScript,HTML,this,new,delete,call,apply. 1.this 一般而言,在Javascript中,this指向函数执行时的当 ...
- 转 在无法通过yum下载非标准包时,怎么办
在CentOS下,我们可以通过yum来下载或更新rpm包,但是标准的源(repository)里只提供一部分的rpm包,虽然大部分情况下,这些包是够用的.但是有时候还是需要下载其他的一些非标准的包,如 ...
- splObjectStroge的作用,实例化一个数组
PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...
- easy ui 菜单和按钮(Menu and Button)
http://www.zi-han.net/case/easyui/menu&button.html
- 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- 2338: [HNOI2011]数矩形 - BZOJ
因为已经看了一眼题解,知道是算中点和长度,相同时构成一个矩形,所以就把所有的线段算出来,然后排序,相同的就更新答案 为了避免误差,我们都用整数存,中点直接相加就行了,没必要除2,长度也只要平方就行了, ...
- 对jQuery.isArray方法的分析
jQuery.isArray方法应于判断是不是数组,是的话返回true,否则返回false.调用如:jQuery.isArray([]),返回true.其实现源码如下: isArray: Array. ...
- uva 10105
数学 杨辉三角 多项式系数 #include <cstdio> int f[13] = {1}; void init() { for (int i = 1; i < 13; i+ ...
- ubuntu 和 win7 远程登陆 + vnc登陆
ubuntu 和 win7 远程登陆: 第一种(通过win7自带的远程桌面来连接ubuntu) 1. windows7配置 我的电脑->属性->远程设置.-----允许远程连接 2. ub ...