FormsAuthentication实现单点登录_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > FormsAuthentication实现单点登录

FormsAuthentication实现单点登录

 2014/8/13 15:22:23  wlm2014  程序员俱乐部  我要评论(0)
  • 摘要:原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000单点登录,这种在网络非常常见,在这里讨论的是实现同一主域下的子站间的单点登录,同样也适用于使用负载均衡后站点的登录识别。.net,讨论基于MVC环境下的,假设域名为wlm.so。基础条件:1.cookie共享2.FormsAuthentication加密3.服务器端处理还是一样,从原理开始:原理非常简单,所有登录后,将用户的标识放在客户端的cookie里面,通过cookie共享
  • 标签:for 实现 单点登录

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

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

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

class="Apple-tab-span"> 基础条件:

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"/>

 

发表评论
用户名: 匿名