我现在的一个解决方案,有4个Web应用,我想在4个应用中实现单点登录,也就是Single Sign On。
1、执行了installsqlstate.sql,修改了Web.Config,但每次重新开机,都提示如下:
    “拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 SELECT 权限。拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 SELECT 权限。拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 INSERT 权限。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 ”
    于是每次都得给ASPStateTempApplications这个数据库加上IIS_WPG这个用户。
    Web.Config的内容如下:
    <sessionState 
            mode="SQLServer"
            sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI;"
            cookieless="false" 
            timeout="20" 
    />2、加好权限后,我以为各个Web应用即可共享Session,在Web应用1中有如下代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Session["User"]="ABC";
}
一个按钮,点击后进入Web应用2。
private void Button2_Click(object sender, System.EventArgs e)
{
Response.Redirect("/webapplication2/default.aspx");
}
在Web应用2中,想读取Web1里的Session数据,代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Response.Write(Session["User"].ToString());
}
可是会出现以下错误:
未将对象引用设置到对象的实例。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
行 20:  {
行 21:  // 在此处放置用户代码以初始化页面
行 22:  Response.Write(Session["User"].ToString());把行22改成:Response.Write(Session.Count);执行正常,但显示0。也就是无法读取Web1里的Session。
 

解决方案 »

  1.   

    因为此时Session["User"]为null你用ToString()方法转化是错误的。
    应该先判断一下Session["User"]是否为空。
      

  2.   

    'ASPStateTempApplications',提示的意思是说这个帐号没有读取数据库的权限..把数据库的用户添加一个'ASPStateTempApplications'看一下..另外,即便是每个服务器都把session自动保存到数据库,并不代表,服务器之间的session会共享,你这样做的配置只是单单把session保存在数据库中!!各个服务器都有自己有的域..而session是不能跨域的...如果要实现session的跨域访问,可以参考思归的帖子..http://blog.joycode.com/saucer/archive/2004/02/25/13789.aspx
      

  3.   

    Session不能跨应用程序.用Cache取代.1.Session和Cache都是存储在服务端
    2.用Session,用户之间不会知道其Identify(用户唯一标志),Cache是共享的,
      只要知道另一个用户Identify,就可以读取数据
    3.实现不同用户之间的存储信息,用Session,直接设个常量存取就可以啦,
      比如: Session["UserID"]=xxxx;
      但是用Cache,必须得为每个用户生成一个Identify,是这样存储的
            Cache[Identify] = xxx;  //因为Cache是所有用户共享变量,所以得区分开各个用户4.Session在应用程序之间很难实现共享,Cache可以容易实现共享
      

  4.   

    bingbingcha(不思不归,不孟不E,原来是头大灰狼):
    我每次都添加IIS_WPG用户,可关机后又消失了。是不是tempdb不能保存用户的修改啊?
    我是单服务器,所有的应用、数据库等都在一个机器上,也不行吗?
      

  5.   

    ChengKing(bantamweight) :cache不会,正在学习中...
      

  6.   

    http://blog.csdn.net/lovelxj/archive/2005/07/18/427769.aspx施主  可以看看、
      

  7.   

    如果我想在另一个应用里读取数据库里的Session,可以吗?
      

  8.   

    如果我想在另一个应用里读取数据库里的Session,可以吗?可以的..但是你这样做很容易产生Session混乱的..而且你添加Session的时候还需要验证数据库中是否存在同名的Session...等于说,就是类似会员登陆获取信息那样的功能了..这样就达不到快速存储的目的..很影响性能的..我的建议还是使用Cookie..只要你的四个应用程序是在同一域名下就可以共享cookie...如果你是四个不同的站点.则需要做单点登陆设置...思路就是我上面帖子里的办法..
      

  9.   

    不是说用cookie容易被窃取和篡改吗?