第一篇:单点登录实现方案心得
单点登录实现方案心得
一、引言
至于什么是单点登录,举个例子,如果你登录了msn messenger,访问hotmail邮件就不用在此登录。
一般单点登录都需要有一个独立的登录站点,一般具有独立的域名,专门的进行注册,登录,注销等操作
我们为了讨论方便,把这个登录站点叫做站点P,设其Url为http://passport.abc.com,需要提供服务的站点设为A和B,跨站点单点登录是指你在A网站进行登录后,使用B网站的服务就不需要再登录
从技术角度讲单点登录分为: 跨子域单点登录 完全跨单点域登录
二、跨子域单点登录
所谓跨子域登录,A,B站点和P站点位于同一个域下面,比如A站点为http://blog.yizhu2000.com B站点为 http://forum.abc.com,他们和登录站点P的关系可以看到,都是属于同一个父域,yizhu2000.com,不同的是子域不同,一个为blog,一个为forum,一个是passport 我们先看看最常用的非跨站点普通登录的情况,一般登录验证通过后,一般会将你的用户名和一些用户信息,通过某一密钥进行加密,写在本地,也就是一个加密的cookie,我们把这个cookie叫做--票(ticket)。
需要判断用户是否登录的页面,需要读取这个ticket,并从其中解密出用户信息,如果ticket不存在,或者无法解密,意味着用户没有登录,或 者登录信息不正确,这时就要跳转到登录页面进行登录,在这里加密的作用有两个,一是防止用户信息被不怀好意者看到,二是保证ticket不会被伪造,后者 其实更为重要,加密后,各个应用需要采用与加密同样的密钥进行解密,如果不知道密钥,就不能伪造出ticket,(注:加密和解密的密钥有可能不同,取决于采用什么加密算法,如果是对称加密,则为同一密钥,如果是非对称,就不同了,一般用私钥加密,公钥解密,但是无论怎样,密钥都只有内部知道,这样伪造者既无法伪造也无法解密ticket)跨子域的单点登录,和上述普通登录的过程没有什么不同,唯一不同的是写cookie时,由于登录站点P和应用A处于不同的子域,P站写入的 cookie的域为passport.yizhu2000.net,而A站点为forum.yizhu2000.net,A在判断用户登录时无法读到P站 点的ticket 解决方法非常简单,当Login完成后P站点写ticket的时候,只需把cookie的域设为他们共同的父域,yizhu2000.net就可以了:cookie.domain=“yizhu2000.net”,A站点自然就可以读到这个ticket了 ASP。Net的form验证本身实现了这个机制,大家可以参考http://blog.csdn.net/octverve/archive/2007/09/22/1796338.aspx ASP.NET身份验证信息跨域共享状态
在ASP.NET 2.0 中只需修改web.config文件即可,修改方法如下:
domain指定了cookie保存的域,只要保存的是 abc.com形式或者.abc.com的形式,那么其二级域名都可以共享此cookie。
此外,web.config标签中的
三、完全跨单点域登录
完全跨域登录,是指A,B站点和P站点没有共同的父域,比如A站点为forum.yizhu1999.net,B站点为blog.yizhu1998.net,大家可以参考微软旗下的几个站点,这两个站点就没有共同的父域,而仍然可以共用登录,怎样才能实现呢?请参考下图,由于这种情况ticket比较复杂,我们暂时把P站点创建的的ticket叫做P-ticket,而A站点创建的ticket叫A-ticket,B的为B-ticket
由于站点A(forum.yizhu1999.com)不能读取到由站点P(passport.yizhu2000.com)创建的加密 ticket,所以当用户访问A站点上需要登录才能访问的资源时,A站点会首先查看是否有A-ticket,如果没有,证明用户没有在A站点登录过,不过 并不保证用户没有在B站点登录,(重复一下,既然是单点登录,当然无论你在A,B任意一个站点登录过,另外一个站点都要可以访问),请求会被重定向到p站 点的验证页面,验证页面读取P-ticket,如果没有,或者解密不成功,就需要重定向登录页面,登录页面完成登录后,写一个加密cookie,也就是 P-ticket,并且重定向到A站点的登录处理页,并把加密的用户信息作为参数传递给这个页面,这个页面接收登录页的用户信息,解密后也要写一个 cookie,也就是A-ticket,今后用户再次访问A站点上需要登录权限才能访问的资源时,只需要检查这个A-cookie是否存在就可以了 当用户访问B站点时,会重复上面的过程,监测到没有B-ticket,就会重定向到P站点的验证页面,去检查P-ticket,如果没有,就登录,有则返回B的登录处理页面写B-ticket
注销的时候需要删除P-ticket和A-ticket
怎么删除cookie:本来以为这个不是问题,不过还是有朋友问道,简单的说其实是创建一个和你要删除的cookie同名的cookie,并把 cookie的expire设为当前时间之前的某个时间,不过在跨子域的删除cookie时有一点要注意:必须要把cookie的域设置为父域,在本文中 为yizhu2000.com 为了保证各个环节的传输的安全性,最好使用https连接
四、总结
第二篇:基于WEB服务单点登录设计与实现
龙源期刊网 http://.cn
基于WEB服务单点登录设计与实现
作者:王 慧
来源:《沿海企业与科技》2006年第04期
[摘 要]文章描述了当前不同的软件服务系统身份认证管理、授权管理存在的问题,同时介绍了单点登录SingleSignOn(SSO)在这方面的解决方法与应用;并且结合Web Service提供一个简单的单点登录技术的实现,对其关键部分的开发思想进行了详细说明。
[关键词]SSO;AD;WebService;Net
[中图分类号]F270.7
[文献标识码]A
第三篇:使用SQL语句实现用户登录
使用SQL语句实现用户登录
5、在DA.cs类文件中添加如下代码
///
/// 验证顾客登陆
///
///
查询语句
///
public DataSet CustomerLogin(string SqlStr)
{
SqlCommand comm = new SqlCommand(SqlStr, conn);
SqlDataAdapter adapter = new SqlDataAdapter(comm);
DataSet DBSet = new DataSet();
conn.Open();
adapter.Fill(DBSet);
comm.Dispose();
conn.Close();
return DBSet;
}
6、将用户登录功能代码改为:
string Customername = TextBox3.Text;
string Customerpwd =
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox4.Text, “MD5”);
string Sqlstring = “select * from test where uname='” + Customername + “'and upwd='” + Customerpwd + “'”;
DA mydata=new DA();
DataSet ds = mydata.CustomerLogin(Sqlstring);
if(ds.Tables[0].Rows.Count == 0)
{
Response.Write(“”);
}
else
{
//Response.Write(“”);string scriptString =common.RegScript(“登录成功!”);
Response.Write(scriptString);
}
第四篇:用struts2实现session权限检查同时控制用户重复登录
用struts2实现session权限检查同时控制用户重复登录
1.需要struts2的jar包 2.web.xml
3.Struts.xml
”-//Apache Software Foundation//DTD Struts Configuration 2.0//EN“
”http://struts.apache.org/dtds/struts-2.0.dtd“>
/> class=”com.luosoy.SessionControl.SessionFilter“> 4.jsp界面(1)login.Jsp <%@ page language=”java“ contentType=”text/html;charset=UTF-8“ pageEncoding=”UTF-8“%> <%@taglib prefix=”s“ uri=”/struts-tags“ %> <% %>
