网页A和B都在同一个域里(不同的IIS服务器),网页B通过iframe嵌套在了网页A中。2个网站都是只有Windows认证登录。现在的问题是:如果外网的用户登录网页A,会弹出2次登录对话框(A和B),请问怎样让B网页用同一个用户自动登录呢?(登录A之后)我做了一些研究,发现实现这个功能非常难:
由于网页B是用JAVA写的,不可以改写,所以一切都只能在网站A这里完成;我想到的办法是:在网页A调用网页B之前,先做一个Request,附上用户名/密码(这个可以得到),然后等A调用B的时候就不会再问密码了(Session了)?
或者A不直接调用B,而是调用一个“中转”页面,然后自动认证?
不过不知道怎样写代码,请大家给些意见,最好能附有代码。非常感谢!

解决方案 »

  1.   

    以前做过类似的,如果没有验证码的比较好解决,自动获取当前用户的账户信息填写到B的登录页面中,然后调用js来submit()模拟登录就可以了。
      

  2.   

    没有验证码!请问如何自动获取当前用户的账户信息填写到B的登录页面中,然后调用js来submit()模拟登录???请注意B使用的是Windows验证登录。
      

  3.   


    注意,1楼所说的是form验证的方式.windows验证的情况下你的需求没办法实现,除非你自己开发一个浏览器,而不是用IE
      

  4.   

    我认为肯定有办法做到!因为如果访问了B一次,那么B的其他网页也可以不用认证就可以访问了,说明B支持Session.那如果A在后台先登录B一次,在调用B的时候就不会有认证窗口了。
    我说了A里面什么都可以提供(当前用户名,密码,域名,),只需要自动登录B就可以。
      

  5.   


    请你不要把"Windows集成认证"和Session混为一谈,前者是Windows系统提供的验证方式,后者是ASP.NET自己的实现,你说凭什么Windows的验证方式要在乎ASP.NET?你要知道,Windows集成认证不仅仅使用在访问网站的时候,比如访问SQL Server也可以用Windows认证,难道你说SQL Server里面也有一个ASP.NET的Session?再给你讲深入一点,Windows集成认证的过程中,客户端需要先从DC(域控制器)得到一个ticket,然后
    重新把这个ticket传到web服务器,而这个ticket包含了你所访问的机器名字,比如:"http/A.domain.com",所以后面当你再访问机器A的页面的时候,客户端继续发送这个ticket就可以了,而不用弹出登陆框。那么,当你需要再去访问B机器的时候,客户端可以尝试发送之前的ticket,但是B机器又如何认得这个ticket?就好比你去看电影,拿着A电影院的票子怎么可能进到B影院?虽然票价一样!如果你确实找到了能够实现你的需求的方法,那么恭喜你,微软在向你招手。
      

  6.   

    如果你用的是正版windows,你可以联系微软的技术支持:
    http://support.microsoft.com/gp/phonelist#online//看看你的问题是否能解决。
      

  7.   

    如果常规的方法不可以,是不是可以通过XMLHTTPRequest的传递WWW-Authenticate header的方法来做呢?
    网页B支持Windows Authentication和Basic Authentication;
    网页A里可以得到当前用户的用户名和密码。
      

  8.   

    实际上这个问题也可以简化成:点击一个按钮(有用户信息),自动登录到一个Windows 集成认证的网页。不可以实现么?
      

  9.   

    给你换个思路来实现吧。
    1. 在网页A的iframe里面嵌入的不是网页B,而是网站A上的另外一个页面,假设为a1.aspx
    2. 在这个a1.aspx页面里面只实现Page_Load方法,以下是示例代码
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Net" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">    protected void Page_Load(object sender, EventArgs e)
        {
            WebRequest request = WebRequest.Create("http://serverB.domain.com/b.aspx");
            request.Method = "GET";
            request.Timeout = System.Threading.Timeout.Infinite;        request.Credentials = new NetworkCredential("username", "password", "domain.com");        StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
            string responseText = responseReader.ReadToEnd();        Response.Write(responseText);
        }
    </script>
      

  10.   

    可以用activex控件解决啊,这是最好的解决方法,调用api即可啊,这里只说说思路
      

  11.   

    archu,太感谢了,这个功能实现了把B网页的咚咚"下载"到A网页中,
    但是所有的相对路径的咚咚都不能下载,相对路径的链接也无效。请问有没有办法解决这个问题?因为我们已经给出了request.Credentials = new NetworkCredential("username", "password", "domain.com");
    能否就直接跳到b.aspx而不用认证呢?
    我测试了Response.Redirect("http://serverB.domain.com/b.aspx");
    结果还是问我用户名/密码。
      

  12.   

    wan766405890,请给出实例或者连接,可以吗?
      

  13.   


    实在是没有办法了,除非你把request.Credentials = new NetworkCredential("username", "password", "domain.com");
    这样的依据从IE发出去。就像wan766405890所说用ActiveX应该是能实现,因为这就相当于你自己做了个IE,只是编程简化了一些而已。