我要做一个跨网站注册通行证程序。偶参考了国内各大网站,大多都是生成2个COOKIES来实现用户登陆与注销退的。
======================================================================================
c#                 为什么这样写不能生成如Cookies:[email protected] 的cookies文件?
      
 而不加cookie.Domain="login.x77.com"; 这一句的话,就能生成如下图的cookies文件:   图片地址: http://www.stqq.net/02.jpgHttpCookie cookie=Response.Cookies["danislogin"];
cookie.Domain="login.x77.com";                        //请问我错在哪里?
cookie["danisuser"]=userid.Text;
cookie.Expires=DateTime.Now.AddDays(10);
Response.Cookies.Add(cookie);========================================================
现在的问题是,如何生成指定域名的COOKIES文件? 并在另一网站下调用他们?

解决方案 »

  1.   

    跨网站用cookie不安全,你可以参考微软的passport或者WebService
      

  2.   

    啊,老大,微软的那个passport好象太复杂了呀,在csdn看过,那个网页都是英文的,看不明白,我是菜鸟,短时间内可能搞不明白,现在很急呀,如果做不出来就要被老板炒了,我只觉得用cookie容易一些,就不考虑安全问题了,请教高人救命呀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     HELP!!!
      

  3.   

    还真没注意生成的COOKIE文件
    Domain不行的话cookie["danisuser"].path可不可以呢?
      

  4.   

    一般来说,每个网站的COOKIE都有唯一标识的,两个相同名字的COOKIE在不同网站里都可以唯一区分出来,因此,你这样做是很难实现的,逻辑上也不主张
      

  5.   

    假如随便可以这么做的话,一个服务器可以随便生成发回另一个服务器的COOKIE,那
    不乱了套了?这隐私团体第一个就不放过你啊参考单一登陆(Single Sign-on)问题 
    http://blog.joycode.com/saucer/archive/2004/02/25/13789.aspx
      

  6.   

    谢谢思归老大帮助!看了一下,不是很明白,(英文能力不高@_@),安装了 passport之后就不知怎么做了,能不能给一个成功过的例子呀?思归老大
      

  7.   

    在ASP.NET中每一个Web页都衍生自System.Web.UI.Page类。Page类集合了HttpSession对象的一个实例用于处理对话数据。在本例中,叫做SessionPage的自定义Page类来衍生自System.Web.UI.Page,提供了类似Page类的所有特性。唯一的区别是默认的HttpSession使用自定义的对话对象重载了(对实例变量使用new修改符,C#允许衍生的类隐藏基类的成员)。 
    public class SessionPage : System.Web.UI.Page 

     ... 
     public new mySession Session = null; 
     ... 
    }    自定义的对话类使用HybridDictionary对象来相应保存内存中的对话状态(HybridDictionary可用于处理任意数量的对话元素)。为了与传统的ASP通用,该自定义对话对象将限制对话数据类型为字符串型(默认的HttpSession允许对话保存任意类型的数据,不能与传统的ASP通用)。 
    [Serializable] 
    public class mySession  

     private HybridDictionary dic = new HybridDictionary();  public mySession() 
     { 
     }  public string this [string name] 
     { 
      get 
      { 
       return (string)dic[name.ToLower()]; 
      } 
      set 
      { 
       dic[name.ToLower()] = value; 
      } 
     } 
    }  
        Page类为定制暴露了不同的事件和方法。特别是OnInit方法用于设置Page对象的初始化状态。如果请求不包含名为mySession的Cookie,将为请求者产生一个新的mySession Cookie。另外,对话数据将使用自定义数据访问对象SessionPersistence从SQL Server中检索出来。DSN和SessionExpiration的值从web.config中检索。 
    override protected void OnInit(EventArgs e) 

     InitializeComponent(); 
     base.OnInit(e); 

    private void InitializeComponent() 
    {  
     cookie = this.Request.Cookies[sessionPersistence.SessionID];  if (cookie == null) 
     { 
      Session = new mySession(); 
      CreateNewSessionCookie(); 
      IsNewSession = true; 
     } 
     else 
      Session = sessionPersistence.LoadSession( 
        Server.UrlDecode(cookie.Value).ToLower().Trim(),  
        dsn,  
        SessionExpiration 
       );   this.Unload += new EventHandler(this.PersistSession); 

    private void CreateNewSessionCookie() 

     cookie = new HttpCookie(sessionPersistence.SessionID,  
     sessionPersistence.GenerateKey()); 
     this.Response.Cookies.Add(cookie); 

        SessionPersistence类使用微软.NET框架组件的BinaryFormatter来串行化和并行化对话状态为二进制格式以提供最佳性能。结果的二进制对话数据接着作为图象字段类型被存入SQL Server。 
    public mySession LoadSession(string key, string dsn,  
    int SessionExpiration) 

     SqlConnection conn = new SqlConnection(dsn); 
     SqlCommand LoadCmd = new SqlCommand(); 
     LoadCmd.CommandText = command; 
     LoadCmd.Connection = conn; 
     SqlDataReader reader = null; 
     mySession Session = null;  try 
     { 
      LoadCmd.Parameters.Add("@ID", new Guid(key)); 
      conn.Open(); 
      reader = LoadCmd.ExecuteReader(); 
      if (reader.Read()) 
      { 
       DateTime LastAccessed =reader.GetDateTime(1).AddMinutes(SessionExpiration); 
       if (LastAccessed >= DateTime.Now) 
        Session = Deserialize((Byte[])reader["Data"]); 
      } 
     } 
     finally 
     { 
      if (reader != null) 
       reader.Close(); 
      if (conn != null) 
       conn.Close(); 
     }  return Session; 

    private mySession Deserialize(Byte[] state) 

     if (state == null) return null;  mySession Session = null; 
     Stream stream = null;  try 
     { 
      stream = new MemoryStream(); 
      stream.Write(state, 0, state.Length); 
      stream.Position = 0; 
      IFormatter formatter = new BinaryFormatter(); 
      Session = (mySession)formatter.Deserialize(stream); 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 
     return Session; 

      
      

  8.   


      在请求的末尾,Page类的Unload事件被启动了,一个同Unload事件一起注册的事件处理方法将串行化对话数据为二进制格式并将结果二进制数据存入SQL Server。 
    private void PersistSession(Object obj, System.EventArgs arg) 
    { sessionPersistence.SaveSession( 
      Server.UrlDecode(cookie.Value).ToLower().Trim(), dsn, Session, IsNewSession); 

    public void SaveSession(string key, string dsn,  
    mySession Session, bool IsNewSession) 

     SqlConnection conn = new SqlConnection(dsn); 
     SqlCommand SaveCmd = new SqlCommand();  
     SaveCmd.Connection = conn;  try 
     { 
      if (IsNewSession) 
       SaveCmd.CommandText = InsertStatement; 
      else 
       SaveCmd.CommandText = UpdateStatement;   SaveCmd.Parameters.Add("@ID", new Guid(key)); 
      SaveCmd.Parameters.Add("@Data", Serialize(Session)); 
      SaveCmd.Parameters.Add("@LastAccessed", DateTime.Now.ToString());   conn.Open(); 
      SaveCmd.ExecuteNonQuery(); 
     } 
     finally 
     { 
      if (conn != null) 
       conn.Close(); 
     } 

    private Byte[] Serialize(mySession Session) 

     if (Session == null) return null;  Stream stream = null; 
     Byte[] state = null;  try 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      stream = new MemoryStream(); 
      formatter.Serialize(stream, Session); 
      state = new Byte[stream.Length]; 
      stream.Position = 0; 
      stream.Read(state, 0, (int)stream.Length); 
      stream.Close(); 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 
     return state; 
    }     SessionPage类以及与它相关的类被封装在SessionUtility组件中。在一个新ASP.NET项目中,需要作SessionUtility组件的引用,为了与传统的ASP代码共享对话,每个页面由SessionPage代替Page类衍生出来。一旦移植完成了,新应用程序能通过说明SessionPage类中定义的对话变量切换回使用原来的HttpSession对象来显示基本的HttpSession。 
      

  9.   

    to:goody9807() 
    我对你的代码有兴趣,能否给些有关这方面的知识给我看看,说真的,你的技术太高了,我看不明白你的代码啊
      

  10.   

    假如随便可以这么做的话,一个服务器可以随便生成发回另一个服务器的COOKIE,那
    不乱了套了?这隐私团体第一个就不放过你啊参考单一登陆(Single Sign-on)问题 
    http://blog.joycode.com/saucer/archive/2004/02/25/13789.aspx
      

  11.   

    楼上的老大,你们给的“单一登陆(Single Sign-on)问题 ”这个页面里的连接地址都访问不
    了! 就是devx.com 这些地址都进不了,有没有其它详细资料呢?救命!HELP!!!
    http://www.devx.com/security/Article/17483/0/page/1  进不了!