网页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,而是调用一个“中转”页面,然后自动认证?
不过不知道怎样写代码,请大家给些意见,最好能附有代码。非常感谢!
由于网页B是用JAVA写的,不可以改写,所以一切都只能在网站A这里完成;我想到的办法是:在网页A调用网页B之前,先做一个Request,附上用户名/密码(这个可以得到),然后等A调用B的时候就不会再问密码了(Session了)?
或者A不直接调用B,而是调用一个“中转”页面,然后自动认证?
不过不知道怎样写代码,请大家给些意见,最好能附有代码。非常感谢!
注意,1楼所说的是form验证的方式.windows验证的情况下你的需求没办法实现,除非你自己开发一个浏览器,而不是用IE
我说了A里面什么都可以提供(当前用户名,密码,域名,),只需要自动登录B就可以。
请你不要把"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影院?虽然票价一样!如果你确实找到了能够实现你的需求的方法,那么恭喜你,微软在向你招手。
http://support.microsoft.com/gp/phonelist#online//看看你的问题是否能解决。
网页B支持Windows Authentication和Basic Authentication;
网页A里可以得到当前用户的用户名和密码。
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>
但是所有的相对路径的咚咚都不能下载,相对路径的链接也无效。请问有没有办法解决这个问题?因为我们已经给出了request.Credentials = new NetworkCredential("username", "password", "domain.com");
能否就直接跳到b.aspx而不用认证呢?
我测试了Response.Redirect("http://serverB.domain.com/b.aspx");
结果还是问我用户名/密码。
实在是没有办法了,除非你把request.Credentials = new NetworkCredential("username", "password", "domain.com");
这样的依据从IE发出去。就像wan766405890所说用ActiveX应该是能实现,因为这就相当于你自己做了个IE,只是编程简化了一些而已。